WEB开发网
开发学院软件开发VC 定制编辑框的上下文菜单 阅读

定制编辑框的上下文菜单

 2006-04-05 11:18:49 来源:WEB开发网   
核心提示: // CMyEdit中的消息映射ON_COMMAND(ID_FILETYPE_TXT, OnFiletypeTXT)void CMyEdit::OnFiletypeTXT(){SetWindowText(_T("txt"));SetSel(0,-1);}CMyEdit将

// 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。

上一页  1 2 3 

Tags:定制 编辑 上下文

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接