加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 03:58:23 所属栏目:Windows 来源:网络整理
导读:我有一个Delphi XE2项目,其中包含Label1,BitBtn1和 Image1等组件.我已经实现了表单拖动而没有标题栏写下面的代码: private { Private declarations } procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest; 和 procedure TMainForm.WMNCHi
我有一个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属性.

解决方法

您需要使用WM_NCHITTEST消息中包含的位置信息.用它来确定此时是否存在控件.例如,您可以使用ControlAtPos方法.

procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if ControlAtPos(ScreenToClient(Msg.Pos),True,True)=nil then
    if Msg.Result=htClient then
      Msg.Result := htCaption;
end;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读