VC實現窗口拖動
来源:互联网 发布:python append函数 编辑:程序博客网 时间:2024/06/03 17:54
有很多漂亮的小程序,它们的窗口都是可以拖动的。鼠标在窗口的任意位置按下,即可把窗口拖动到其它位置。通常标准的Windows窗口只有在标题栏上按下鼠标才可以拖动,那么如何实现窗口的任意位置都可以拖动呢?
稍有经验的程序员会立刻想到:响应鼠标按下消息,然后在鼠标移动时移动窗口。对于程序基础好的程序员,可以按这个思维很快实现,对于初学者,可能就要多调试一会儿了。有没有其它方法呢?
仔细了解一下MFC的实现,就能找到更简单的方法。
MFC把窗口分成两个部分,一部分是Client区,也叫客户区,就是我们可以在上面画画、放置子窗口等地方的区域,程序员负责这个区域的操作;另一部分叫NC区,也就是Not Client区,称为非客户区,标题栏、边框、窗口菜单等都属于非客户区。在非客户区的操作都由MFC负责。而MFC并没有独揽窗口非客户区的操作大权,程序员可以使用虚函数、窗口消息等方式影响非客户区的操作。
当鼠标在非客户区按下的时候,MFC通过发送WM_NCHITTEST消息来确定位置,并依据WM_NCHITTEST消息的响应函数返回的位置信息确定应该执行的操作。在标题栏上按下鼠标将执行拖动窗口操作。
现在我们有了另一个实现拖动窗口的方法了:响应WM_NCHITTEST消息,无论鼠标在什么位置,都返回HTCAPTION(标题栏),骗过MFC,让它来实现窗口拖动。
如果IDE好使的话,可以使用增加消息响应向导简化编程。也可以按以下方法手动添加WM_NCHITTEST的响应函数。
1)在窗口类定义中添加响应函数的声明:
afx_msg UINT OnNcHitTest(CPoint point);
2)在消息响应入口表中登记响应入口,也就是在EGIN_MESSAGE_MAP和END_MESSAGE_MAP之间增加以下内容:
ON_WM_NCHITTEST()
3)实现OnNcHitTest的函数体,假设类名为CXxx:
UINT CXxx::OnNcHitTest(CPoint point)
{
return HTCAPTION;
}
经过这三步,窗口应该可以拖动了,实在是有点太容易。
喜欢研究问题的朋友一定会在HTCAPTION上按一下F12,也就是去看一下HTCAPTION的定义。如果您这样做了,您一定会看到在HTCAPTION旁边还定义着很多其它的东西,向下面这样:
/*
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
*/
#define HTERROR (-2)
#define HTTRANSPARENT (-1)
#define HTNOWHERE 0
#define HTCLIENT 1
#define HTCAPTION 2 //我们返回的那个(苏林注)
#define HTSYSMENU 3
#define HTGROWBOX 4
#define HTSIZE HTGROWBOX
#define HTMENU 5
#define HTHSCROLL 6
#define HTVSCROLL 7
#define HTMINBUTTON 8
#define HTMAXBUTTON 9
#define HTLEFT 10
#define HTRIGHT 11
#define HTTOP 12
#define HTTOPLEFT 13
#define HTTOPRIGHT 14
#define HTBOTTOM 15
#define HTBOTTOMLEFT 16
#define HTBOTTOMRIGHT 17
#define HTBORDER 18
#define HTREDUCE HTMINBUTTON
#define HTZOOM HTMAXBUTTON
#define HTSIZEFIRST HTLEFT
#define HTSIZELAST HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
#define HTOBJECT 19
#define HTCLOSE 20
#define HTHELP 21
#endif/* WINVER >= 0x0400 */
如果您的响应函数中,在适当地方返回这些值,可以得到很多其它效果,如最大化、改变大小、启动帮助、关闭窗口等,有兴趣的话可以自己去研究。
作者:苏林 2007-12-24
- VC實現窗口拖動
- VC 实现无标题窗口的拖拽
- VC个性化窗口界面设计
- vc窗口编程
- VC防止窗口闪烁
- VC窗口全屏显示
- VC设置窗口透明
- 窗口使终置前 vc
- vc 窗口 使用技巧
- vc 关闭指定窗口
- vc窗口特效
- vc吸附窗口
- vc窗口 说明
- VC将窗口置最前
- vc 窗口透明
- VC窗口最大化方法
- VC个性化窗口界面设计
- VC窗口缩放
- unix下查看文件格式
- 21天教你学会C++
- Android异步加载图像(含线程池,缓存方法)
- 十天内掌握线性代数:惊人的超速学习实验
- springMVC基础及应用视频(6)
- VC實現窗口拖動
- 圆周弧长的计算问题(简易公式)
- hadooop的wordcount程序
- Leetcode: Swap nodes in pairs
- java相关求助---Java泛型的理解与等价实现---------没有完全明白啊...请大神指导...
- ios后台播放
- web2py
- Linux Find 命令精通指南
- WM_NCLBUTTONDOWN+HTCAPTION消息移动一个窗口