我会这样做的方式是这样的:
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。