他小的有

MFC动态添加弹出式菜单

今天一个同事问到了我怎么用MFC创建一个动态的弹出式的菜单,之前也没用过,不过根据之前的经验然后参考了一下网上的资料,现在将它记录一下,方便以后可能会用到。

第一步,首先定义一个CMenu对象:

CMenu *m_pMenu;

第二步,在初始化的时候new一个对象(在堆中):

//创建对象
m_pMenu = new CMenu();

第三步,在窗口初始化或需要(比如从文件中加载)的时候附加子菜单:

m_pMenu->CreatePopupMenu();
m_pMenu->AppendMenu(MF_STRING, 10000, _T("学号"));
m_pMenu->AppendMenu(MF_STRING, 10001, _T("姓名"));
m_pMenu->AppendMenu(MF_STRING, 10002, _T("性别"));

第四步,在需要地方弹出子菜单,可以响应鼠标按钮消息,也可以是一个按钮,这里在按钮中响应,当然也可以在直接在响应鼠标消息之后创建子菜单和弹出(第三和第四步一起):

void CMenuDemoDlg::OnBnClickedButtonPopMenu()
{
	// TODO: Add your control notification handler code here
	POINT pt;
	GetCursorPos(&pt);
	m_pMenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
}

第五步,响应点击了哪一个菜单的消息,重写虚函数OnCommand(WPARAM wParam, LPARAM lParam),然后在里面调用GetMenuString就可以获取选中的子菜单标题了,之后就可以处理你需要处理的事情了。

BOOL CMenuDemoDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
	// TODO: Add your specialized code here and/or call the base class
	WORD wCode = HIWORD(wParam);  //类型
	WORD wID = LOWORD(wParam);  //ID
	if (0 == wCode)
	{
		//选中了第一个
		if (10000 == wID)
		{
			CString str;
			m_pMenu->GetMenuString(wID, str, MF_BYCOMMAND);
			AfxMessageBox(str);
		}
	}

	return CDialogEx::OnCommand(wParam, lParam);
}

第六步,最后别忘记了在窗口销毁的时候销毁菜单和删除CMenu对象指针:

//窗口销毁时
BOOL CMenuDemoDlg::DestroyWindow()
{
	// TODO: Add your specialized code here and/or call the base class
	if (NULL != m_pMenu)
	{
		//销毁菜单
		if (NULL != m_pMenu->m_hMenu)
		{
			m_pMenu->DestroyMenu();
		}

		//删除CMenu对象
		delete m_pMenu;
		m_pMenu = NULL;
	}

	return CDialogEx::DestroyWindow();
}

好久不用MFC了,消息路由的过程都忘得差不多了,不过框架和概念还是有的,抽出来然后放回去,就当是记录贴了。

blob.png

下载地址:http://files.suchone.com/upload/2015/12/20151219005349_37849.zip


本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!

1
分享到:

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址