TImage
私はそれを部分的にTPanel
カバーし、それらが同じ親を共有している状況を持っています:
------------------
| Image1 |
| ------------ |
| | Panel1 | |
| ------------ |
| |
------------------
Panel1 はマウス ダウン/移動/アップ イベントを受信して処理しています (Image1 も同様です) が、状況によっては、Panel1 ではなく Image1 がクリックされたことをシミュレートするかのように、マウス ダウン メッセージを Image1 に「リダイレクト」したいと考えています。
これが私がしたことです:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (ssLeft in Shift) then
Beep;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
//...
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('boo!');
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
P: TPoint;
begin
if FRedirectToImage then begin
ReleaseCapture; // do I need to send a WM_LBUTTONUP as well to the panel?
GetCursorPos(P);
P := ScreenToClient(P);
Image1.Perform(WM_LBUTTONDOWN, MK_LBUTTON, Longint(PointToSmallPoint(P)));
Exit;
end;
// Normal handling
if (ssLeft in Shift) then begin
// ...
end;
end;
期待どおりに機能しますが、正しい方法かどうかはわかりません。
私の質問は、私はそれを正しくやっていますか?それを行うより良い方法または推奨される方法はありますか?
更新 (1) :WM_NCHITTEST
提案どおりの処理は有効な答えであり、私もそれについて考えました。に設定Panel1.Enabled
してもFalse
、マウス メッセージは基になる Image1 コントロールにルーティングされます。
しかし (!)x
パネル上の場所をクリックしても、メッセージを Image1 にルーティングする必要があるという状況を考えてみてください。
------------------
| Image1 |
| --------------
| | Panel1 x |
| --------------
| |
------------------
私の方法は機能しますがWM_NCHITTEST
、説明されているシナリオには適用できません。私の方法が有効かどうか、まだ答えが得られませんでした。(または、上記のシナリオで別の質問をする必要がありますか?)