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

Rub*_*der 4 windows delphi winapi delphi-xe2

我有类似的组件德尔福XE2项目Label1,BitBtn1Image1.我已经实现了表单拖动而没有标题栏写下面的代码:

  private
    { Private declarations }
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;
Run Code Online (Sandbox Code Playgroud)

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

在我的形式中,我的项目必须使用Image1.OnMouseMoveLabel1.OnClick事件,但它们不起作用.如何从客户区拖动表单除了Image1Label1区域?我可以做一件我可以使用的东西TPanel,但它会破坏我的表格GlassFrameSheetOfGlass属性.

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

仅当您单击窗体上没有控件的点时,才允许拖动.您可能希望使用替代标准,但使用Msg.Pos是关键想法.