就是想更改它原来的“复制、粘贴”什么的改成自己想要的操作。
网上找到的都是Microsoft Visual C++ 6.0 SP6 英文版的,貌似现在这个消息处理机制改变了。高人讲讲Microsoft Visual Studio.Net 2005/2008中怎么做啊
网上找到的都是Microsoft Visual C++ 6.0 SP6 英文版的,貌似现在这个消息处理机制改变了。高人讲讲Microsoft Visual Studio.Net 2005/2008中怎么做啊
解决方案 »
- 各位高手,紧急求救!内存泄漏!
- 如何获取应用程序下所有子控件鼠标弹起消息
- 编译错误:LIBCMT.lib(ctr0.obj):error LNK2001
- 问一个很白痴的问题
- 关于移位操作
- 请教
- 帮忙读读这段代码,GetSystemMetrics(SM-CXFRAME);GetSystemMetrics(SM-CYSIZE);特别这两个函数!最好没行都加注释~不好意思,我的分布
- Intel IPP库ippmInvert_m_64f_3x3函数找不到
- 一个dll文件,怎么能看到它的所有函数和资源呢?
- 如何利用C++制作‘ B+ 树’,火急(急需范本程序)
- CSplitterWnd的动态拆分窗口.是怎么实现的,原理!!!
- 如何解决MFC中 界面切换引起的对话框上图片消失
图三 使用CeitMenuHandler类有三件事情要做(如果要把设计菜单本身算在内的话,那就有四件事情要做): 第一,实例化处理器。
class CMyEdit : public CEdit {
protected:
CEditMenuHandler m_editMenuHandler;
virtual void PreSubclassWindow();
}; 第二,必须安装第一部创建的处理器。你可以在OnCreate做,但如果编辑框控制是在对话框中,则在PreSubclassWindow中安装,因为你不是正常地创建对话框控制:而是要进行子类化工作。安装完处理器,还得传递一个上下文菜单的ID:
void CMyEdit::PreSubclassWindow()
{
//IDR EDITMENU 是我的上下文菜单
m_editMenuHandler.Install(this, IDR_EDITMENU);
} 到了这一步,处理器已经安装并且已经准备就绪,只需要调用两个函数。OnUpdateEditCommand 更新菜单项;OnEditCommand 处理命令。 // CMyEdit 消息映射
ON_COMMAND_RANGE(ID_EDIT_FIRST,
ID_EDIT_LAST, OnEditCommand)
ON_UPDATE_COMMAND_UI_RANGE(ID_EDIT_FIRST,
ID_EDIT_LAST, OnUpdateEditCommand)
void CMyEdit::OnUpdateEditCommand(CCmdUI* pCmdUI)
{
m_editMenuHandler.OnUpdateEditCommand(pCmdUI));
}
void CMyEdit::OnEditCommand(UINT nID)
{
m_editMenuHandler.OnEditCommand(nID);
} CEitMenuHandler把什么事情都做了,处理剪切、复制、粘贴和其它操作。根据是文档选中还是剪切板有内容等来使能或置灰(enables/disables)相应的菜单项。如果命令被处理,处理器函数返回TRUE;否则返回FALSE,如果你愿意,你可以处理其它编辑命令。例如,CMyEdit有单独的处理器处理TXT,BMP和JPG命令。 // 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消息时对你有帮助。如有任何问题和建议,请使用这个电子邮件地址:[email protected]。
使用CeitMenuHandler类有三件事情要做(如果要把设计菜单本身算在内的话,那就有四件事情要做): 第一,实例化处理器。
class CMyEdit : public CEdit {
protected:
CEditMenuHandler m_editMenuHandler;
virtual void PreSubclassWindow();
}; 第二,必须安装第一部创建的处理器。你可以在OnCreate做,但如果编辑框控制是在对话框中,则在PreSubclassWindow中安装,因为你不是正常地创建对话框控制:而是要进行子类化工作。安装完处理器,还得传递一个上下文菜单的ID:
void CMyEdit::PreSubclassWindow()
{
//IDR EDITMENU 是我的上下文菜单
m_editMenuHandler.Install(this, IDR_EDITMENU);
} 到了这一步,处理器已经安装并且已经准备就绪,只需要调用两个函数。OnUpdateEditCommand 更新菜单项;OnEditCommand 处理命令。 // CMyEdit 消息映射
ON_COMMAND_RANGE(ID_EDIT_FIRST,
ID_EDIT_LAST, OnEditCommand)
ON_UPDATE_COMMAND_UI_RANGE(ID_EDIT_FIRST,
ID_EDIT_LAST, OnUpdateEditCommand)
void CMyEdit::OnUpdateEditCommand(CCmdUI* pCmdUI)
{
m_editMenuHandler.OnUpdateEditCommand(pCmdUI));
}
void CMyEdit::OnEditCommand(UINT nID)
{
m_editMenuHandler.OnEditCommand(nID);
} CEitMenuHandler把什么事情都做了,处理剪切、复制、粘贴和其它操作。根据是文档选中还是剪切板有内容等来使能或置灰(enables/disables)相应的菜单项。如果命令被处理,处理器函数返回TRUE;否则返回FALSE,如果你愿意,你可以处理其它编辑命令。例如,CMyEdit有单独的处理器处理TXT,BMP和JPG命令。