如何在不禁用子控件功能的情况下,从窗体客户区拖动窗体?

4

我有一个Delphi XE2项目,其中包含Label1BitBtn1Image1等组件。我已经实现了在没有标题栏的情况下拖动窗体,写下了以下代码:

  private
    { Private declarations }
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;

and

procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest) ;
begin
  inherited;
  if Msg.Result = htClient then Msg.Result := htCaption;
end;

在我的表单中,Image1.OnMouseMoveLabel1.OnClick事件对于我的项目是必须的,但它们没有起作用。我如何在客户区域以外拖动表单,而不包括Image1Label1区域?我可以使用一个TPanel来解决,但这将破坏我的表单的GlassFrameSheetOfGlass属性。
1个回答

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 是关键思想。

非常感谢。它完全符合我的要求。 - Rubi Halder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接