编写可复用性更好的C++代码:Band对象和COMToys(4)
2006-07-21 11:46:12 来源:WEB开发网正如第三部分的图十二所示,让编辑框的上下文菜单正常工作是要费点事的。当用户在编辑框上单击右键时,编辑框应该显示自己的上下文菜单,这个菜单中应包括"剪切/复制/粘贴"菜单。没问题。只要重载WM_CONTEXTMENU消息处理函数就可以了。但是MFC的命令中没有这样的东西——我是说针对编辑框的WM_CONTEXTMENU消息处理函数,也就是说MFC的OnInitMenuPopup处理器是在CFrameWnd中实现的,而不是在CWnd中——尽管任何窗口都能显示菜单。这个问题是个经常会在编程中碰到的问题。解决它的方法是利用我以前编写的可以用于任何CWnd的一个小玩意儿:它就是CPopupMenuInitHandler,这个类派生于CSubclassWnd 。
用CSubclassWnd可以动态子类化任何CWnd以实现消息截获。CPopupMenuInitHandler动态子类化编辑控制来截获WM_CONTEXTMENU消息。当截获到这个消息后便调用另一个类/函数——CPopupMenuInit::Init完成工作,这个函数与CFrameWnd中的差不多,几乎是原封不动地拷贝过来的。CPopupMenuInit::Init为每个菜单项创建了一个CCmdUI对象并将它发送到ON_UPDATE_COMMAND_UI处理器。任何时候你都可以象初始化MFC菜单那样单独使用CPopupMenuInitHandler。详细代码请参考MenuInit.cpp文件。
最终CEditSearch模拟出了IE地址栏中的功能,即第一次点击编辑框时,所有文本被选中。在单击一次可定位光标。实现这些功能必须处理几个消息——WM_MOUSEACTIVATE,WM_ SETFOCUS,WM_LBUTTONDOWN以及鼠标或键盘消息——这个处理过程我都放在了CEditSearch::WindowProc之中。有时侯用老的C++做法比用消息映射来得容易。有关细节请看源代码。 如果你调试过桌面Band的应用,你就会发现那是件痛苦的事情,我写了一个单独的程序就叫TestEditSrch,专门用来测试CEditSearch,确定它能正常工作后再将它放入桌面Band里面(如图十五)。我强烈建议你也如法炮制。单独写出可执行代码,然后再把它们移到Band中去。
更多精彩
赞助商链接