无标题栏对话框的拖动

简介: 实际上,用鼠标点住对话框背景进行拖动操作并不难,但是你必须了解在标题栏里拖动窗口的原理。Windows首先确定鼠标点中了那个窗口,然后向那个窗口发送一个WM_NCHITTEST消息找出此窗口的哪个“非客户区”(如边界、最大化/最小化按钮、菜单、标题等等)拥有鼠标光标。

实际上,用鼠标点住对话框背景进行拖动操作并不难,但是你必须了解在标题栏里拖动窗口的原理。Windows首先确定鼠标点中了那个窗口,然后向那个窗口发送一个WM_NCHITTEST消息找出此窗口的哪个“非客户区”(如边界、最大化/最小化按钮、菜单、标题等等)拥有鼠标光标。接着默认的窗口过程响应消息并返回一个特定的代码。如果鼠标指针落在标题栏中,那么这个神奇的特定代码就是HTCAPTIONA。如果WM_NCHITTEST返回HTCAPTION,那么Windows便进入拖拽模式,以便对窗口进行移动操作。所以要想在客户区里用鼠标拖动对话框,那么只要在客户区里模仿标题栏里的鼠标拖动行为即可。这个我们下面要介绍的比较专业的方法,其主要思路是处理WM_NCHITTEST消息:

UINT CMyDialog::OnNcHitTest(CPoint pt)
{
  CRect rc;
  GetClientRect(&rc);
  ClientToScreen(&rc);
  return rc.PtInRect(pt) ? HTCAPTION : CDialog::OnNcHitTest(pt);
}     

    上面这个代码很容易理解,当鼠标落在客户区内,函数返回HTCAPTION。对于一个简单的对话框来说,仅仅用这个代码就完全可以实现在对话框背景内的拖动操作。因为Windows使用z-order坐标来确定鼠标下是哪个窗口,所以对话框中其它的所有对象照常工作。如果用户单击某个控制,只要这个控制不是静态位图图像或者文本,那么Windows都将鼠标事件发送到该控制上,而不是对话框。由于静态位图图像或者文本对于对话框是透明的,所以鼠标在上面的拖动同样实现移动,而对于对话框中的编辑框、按钮、组合框等其它非静态控制则按通常的行为方式运行。

目录
相关文章
|
3月前
MFC隐藏对话框边框和可拖动
MFC隐藏对话框边框和可拖动
图标
4.5 图表 4.5.1 图表简介 1、图表 图表就是工作表单元格中数据的图形化表示,以直观形象的形式显示数据及数据之间的关系。 图表是基于工作表中的数据建立的,为工作表中的数据建立了图表后,图表和建立图表的数据就建立了一种动态链接关系: 1删除数据清单中的源数据时,图表中相应数据系列会自动删除。 2但删除图表中数据系列时,数据清单中源数据不变 2、图表的分类 按照图表的存放位置分为以下两种类型: 1嵌入式图表 (Alt+F1,默认),它和创建图表的数据源放置在同一张工作表中,打印时同时打印; 2独立图表 (F11),它是一个独立的图表工作表,打印时也将与数据表分开打印。 注意
C#创建无边框可拖动窗口
C#创建无边框可拖动窗口
171 0
CDialog中使用工具栏和状态栏
CDialog中使用工具栏和状态栏
86 0
|
Android开发
动画必须有(二):悬浮菜单了解一下!
动画必须有(一): 属性动画浅谈githhub传送门 目录 前言 效果图 FloatingActionButton基础 FloatingActionButton实例 最后 前言 悬浮按钮是我非常喜欢的, 可以把最关键的功能放入到悬浮按钮中.
1033 0