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