私がそれをする方法はこのようなものです:
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;
ここで注意すべき2つのことは、MouseMoveイベントとGetAsyncKeyStateです。MouseDownとMouseUpを使用しましたが、描画を続行するために必要なMouseMoveです。
MouseMoveイベントは、キャンバス上の動きを追跡します。明らかに、あなたが最初から描く必要があるのはあなただけです。これを処理するために、私が使用して示したように単純なブールフラグを設定できますIsDrawing
-これは、キャンバス上でMouseDownを実行する場合はTrueに設定され、キャンバス上でMouseUpを実行する場合はFalseに設定されます。
IsDrawing
フラグを一緒に使用するGetAsyncKeyState
と、キャンバスに描画を続行するかどうかを決定できるようになりました。GetAsyncKeyState
MSDNの記事で説明されているように、論理的なボタンレイアウトではなく、物理的なボタンレイアウトのみを追跡することに注意する必要があります。
GetAsyncKeyState関数は、マウスボタンで機能します。ただし、物理ボタンがマップされている論理マウスボタンではなく、物理マウスボタンの状態をチェックします。たとえば、GetAsyncKeyState(VK_LBUTTON)を呼び出すと、論理マウスの左ボタンと右ボタンのどちらにマップされているかに関係なく、常に左の物理マウスボタンの状態が返されます。GetSystemMetrics(SM_SWAPBUTTON)を呼び出すことにより、物理マウスボタンから論理マウスボタンへのシステムの現在のマッピングを判別できます。
これは、マウスボタンが交換された場合にTRUEを返します。