使用VC实现可拖动窗口
2011-10-13 14:38
501 查看
有很多漂亮的小程序,它们的窗口都是可以拖动的。鼠标在窗口的任意位置按下,即可把窗口拖动到其它位置。通常标准的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);
[align=left]2)在消息响应入口表中登记响应入口,也就是在EGIN_MESSAGE_MAP和END_MESSAGE_MAP之间增加以下内容:[/align]
[align=left]ON_WM_NCHITTEST()[/align]
[align=left]3)实现OnNcHitTest的函数体,假设类名为CXxx:[/align]
[align=left]UINT CXxx::OnNcHitTest(CPoint point)[/align]
[align=left]{[/align]
return HTCAPTION;
[align=left]}[/align]
[align=left]经过这三步,窗口应该可以拖动了,实在是有点太容易。[/align]
[align=left]喜欢研究问题的朋友一定会在HTCAPTION上按一下F12,也就是去看一下HTCAPTION的定义。如果您这样做了,您一定会看到在HTCAPTION旁边还定义着很多其它的东西,向下面这样:[/align]
[align=left]/*[/align]
[align=left]* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes[/align]
[align=left]*/[/align]
[align=left]#define HTERROR (-2)[/align]
[align=left]#define HTTRANSPARENT (-1)[/align]
[align=left]#define HTNOWHERE 0[/align]
[align=left]#define HTCLIENT 1[/align]
#define HTCAPTION 2 //
我们返回的那个(苏林注)
[align=left]#define HTSYSMENU 3[/align]
[align=left]#define HTGROWBOX 4[/align]
[align=left]#define HTSIZE HTGROWBOX[/align]
[align=left]#define HTMENU 5[/align]
[align=left]#define HTHSCROLL 6[/align]
[align=left]#define HTVSCROLL 7[/align]
[align=left]#define HTMINBUTTON 8[/align]
[align=left]#define HTMAXBUTTON 9[/align]
[align=left]#define HTLEFT 10[/align]
[align=left]#define HTRIGHT 11[/align]
[align=left]#define HTTOP 12[/align]
[align=left]#define HTTOPLEFT 13[/align]
[align=left]#define HTTOPRIGHT 14[/align]
[align=left]#define HTBOTTOM 15[/align]
[align=left]#define HTBOTTOMLEFT 16[/align]
[align=left]#define HTBOTTOMRIGHT 17[/align]
[align=left]#define HTBORDER 18[/align]
[align=left]#define HTREDUCE HTMINBUTTON[/align]
[align=left]#define HTZOOM HTMAXBUTTON[/align]
[align=left]#define HTSIZEFIRST HTLEFT[/align]
[align=left]#define HTSIZELAST HTBOTTOMRIGHT[/align]
[align=left]#if(WINVER >= 0x0400)[/align]
[align=left]#define HTOBJECT 19[/align]
[align=left]#define HTCLOSE 20[/align]
[align=left]#define HTHELP 21[/align]
#endif
/* WINVER >= 0x0400 */
[align=left]如果您的响应函数中,在适当地方返回这些值,可以得到很多其它效果,如最大化、改变大小、启动帮助、关闭窗口等,有兴趣的话可以自己去研究。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]方法二:[/align]
void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM(point.x, point. y));
}
稍有经验的程序员会立刻想到:响应鼠标按下消息,然后在鼠标移动时移动窗口。对于程序基础好的程序员,可以按这个思维很快实现,对于初学者,可能就要多调试一会儿了。有没有其它方法呢?
仔细了解一下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);
[align=left]2)在消息响应入口表中登记响应入口,也就是在EGIN_MESSAGE_MAP和END_MESSAGE_MAP之间增加以下内容:[/align]
[align=left]ON_WM_NCHITTEST()[/align]
[align=left]3)实现OnNcHitTest的函数体,假设类名为CXxx:[/align]
[align=left]UINT CXxx::OnNcHitTest(CPoint point)[/align]
[align=left]{[/align]
return HTCAPTION;
[align=left]}[/align]
[align=left]经过这三步,窗口应该可以拖动了,实在是有点太容易。[/align]
[align=left]喜欢研究问题的朋友一定会在HTCAPTION上按一下F12,也就是去看一下HTCAPTION的定义。如果您这样做了,您一定会看到在HTCAPTION旁边还定义着很多其它的东西,向下面这样:[/align]
[align=left]/*[/align]
[align=left]* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes[/align]
[align=left]*/[/align]
[align=left]#define HTERROR (-2)[/align]
[align=left]#define HTTRANSPARENT (-1)[/align]
[align=left]#define HTNOWHERE 0[/align]
[align=left]#define HTCLIENT 1[/align]
#define HTCAPTION 2 //
我们返回的那个(苏林注)
[align=left]#define HTSYSMENU 3[/align]
[align=left]#define HTGROWBOX 4[/align]
[align=left]#define HTSIZE HTGROWBOX[/align]
[align=left]#define HTMENU 5[/align]
[align=left]#define HTHSCROLL 6[/align]
[align=left]#define HTVSCROLL 7[/align]
[align=left]#define HTMINBUTTON 8[/align]
[align=left]#define HTMAXBUTTON 9[/align]
[align=left]#define HTLEFT 10[/align]
[align=left]#define HTRIGHT 11[/align]
[align=left]#define HTTOP 12[/align]
[align=left]#define HTTOPLEFT 13[/align]
[align=left]#define HTTOPRIGHT 14[/align]
[align=left]#define HTBOTTOM 15[/align]
[align=left]#define HTBOTTOMLEFT 16[/align]
[align=left]#define HTBOTTOMRIGHT 17[/align]
[align=left]#define HTBORDER 18[/align]
[align=left]#define HTREDUCE HTMINBUTTON[/align]
[align=left]#define HTZOOM HTMAXBUTTON[/align]
[align=left]#define HTSIZEFIRST HTLEFT[/align]
[align=left]#define HTSIZELAST HTBOTTOMRIGHT[/align]
[align=left]#if(WINVER >= 0x0400)[/align]
[align=left]#define HTOBJECT 19[/align]
[align=left]#define HTCLOSE 20[/align]
[align=left]#define HTHELP 21[/align]
#endif
/* WINVER >= 0x0400 */
[align=left]如果您的响应函数中,在适当地方返回这些值,可以得到很多其它效果,如最大化、改变大小、启动帮助、关闭窗口等,有兴趣的话可以自己去研究。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]方法二:[/align]
void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM(point.x, point. y));
}
相关文章推荐
- 使用VC实现可拖动窗口
- 使用VC实现可拖动窗口
- [置顶] VC++界面编程之--使用分层窗口实现界面皮肤
- VC++界面编程之--使用分层窗口实现界面皮肤
- vc实现非标题栏窗口拖动
- 使用bootstrap实现多窗口和拖动效果
- VC++界面编程之--使用分层窗口实现界面皮肤
- 使用CSS+JavaScript实现可拖动的窗口的源代码(推荐)
- 如何使用gdb调试,类似于vc那样的带源码窗口的方式?
- 使用VC6.0实现窗口的任意分割
- 使用CSplitterWnd实现拆分窗口(多视图显示)
- VC实现不规则窗口
- std::string的Copy-on-Write:不如想象中美好(VC不使用这种方式,而使用对小字符串更友好的SSO实现)
- WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口
- 使用BootStrap实现悬浮窗口的效果
- 【Unity】编辑器中实现类似动画编辑器中的可拖动窗口
- 使用AnimateWindow来实现窗口淡入淡出(主要有四种动画,滚动,滑动,折叠或展开,和淡入淡出)
- 《面向对象程序设计与VC++实现》--Liwei_1_3 (交换 使用引用、指针、变量三种方法)
- VC下使用Macro (vbs)来实现标准函数注释的自动添加
- VC++中实现程序启动后隐藏窗口,最小化到托盘图标。