Witam mam taki problem że rysuje wielki prostokąt który wychodzi poza formę, jak zrobić żebym mógł przesuwać scrollbar-em by zobaczyć jego końce? (opcja form1.autoscroll:=true nie działa)
z góry dzięki za pomoc
Witam mam taki problem że rysuje wielki prostokąt który wychodzi poza formę, jak zrobić żebym mógł przesuwać scrollbar-em by zobaczyć jego końce? (opcja form1.autoscroll:=true nie działa)
z góry dzięki za pomoc
Nie za bardzo mam na to rozwiązanie innego pomysłu jak rysować na ScrollBoxie z dodanym Canvasem.
TImage na ScrollBoxie ?
Tworzysz BMP, po skonczeniu kopiujesz Canvase i bedzie dzialac.
a mogę prosić o trochę bardziej szczegółowe objaćnienie tematu??
A czego nie rozumiesz, przecież wszysko zostało napisane.
unit canvasedscrollbox;
interface
uses
Windows, Messages, Classes, Controls, Forms, Graphics;
type
TCanvasedScrollBox = class(TScrollBox)
private
FBmp: TBitmap;
FCanvas: TCanvas;
procedure SetBitmap(Value: TBitmap);
protected
procedure WMPaint(var Message: TMessage); message WM_PAINT;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Bitmap: TBitmap read FBmp write SetBitmap;
property Canvas: TCanvas read FCanvas;
end;
procedure Register;
implementation
constructor TCanvasedScrollBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csSetCaption, csDoubleClicks];
Width := 185;
Height := 41;
BorderStyle := bsSingle;
FBmp := TBitmap.Create;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TCanvasedScrollBox.Destroy;
begin
FBmp.Free;
FCanvas.Free;
inherited Destroy;
end;
procedure TCanvasedScrollBox.SetBitmap(Value: TBitmap);
begin
FBmp.Assign(Value);
SendMessage(Handle, WM_PAINT, 0, 0);
end;
procedure TCanvasedScrollBox.WMPaint(var Message: TMessage);
begin
if Assigned(FBmp) then
Canvas.Draw(0, 0, FBmp);
inherited;
end;
procedure Register;
begin
RegisterComponents('Samples', [TCanvasedScrollBox]);
end;
end.
Tworzysz sobie taki komponent dynamicznie albo instalujesz i doda się Tobie do zakładki Samples. To jest po
prostu taki sam komponent jak ScrollBox, tylko że ma własność Bitmap typu TBitmap, na której rysujesz tak
jak Tobie pokazałem powyżej, a później dajesz TwojScrollBoxZCanvasem.Bitmap := Bmp; no i masz rysunek.
Ładujesz ScrollBoxa na AllClient, do środka TImage na AlClient.
Tworzysz zmienna typu TBitmap (popatrz w necie, bo kody mam tylko do CBuildera).
Po namalowaniu prostokatow kopiujesz canvas zmiennej bitmapowej na Canvasa TImage uzywajac
Image.Canvas.CopyRect(...)
No faktycznie - tego w swoim komponencie nie przewidziałem, bo służył mi do rysowania tylko po nim, a co
do jego rozmiaru to nie przekraczał wielkością rozmiaru formatki. A więc skorzystaj może z rozwiązania od
maciejamt, bo z tego co widzę ScrollBox pokaże strzałki do przewijania tylko jeżeli wizualny komponent na
przykład wlaśnie Image przekroczy jego rozmiary. W przypadku Canvasa i samej bitmapy nie reaguje. Kod:
var
Bmp : TBitmap;
Img : TImage;
begin
Bmp := TBitmap.Create;
Bmp.Width := 1000;
Bmp.Height := 1000;
Bmp.Canvas.Brush.Color := clRed;
Bmp.Canvas.FillRect(ClientRect);
Bmp.Canvas.Pen.Color := clBlue;
Bmp.Canvas.Rectangle(10, 10, 100, 100);
Img := TImage.Create(ScrollBox1);
Img.Parent := ScrollBox1;
Img.Picture.Bitmap := Bmp;
Img.AutoSize := True;
Bmp.Free;
end;
U mnie działa ok, przy rozciągnięciu poprzez AutoSize powoduje, że obie strzałki przewijania - pokazują się.
ok już działa wielkie dzięki :)