在VS2010中实现MFC富文本框添加右键菜单

    程序运行工具,采用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、程序运行结果如下。如需要给子菜单添加功能需要另外在对应事件处理程序出添加。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值