青い稲妻です。
PaintBox内のマウス移動なんですが、PaintBox内のPixelsの一定間隔(X:10 Y:10)でマウス移動したいと思い、以下のソースを実行しましたが、一定間隔ではなく、通常のマウス移動になります。
どなたか、アドバイスをお願いします。
function MouseMsgHookProc(nCode: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
var
pms: PMouseHookStruct;
begin
Result:=0;
if nCode < 0 then begin
Result := CallNextHookEx(MouseHook, nCode, wParam, lParam);
exit;
end else begin
pms:=PMouseHookStruct(lParam);
{nCodeがHC_ACTIONの時のみ操作可能}
if nCode = HC_ACTION then begin
if wParam=WM_MOUSEMOVE then
begin
SendNotifyMessage(OutputWnd, WM_MOUSEMOVE, wParam, MAKELONG(pms^.pt.x+100, pms^.pt.y+100));
end;
end;
end;
CallNextHookEx( MouseHook, nCode, wParam, lParam);
end;
(*************************************************
PaintBoxのPixelsを視覚的に表示するボタン
*************************************************)
procedure TForm1.Button1Click(Sender: TObject);
var
x,y: integer;
begin
x := 0;
while(x < PaintBox1.Width) do
begin
y := 0;
while(y < PaintBox1.Height) do
begin
PaintBox1.Canvas.Pixels[x, y] := clGreen;
y := y + 10;
end;
x := x + 10;
end;
OutputWnd := PaintBox1.Parent.Handle;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
// 確認用です。
Edit1.Text := Format('X=%d Y=%d', [X,Y]);
end;
カーソルを直接使うのは多分無理です。
カーソルを不可視化して、カーソルもどきのグラフィックを表示するのは如何でしょうか?
そのほうがシステムにもよさげですし。
10ドット単位でクロスカーソル移動。
var
CX, CY: Integer;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
mx, my: Integer;
begin
mx := (X div 10) * 10 + 5;
my := (Y div 10) * 10 + 5;
if (CX <> mx)or(CY <> my) then begin
with PaintBox1.Canvas do begin
Pen.Color := clLime;
Pen.Mode := pmXOR;
MoveTo(CX-5,CY); LineTo(CX+6,CY);
MoveTo(CX,CY-5); LineTo(CX,CY+6);
CX := mx;
CY := my;
MoveTo(CX-5,CY); LineTo(CX+6,CY);
MoveTo(CX,CY-5); LineTo(CX,CY+6);
end;
end;
end;
ママんさん、ヒマジン b yJohnLemon さん、有難うございます。
何とか出来そうです。m(_ _)m
ツイート | ![]() |