我有一种情况,我有一个TImage
,在它上面有一个TPanel
部分覆盖它,它们共享同一个父级:
------------------
| Image1 |
| ------------ |
| | Panel1 | |
| ------------ |
| |
------------------
Panel1 正在接收鼠标按下/移动/向上事件并对其进行处理(Image1 也是如此),但在某些情况下,我想将鼠标按下消息“重定向”到 Image1,就好像模拟单击了 Image1 而不是 Panel1。
这是我所做的:
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
不适用于所描述的场景。如果我的方法有效与否,我仍然没有得到答案。(或者也许我应该对上述情况提出另一个问题?)