prostokąt wychodzi poza formę

0

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

0

Nie za bardzo mam na to rozwiązanie innego pomysłu jak rysować na ScrollBoxie z dodanym Canvasem.

0

TImage na ScrollBoxie ?

Tworzysz BMP, po skonczeniu kopiujesz Canvase i bedzie dzialac.

0

a mogę prosić o trochę bardziej szczegółowe objaćnienie tematu??

0

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.

0

Ł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(...)

0

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ę.

0

ok już działa wielkie dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1