【问题标题】:How can I drag my form from its client area without disabling functionality of child controls?如何在不禁用子控件功能的情况下从其客户区域拖动我的表单?
【发布时间】:2012-06-27 07:51:43
【问题描述】:

我有一个 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 属性。

【问题讨论】:

    标签: windows delphi winapi delphi-xe2


    【解决方案1】:

    您将需要使用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 是关键。

    【讨论】:

    • 非常感谢。完全符合我的要求。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 2019-02-12
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多