当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 再谈客户区对话框拖动操作

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 再谈客户区对话框拖动操作


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 112 ::
收藏到网摘: n/a

再谈客户区对话框拖动操作
——处理上下文菜单


编译/NorthTibet

下载源代码


    在线杂志第十六期有一篇文章《无标题对话框的拖动》,示范了如何用鼠标点击窗口或对话框背景(即客户区)进行拖动操作,文章中提供的解决方法在没有上下文菜单的情况下运行很正常,一旦有上下文菜单时,文中所提供的方法便显现出了缺陷——上下文菜单无法显示出来。本文将针对这个问题对前一篇提出的方法进行改进。
    当初实现拖动的基本思路是改写 OnNcHitTest 例程,让鼠标在客户区中的点击始终返回 HTCAPTION 而不是 HTCLIENT,从而诱使 Windows 实现拖动操作。没想到这样做使上下文菜单的操作出现了混乱,原因是如果强制 OnNcHitTest 在客户区返回 HTCAPTION,Windows 不会发送 WM_CONTEXTMENU 消息。有一个解决是调用 GetKeyState 函数,在返回 HTCAPTION 之前检查鼠标右键状态。这个方法要求跟踪鼠标左右键的交换操作。 也就是要自己处理虚拟键,而且如果用户是个左撇子的话,这个方法是否还灵呢?如果有兴趣,自己试试吧!除此之外,还有一个方案可以考虑,思路是当 Windows 得到 WM_NCHITTEST 消息时,鼠标按键已经释放。我查阅了 MSDN 有关鼠标消息处理的资料,利用这一间隙,可以通过改写 OnNcRButtonUp 例程对 WM_NCRBUTTONUP 消息进行处理:

// OnNcRButtonUp 函数代码void CMyDialog::OnNcRButtonUp(UINT nHitTest, CPoint pt){ if (nHitTest==HTCAPTION && PtInClientRect(pt))	SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, MAKELPARAM(pt.x,pt.y)); else	CDialog::OnNcRButtonUp(nHitTest, pt);} 
    从代码中不难看出,如果鼠标命中代码所反映的鼠标位置为标题栏,而实际位置是在客户区里,那么你必须自己发送 WM_CONTEXTMENU 消息。此为解决问题的关键,代码既要在 OnNcHitTest 中诱使 Windows 把 HTCLIENT 当作 HTCAPTION 处理来实现拖动,又要判断右键发出单击操作时是否处在客户区。如果是,则发送 WM_CONTEXTMENU 消息。注意当用户在标题栏上单击右键时,仍然要显示系统菜单,这时让 OnNcRButtonUp 做默认处理即可。下面是本文例子程序运行画面:


图一 例子程序运行画面

详细的处理细节请下载源代码。

最后,大家身体健康,编程愉快!