程序运行工具,采用Visual Studio 2010。实现MFC富文本框添加右键菜单步骤如下。
1.选择菜单项文件->新建->项目,弹出“新建项目”对话框。
2.左侧面板中“已安装的模板”的Visual C++下选择MFC,中间窗口中选择“MFC 应用程序”,保存至目标文件夹。然后在下面的名称编辑框中键入工程名称,本例将文件名命名为“RICHEDITMENUA”,在位置编辑框中设置工程的保存路径。点“确定”。
3.点“下一步”到“MFC应用程序向导”对话框,在“应用程序类型”下选择“基于对话框”,其他使用默认设置,点“完成”。
4、点击“视图”->"工具箱",将富文本框(Rich Edit 2.0 Control)添加到对话框中,并将默认添加的按钮和文字删去。
5、右键富文本框查看其属性,本例中将富文本框的ID改为IDC_RICHEDITMENU,其他属性默认。
6、点开RICHEDITMENU.cpp,进去其BOOL CRICHEDITMENUApp::InitInstance()程序中,将下列富文本框初始化程序放入。富文本框必须进行初始化,注意将这段程序位置尽量靠前,否则程序运行会提示内存泄漏。
//富文本框初始化
AfxInitRichEdit();
if (LoadLibrary(_T("RICHED20.DLL")) == NULL)
{
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
return FALSE;
}
7、点击视图->资源视图,右键工程选择添加->资源,右键添加的menu,可以更改menu的ID,也可以不更改,本例中ID改为IDR_MENUTEST。
8、添加按钮菜单的子菜单,分别为程序员,程序猿,程序媛,其ID分别为ID_TEST_PROGRAMER_ONE,ID_TEST_PROGRAMER_TWO,ID_TEST_PROGRAMER_THRE。保存后程序才能识别。再为每个子菜单添加消息类型为COMMAND的事件处理程序。
9、在资源视图中,通过类向导,给对话框添加消息处理函数。添加3个消息处理程序WM_RBUTTONUP、WM_CONTEXTMENU和WM_DESTROY。
10、修改void CRICHEDITMENUDlg::OnContextMenu(CWnd* pWnd, CPoint point)中的程序
添加如下代码:
CMenu popMenu;
//载入菜单
popMenu.LoadMenu(IDR_MENUTEST);
CMenu *pPopup;
//获得子菜单指针
pPopup=popMenu.GetSubMenu(0);
//允许菜单项使用
pPopup->EnableMenuItem(ID_TEST_PROGRAMER_ONE,MF_BYCOMMAND|MF_ENABLED);
//不允许菜单项使用
pPopup->EnableMenuItem(ID_TEST_PROGRAMER_TWO,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
//允许菜单项使用
pPopup->EnableMenuItem(ID_TEST_PROGRAMER_THREE,MF_BYCOMMAND|MF_ENABLED);
//显示弹出菜单,参数依次为(鼠标在菜单左边|跟踪右键,x,y,this)
//pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,GetParent());
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
pPopup->Detach();
//销毁menu
在指定控件中弹出右键,代码如下
//定义矩形区域
CRect rect;
//获取控件区域的矩形
GetDlgItem(IDC_RICHTEST)->GetWindowRect(&rect);
if(rect.PtInRect(point))
{
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENUTEST));
CMenu* pPopup=menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
//pPopup=popMenu.GetSubMenu(0);
//允许菜单项使用
pPopup->EnableMenuItem(ID_ABC_CLEAR,MF_BYCOMMAND|MF_ENABLED);
pPopup->EnableMenuItem(ID_ABC_COPY,MF_BYCOMMAND|MF_ENABLED);
//不允许菜单项使用
//pPopup->EnableMenuItem(ID_ABC_COPY,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
//在鼠标当前位置显示指定菜单
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);
pPopup->Detach();
//销毁menu
menu.DestroyMenu();
}
11、程序运行结果如下。如需要给子菜单添加功能需要另外在对应事件处理程序出添加。