VC定制编辑框的上下文菜单
2008-01-19 20:24:03 来源:WEB开发网// CMyEdit中的消息映射
ON_COMMAND(ID_FILETYPE_TXT, OnFiletypeTXT)
void CMyEdit::OnFiletypeTXT()
{
SetWindowText(_T("txt"));
SetSel(0,-1);
}
CMyEdit将编辑命令传给CEitMenuHandler并自己处理剩下的事情。更新菜单项时也一样。一切都进行得很顺利。
其实,CEitMenuHandler的实现是有相当多的事情要做的,你仔细想一想,要完成提出的功能的话需要编写不少的代码。所幸的是CEitMenuHandler很聪明地重用了以前的一段代码,一个叫做CPopupMenuInitHandler的类(有关这个类的描述请参考我的另外一篇文章),它对编辑菜单什么操作也不做;其作用是让你借MFC的CCmdUI菜单更新机制来更新任何窗口的上下文菜单。MFC有很棒的菜单更新机制全都在CFrameWnd中实现,所以只有框架窗口能使用它。如果你用某些其它类型的窗口——如编辑框控制,MFC是不会处理WM_INITMENUPOPUP消息为此来做一些CCmdUI的事情,真是个无赖!但是CPopupMenuInitHandler可处理任何窗口对象。它还依赖另外一个类:CSubclassWnd,这个类可以子类化任何CWnd对象。
CPopupMenuInitHandler代表你的窗口截获WM_INITMENUPOPUP消息,并且还完成MFC菜单更新的工作。你的事情是实例化CPopupMenuInitHandler并安装实例。然后你就可以添加ON_UPDATE_COMMAND_UI处理起来更新窗口的上下文菜单——就像框架窗口所做的那样。有关CPopupMenuInitHandler的细节请参见另外一篇文章,或者参考本文提供的源代码。
一旦有了CPopupMenuInitHandler类,CEitMenuHandler就简单了,参见源代码。
你只要提供一个菜单ID,当用户在编辑框控制上单击鼠标右键时,CEitMenuHandler便会显示这个菜单(见图三)。
剩下的事情非常简单,OnUpdateEditCommand更新相应的菜单项,例子如下:
// 在CEditMenuHandler::OnUpdateEditCommand中
switch (nID) {
case ID_EDIT_PASTE:
pCmdUI->Enable(::IsClipboardFormatAvailable(CF_TEXT));
也就是说,当有文本需要粘贴时,CEditMenuHandler使能Paste命令。注意CeditMenuHandler希望你使用标准的MFC 菜单IDs,如ID_EDIT_CUT,ID_EDIT_COPY等。为了处理各自的命令。只要发送WM_CUT,WM_COPY等消息到编辑框控制,CEditMenuHandler就调用CEdit::Cut,CEdit::Copy之类的函数。其实说起来CEdit::Cut,Copy和Paste都是CWnd中的东西,因为任何窗口都能实现它们——但在实际应用中,真正实现它们的只有编辑框控制和组合框控制(组合框里包含编辑框控制)。
希望本文在处理编辑框控制及WM_INITMENUPOPUP消息时对你有帮助。如有任何问题和建议,请使用这个电子邮件地址:zxn@hq.cninfo.net。
更多精彩
赞助商链接