这两个东西(wmnchittest, Tform1.Shape3ContextPopup)不是一个啊,会让人误会。anyway:TLabel不是一个真正的窗口对象,它是Delphi虚拟的,它没有窗口句柄。事实上,如果它是放在Form1上的(其Parent=Form1),那么WM_NCHITTEST会屏蔽LABEL的鼠标事件的(如:OnContextPopup, OnMouseDown, OnMouseMove, OnMouseUp),一个解决办法是,你要在WM_NCHITTEST中判断鼠标的落点是不是在一个控件上,用ControlAtPos方法可以做到。
procedure Tform1.wmnchittest(var msg:tmessage);
begin
inherited;
if msg.Result=htclient then msg.Result:=htcaption;
end;
这样之后,设定的Labelclick鼠标事件就无效了,但是用按钮就可以!
那么具体如何让Labelclick鼠标事件有效?谢谢!
var
p: TPoint;
begin
inherited; if msg.Result=htclient then
begin
// 转换一下坐标
p := ScreenToClient( Point(msg.XPos, msg.YPos) );
if ControlAtPos(p, True, True)<>nil then
msg.Result:=htcaption;
end;
end;