上のコードではローカルなマウスフックを使用しています.
このフックのメッセージ処理を使用すれば,クリックした画像位置を検出できます.
そのようにしたコードです.
このコードにすれば,
procedure TForm1.Item_0Click(Sender: TObject);
の処理は不要です.
//-----------------------------------------------------------------------------
// ローカルマウスフックのメッセージを受信
// マウスカーソルの座標値を取得して表示
// クリックした画像の番号を表示
//-----------------------------------------------------------------------------
procedure TForm1.WMApp100(var Message: TMessage);
var
X : Integer;
Y : Integer;
hPopup : HWND;
aRect : TRect;
i : Integer;
begin
X := LOWORD(Message.LParam);
Y := HIWORD(Message.LParam);
//PopupMen1のウィンドウの領域内の時だけ処理
//Windwosのポップアップメニューのクラス名は#32768(16進数では$8000)
hPopup := FindWindow(PChar(#32768), nil);
GetWindowRect(hPopup, aRect);
if PtInRect(aRect, Point(X, Y)) then begin
Panel1.Caption := 'X: ' + IntToStr(X) + ' Y: ' + IntToStr(Y);
if (Message.WParam = WM_LBUTTONDOWN)
or (Message.WParam = WM_MBUTTONDOWN)
or (Message.WParam = WM_RBUTTONDOWN) then begin
if hMouseHook <> 0 then begin
UnhookWindowsHookEx(hMouseHook);
hMouseHook := 0;
end;
if (Message.WParam = WM_LBUTTONDOWN) or (Message.WParam = WM_RBUTTONDOWN) then begin
for i := 0 to Length(RectImage) - 1 do begin
if PtInRect(RectImage[i], Point(X, Y)) then begin
ShowMessage(IntToStr(i + 1) + ' 番目の画像クリック');
break;
end;
end;
end;
Panel1.Caption := 'クリックで閉じた';
end;
end else begin
Panel1.Caption := '';
end;
end;
|