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

原创 2002年05月28日 10:12:00
 

delphi技巧——移动无标题窗口<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

                      作者:朱能文

   我们都知道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上通过)。

qt实现无标题栏透明可移动窗口

QT的常规对话框包括标题栏、图标Icon、关闭按钮,如下图所示:   在有些场景中,我们可能需要对标准对话框进行美化工作,比如,去掉标题栏和边框,并使整体表现出透明色的样子,如下图所示: ...
  • chlk118
  • chlk118
  • 2014年09月12日 21:15
  • 2153

qt 窗口无标题在桌面移动,不可移出可视范围之外

下面是基类的源代码,把所需求移动的窗口类继承这个基类即可 头文件: /*****************************************************************...
  • zhouxiao2009
  • zhouxiao2009
  • 2015年05月07日 09:29
  • 1408

MFC:拖动无标题窗口的三种方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口? 这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口。 通常状态下,一个窗口只有在标题栏的区...
  • greless
  • greless
  • 2017年02月20日 18:52
  • 624

NSIS无标题窗口移动

NSIS无标题窗口移动 经过前面几篇中,我们加载了背景图片,去除了原生的边框,控件等,你却发现我们鼠标点击窗口标题栏时,窗口无法移动。接下来看下我们窗口如何实现窗口移动。做到无标题移动的潜台词是把...
  • ly305750665
  • ly305750665
  • 2017年03月07日 22:41
  • 371

Delphi实现窗体控件自由移动

Delphi实现窗体控件自由移动 2008-04-25 16:22 在做Mis项目过程中,有时需要让用户自己来实现窗体控件的布局,比如酒店管理中就需要对餐厅餐桌位置进行布局。要实现这种功能,必...
  • delphi308
  • delphi308
  • 2013年08月08日 21:10
  • 1437

MFC无标题栏对话框移动的处理方法

很多时候,为了界面的美观,我们会隐藏标题栏,而在客户区通过自绘模拟标题栏。但是这样处理,会导致窗体无法移动。下面提供几种移动方法:    1、采用欺骗的方式。即当鼠标点击客户区的时候,我们欺骗wind...
  • zjccsg
  • zjccsg
  • 2016年07月16日 20:01
  • 1012

c++builder如何通过鼠标拖动改变无边框窗体的大小(bsnone)

转自http://www.ccrun.com/article.asp?i=990&d=70jx1b 在C++Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,...
  • lz465350
  • lz465350
  • 2014年11月06日 10:02
  • 1067

拖动无标题窗口的方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口? 这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口。 通常状态下,一个窗口只有在标题栏...
  • jiangqin115
  • jiangqin115
  • 2015年04月15日 12:02
  • 725

QT 鼠标拖动无标题窗口

转自:http://www.voidcn.com/blog/hiwubihe/article/p-6063271.html 非常感谢作者,亲测有效。 #ifndef CUSTOMWINDOW_H ...
  • sinat_30440627
  • sinat_30440627
  • 2017年01月02日 14:42
  • 281

Delphi的CPU调试窗口

Delphi的CPU窗口由五个独立的区组成。每个区都以不同视角,深层次地显示运行中程序的数据。...
  • lyhoo163
  • lyhoo163
  • 2016年01月27日 07:44
  • 1438
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi技巧——移动无标题窗口
举报原因:
原因补充:

(最多只允许输入30个字)