Çizim Componentleri Hakkında

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
mustafa_90
Üye
Mesajlar: 15
Kayıt: 03 Eki 2008 12:45

Çizim Componentleri Hakkında

Mesaj gönderen mustafa_90 »

Merhaba;
Bir çizim componenti yapayım dedim ama bir yerde takıldım. Mesela ben objeleri seçebilmek için bir selectbox çizdiriyorum ama bu çizimi yaparken yavaşlık oluyor. Bir kaç komponent inceledim ama çok karışık ve nasıl bir mantık kullanmışlar anlayamadım. Buyrun yaptığım component. Neden seçerken yavaşlıyor anlamış değilim : :( .
Aslında sevebi mousemove içinde paint procedurunu tekrar çağırmamdan kaynaklı. Ama bu procedure yi çağırmaz isem selectbox karışacak. invalidate ve repaint procedure lerinide çağırdım ama işe yaramadı.

Kod: Tümünü seç

unit Diagram;

interface

uses
  Classes, Controls, Graphics;

type TPLCCustomDiagram = class(TCustomControl)
  private
    FDrawBuffer:      TBitmap;
    FSelectBoxBuffer: TBitmap;
    FUseSelectBox:    Boolean;
    FMouseDown:       Boolean;
    FSelecting:       Boolean;
    FSelectBoxStartX: integer;
    FSelectBoxStartY: integer;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure DrawSelectBox(X, Y: integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
  published
    property SelectBox: Boolean Read FUseSelectBox Write FUseSelectBox;
end;

implementation

constructor TPLCCustomDiagram.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDrawBuffer      := TBitmap.Create;
  FSelectBoxBuffer := TBitmap.Create;
  FUseSelectBox    := True;
  FSelecting       := False;


end;

destructor TPLCCustomDiagram.Destroy;
begin
  FSelectBoxBuffer.Free;

  inherited Destroy;
end;

procedure TPLCCustomDiagram.Paint;
begin
  FDrawBuffer.Width:=Width;
  FDrawBuffer.Height:=Height;
  FDrawBuffer.Canvas.Pen.Style:=psSolid;
  FDrawBuffer.Canvas.Rectangle(0, 0, Width, Height);
  Canvas.Draw(0, 0, FDrawBuffer);
end;

procedure TPLCCustomDiagram.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
  FMouseDown := True;
end;

procedure TPLCCustomDiagram.MouseMove(Shift: TShiftState; X: Integer; Y: Integer);
begin
  if(FMouseDown)then begin
    DrawSelectBox(X, Y);
  end;
end;

procedure TPLCCustomDiagram.MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
  FSelecting := False;
  FMouseDown := False;
end;

procedure TPLCCustomDiagram.DrawSelectBox(X, Y: integer);
var
  TempX, TempY: integer;
begin
    if(not FSelecting)then begin
      FSelecting := True;
      FSelectBoxStartX := X;
      FSelectBoxStartY := Y;
      Canvas.Brush.Style:=bsClear;
      Canvas.Pen.Style:=psDashDot;
    end;
    Paint;
    FSelectBoxBuffer.Canvas.Pen.Style:=psDashDot;
    if(X-FSelectBoxStartX < 0) then
      FSelectBoxBuffer.Width:=abs(X-FSelectBoxStartX)
    else
     FSelectBoxBuffer.Width:=X-FSelectBoxStartX;

    if(Y-FSelectBoxStartY < 0) then
      FSelectBoxBuffer.Height:=abs(Y-FSelectBoxStartY)
    else
      FSelectBoxBuffer.Height:=Y-FSelectBoxStartY;

    FSelectBoxBuffer.Canvas.Rectangle(0, 0, abs(X-FSelectBoxStartX), abs(Y-FSelectBoxStartY));

    if(FSelectBoxStartX > X)then
      TempX := X
    else
      TempX := FSelectBoxStartX;

    if(FSelectBoxStartY > Y)then
      TempY := Y
    else
      TempY := FSelectBoxStartY;

    Canvas.Draw(TempX, TempY, FSelectBoxBuffer);
end;
end.
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Re: Çizim Componentleri Hakkında

Mesaj gönderen ibrahimcoban »

Her mousemove event de tekrar çizim yapıyorsun. Bu çok gereksiz.
Bunun yerine direkt canvasa çizim yap bir önce çizim yaptığın yeri pen nin xor la ve mouse bırakınca tekrar çiz.
http://ibrahimcoban.com/
Lazarus, Kol-Ce,Delphi ve C#
mustafa_90
Üye
Mesajlar: 15
Kayıt: 03 Eki 2008 12:45

Re: Çizim Componentleri Hakkında

Mesaj gönderen mustafa_90 »

Çok teşekkür ederim. Böyle bir özelliği olduğunu bilmiyordum :)
Cevapla