4

我有一个 Delphi XE2 项目,其中包含Label1,BitBtn1Image1. 我已经实现了表单拖动,而没有标题栏编写以下代码:

  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.OnMouseMoveLabel1.OnClick事件对于我的项目是强制性的,但它们不起作用。如何从客户区拖动表单,除了Image1Label1区?我可以做一件事,我可能会使用 one TPanel,但它会破坏我的表单的GlassFrameSheetOfGlass属性。

4

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

于 2012-06-27T11:17:58.470 回答