delphi技巧——移动无标题窗口

本文介绍了在Delphi中移动无标题窗口的三种技巧:通过鼠标位置差移动,自定义消息处理WM_NCHitTest,以及发送wm_SysCommand消息。对比了各种方法的优缺点,推荐使用wm_SysCommand方法,因为它允许窗体同时处理其他鼠标事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

delphi技巧——移动无标题窗口

关键词:移动,消息,无标题

                      作者:朱能文

   我们都知道windows是通过标题栏来移动窗体的,当我们在标题栏上按下鼠标左键时,windows将发送wM_NCHitTest消息,来告诉系统要移动窗体。但我们在实际编程时,有时为了界面的需要或特殊的要求,窗体没有标题栏,我们必须通过程序来移动窗体。下面我将介绍几种移动窗体的方法和技巧。

   方法一:根据鼠标按下和移动时的位置差,来计算窗体的位置。需要定义的变量如下:

  var

   Opos, Cpos: Tpoint; 

   Flag: boolean = false;

   处理OnMouseDown事件代码:

   Flag := true;

   Opos.X := X;

   Opos.Y := Y;

   处理OnMouseMove事件代码:

   if Flag then

    begin

        Cpos.X := X;

        Cpos.y := Y;

        Left := Left + Cpos.X - Opos.X;

        Top := Top + Cpos.Y - Opos.Y;

    end;

   处理OnMouseMove事件代码:

   Flag := false;

   方法二:用户自定义消息,拦截“wM_NCHitTest”消息,将消息值“htclient”转为“htcaption”。实现如下:

   先定义一消息常量:const WM_MyTest = WM_User+200;

   在private部分声明过程:

   procedure MoveClient(var message: Tmessage);  message wM_NCHitTest;

   过程的实现:

     inHerited;//继承,窗体可以继续处理以后的事件

     if Message.Result=htclient then

      Message.Result := htcaption;

    方法三:直接向窗体发送一条“wm_SysCommand”消息,需要使用未归档的“sc_DragMove”标志,定义如下:

   const sc_DragMove = $f012;

   我们只能向TWinControl派生组件发送该消息,而且只能响应鼠标按下事件,因为系统会在此时捕获鼠标(当释放鼠标键时,拖动操作是没有意义的)。在窗体的OnMouseDown事件处理代码:

   ReleaseCapture; //释放鼠标的捕获状态;

   (Sender as TWinControl).PerForm(wm_SysCommand,sc_DragMove,0);//向窗体发送移动消息;

   上面我提供了三种移动无标题栏窗体的方法,方法一比较容易理解,且不需要理解windows消息处理机制,但此方法需要对窗体的鼠标事件处理太多,显得不够简洁。方法二通过消息转换,这种方法比较容易实现,但有一个缺点,窗体将不再响应鼠标其他消息,如果窗体上有鼠标右键处理,那么右键将得不到响应。方法三是最好的一种方法,通过定义sc_DragMove消息,注意sc_DragMove的值必须是$f012或$f011,通过PerForm方法发送sc_DragMove消息,这种方法窗体还可以处理其他鼠标事件,而不象方法二,所以我建议大家可以用方法三来移动无标题的窗体比较好。(以上几种方法我都在delphi6.0+windows2k上通过)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值