龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC定制编辑框的上下文菜单[组图](3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
// CMyEdit中的消息映射 ON_COMMAND(ID_FILETYPE_TXT, OnFiletypeTXT) void CMyEdit::OnFiletypeTXT() { SetWindowText(_T("txt")); SetSel(0,-1); } CMyEdit将编辑命令传给CEitMenuHandler并自己处理

  // 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对象。---www.bianceng.cn

  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。

精彩图集

赞助商链接