我有一个Delphi XE2项目,其中包含Label1
,BitBtn1
和Image1
等组件。我已经实现了表单拖动而没有标题栏编写以下代码:
private
{ Private declarations }
procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;
和
procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest) ;
begin
inherited;
if Msg.Result = htClient then Msg.Result := htCaption;
end;
在我的表单中,Image1.OnMouseMove
和Label1.OnClick
事件对我的项目是强制性的,但它们不起作用。如何从Image1
和Label1
区域以外的客户区拖动表单?我可以做一件事,我可以使用一个TPanel
,但它会破坏我的表单的GlassFrame
和SheetOfGlass
属性。
答案 0 :(得分:7)
您需要使用WM_NCHITTEST
消息中包含的位置信息。用它来确定此时是否存在控件。例如,您可以使用ControlAtPos
方法。
procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
if ControlAtPos(ScreenToClient(Msg.Pos), True, True, True)=nil then
if Msg.Result=htClient then
Msg.Result := htCaption;
end;
只有在单击窗体上没有控件的点时,才允许拖动。您可能希望使用替代标准,但使用Msg.Pos
是关键想法。