我會做的方式是這樣的:
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。
爲什麼你會期望它做任何其他的繪圖?您顯示的唯一代碼是當您首次按下鼠標按鈕時繪製單個矩形的位置。 'GetAsyncKeyState'確實會告訴你鼠標按鈕是否關閉。這就是你問的問題的答案。但你問錯了問題。如果你想知道如何用鋼筆畫一個表面,那麼問一下,而不是如何檢測鼠標按鈕是否被按下,因爲只知道你顯然沒有得到你想要的東西。 – 2012-04-27 15:25:36
Rob是對的,問題標題沒有描述你寫的實際問題。您應該更具體地瞭解您實際要求的內容。 – 2012-04-27 16:39:35