2012-04-26 97 views
0

我有一個畫布,我想像MS畫圖一樣繪製它。在畫布上繪圖 - 如何檢查鼠標左鍵是否關閉?

我曾嘗試以下方法,但沒有成功:

(1)

Canvas.OnMouseDown

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
     //Draw something (Lets say a rect for example*) 
     Image1.Canvas.Rectangle(x,y,x+4,y+4); 
end; 

(2)

我試圖Canvas.OnMouseDown和Canvas.OnMouseUp組合,如圖所示在從該網站的一個示例:

http://www.delphipages.com/forum/showthread.php?t=142153

(3)

GetAsyncKeyState:

http://msdn.microsoft.com/en-us/library/ms646293%28VS.85%29.aspx檢測鼠標起伏

(4)

Mouse.IsDraging函數。

我仍然無法取得任何成功與上述方法,我已經嘗試過。

每當我想拖動光標並繪製它只是在我第一次點擊的位置放置1個矩形*,我該如何讓它逐步繪製?

+1

爲什麼你會期望它做任何其他的繪圖?您顯示的唯一代碼是當您首次按下鼠標按鈕時繪製單個矩形的位置。 'GetAsyncKeyState'確實會告訴你鼠標按鈕是否關閉。這就是你問的問題的答案。但你問錯了問題。如果你想知道如何用鋼筆畫一個表面,那麼問一下,而不是如何檢測鼠標按鈕是否被按下,因爲只知道你顯然沒有得到你想要的東西。 – 2012-04-27 15:25:36

+0

Rob是對的,問題標題沒有描述你寫的實際問題。您應該更具體地瞭解您實際要求的內容。 – 2012-04-27 16:39:35

回答

3

在MouseDown中,設置一個布爾值來表示它的下降並存儲鼠標的位置。 InMouseMove如果鼠標關閉,從上一個位置繪製到當前位置,存儲當前位置。 在MouseUp中重置布爾值

反正是一種方法。

+0

我只是想說完全一樣的東西。 +1。 – Pateman 2012-04-26 22:14:22

6

你需要跟蹤你是否在拖動鼠標(左鍵是down),保存起點的位置,並在事件中繪製你的線。 (這不會完全達到你想要的效果,因爲它不會顯示你的線條將出現在哪裏,也不會清除你以前繪製的任何線條,你需要跟蹤OnMouseMove中的那些線條,它應該讓你開始, 。雖然)

unit Unit2; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Vcl.Graphics, 
    Controls, Forms, Dialogs; 

type 
    TForm2 = class(TForm) 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    private 
    { Private declarations } 
    Drawing: Boolean; 
    mX, mY: Integer; 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if [ssLeft] = Shift then 
    begin 
    Drawing := True; 
    mX := X; 
    mY := Y; 
    end; 
end; 

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if Drawing and not (ssLeft in Shift) then // Left button released 
    begin 
    Canvas.MoveTo(mX, mY); 
    Canvas.LineTo(X, Y); 
    Drawing := False; 
    end; 
end; 

end. 
2

我會做的方式是這樣的:

var 
    Form1: TForm1; 

    IsDrawing: Boolean; // flag to determine if drawing or not 

implementation 

{$R *.dfm} 

procedure DoPaint(ACanvas: TCanvas; X, Y: Integer; AColor: TColor; 
    ASize: Integer; AStyle: TPenStyle; Persistent: Boolean); 
begin 
    with ACanvas do 
    begin 
    Pen.Color := AColor; 
    Pen.Style := AStyle; 
    Pen.Width := ASize; 

    if not Persistent then 
     MoveTo(X, Y); 
    LineTo(X, Y); 
    end; 
end; 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    case Button of 
    mbLeft: 
    begin 
     IsDrawing := True; 
     DoPaint(Form1.Canvas, X, Y, clBlue, 10, psSolid, False); 
    end; 
    end; 
end; 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    if (GetAsyncKeyState(VK_LBUTTON) <> 0) and 
    (IsDrawing) then 
    begin 
    DoPaint(Form1.Canvas, X, Y, clBlue, 10, psSolid, True); 
    end; 
end; 

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    IsDrawing := False; 
end; 

兩件事這裏需要注意的是MouseMove事件和GetAsyncKeyState。您使用了MouseDown和MouseUp,但需要使用MouseMove才能繼續繪圖。

MouseMove事件將跟蹤畫布上的移動。顯然你只需要畫畫,如果你開始。爲了解決這個問題,你可以設置一個簡單的布爾標誌,正如我已經演示的IsDrawing - 當你在畫布上MouseDown時,它被設置爲True,當你在畫布上MouseUp時設置爲False。

使用IsDrawing標誌以及GetAsyncKeyState您現在可以確定是否繼續在畫布上繪圖。由於MSDN文章中介紹,你需要知道GetAsyncKeyState只跟蹤物理按鍵佈局,而不是邏輯的:

的GetAsyncKeyState功能可與鼠標按鈕。但是,它 檢查物理鼠標按鈕的狀態,而不檢查物理按鈕映射到的邏輯 鼠標按鈕。例如, 調用GetAsyncKeyState(VK_LBUTTON)總是返回 左側物理鼠標按鈕的狀態,無論它是否映射到 左側或右側的邏輯鼠標按鈕。您可以通過調用GetSystemMetrics(SM_SWAPBUTTON) 來確定系統的 當前物理鼠標按鈕到邏輯鼠標按鈕的映射。

如果鼠標按鈕已被交換,則返回TRUE。

0

如果需要行想起來代碼:

procedure TForm1.img1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    (Sender as TImage).Canvas.MoveTo(X, Y); 
end; 


procedure TForm1.img1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    (Sender as TImage).Canvas.LineTo(X, Y); 
end; 

,或者,如果你需要繪製自由來自行使用:

procedure TForm1.img1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    with (Sender as TImage) do begin 
    if Shift = [ssLeft] then 
     Canvas.LineTo(X, Y); 
    Canvas.MoveTo(X, Y); 
    end; 
end; 
相關問題