MFC中右键菜单显示问题

微澜星空 2014-03-04 03:45:23
先上图

定义了菜单以后,右键后,菜单显示不全,不知道怎么回事,用mfc不是很多,我的右键消息的代码是
void CMainFrame::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
CMenu menu;
CPoint pot;
CMenu* pPopup;
VERIFY(menu.LoadMenu(IDR_RBmenu));

//pPopup = menu.GetSubMenu(0);
GetCursorPos(&pot);

menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, pot.x, pot.y,this);
//pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pot.x, pot.y,this);

*pResult = 0;
}
...全文
359 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yileida 2014-10-27
  • 打赏
  • 举报
回复
6楼很对 楼主我也遇到一样的问题,解决方法是必须有二级菜单 比如 添加-删除,这样的话显示效果就和你的一样。 添加 添加 删除 就能正常显示添加删除了!
SlimTracy 2014-10-23
  • 打赏
  • 举报
回复
首先菜单资源必须要有子菜单,就是Menu[“文件”]{MenuA["保存"],MenuB["载入"]}。然后通过LoadMenu加载菜单资源到Menu。Menu。GetSubMenu(0)得到子菜单{MenuA["保存"],MenuB["载入"]},子菜单再TrackPopupMenu显示。
微澜星空 2014-03-04
  • 打赏
  • 举报
回复
好了,用动态创建右键菜单的方法就可以了,上面两位的方法也都可以,不过我不知道我的有什么问题,总是获取不到子菜单
微澜星空 2014-03-04
  • 打赏
  • 举报
回复
引用 2 楼 lfy2217 的回复:
HMENU hroot = LoadMenuA(NULL, "MENU");
		if (hroot)
		{
			POINT pt = msg.ptMouse;
			ClientToScreen(m_hWnd,&pt);
			HMENU hpop = GetSubMenu(hroot,0);
			TrackPopupMenu(hpop,  
				TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,  
				pt.x,  
				pt.y,  
				0,  
				m_hWnd,  
				NULL);  
			// 用完后要销毁菜单资源  
			DestroyMenu(hroot); 
		}
这是我以前用过的一段 获取坐标的部分可以忽略掉,其他的部分可以参考下
你的和上面的那位版主的应该是一样的,但是我这样写Menu.GetSubMenu(0),那个指针是空的,然后不会弹出菜单,不知道怎么回事
微澜星空 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 arpnet99 的回复:
// CMenu Menu,*pMenu; // Menu.LoadMenu(IDR_MENU_POP); // pMenu=Menu.GetSubMenu(0); // POINT pt; // GetCursorPos(&pt); // pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,this);
这样写的话,会出现错误,能运行,但是调试的时候会出现 好像指针是空的,不知道怎么回事
cngaler 2014-03-04
  • 打赏
  • 举报
回复
HMENU hroot = LoadMenuA(NULL, "MENU");
		if (hroot)
		{
			POINT pt = msg.ptMouse;
			ClientToScreen(m_hWnd,&pt);
			HMENU hpop = GetSubMenu(hroot,0);
			TrackPopupMenu(hpop,  
				TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,  
				pt.x,  
				pt.y,  
				0,  
				m_hWnd,  
				NULL);  
			// 用完后要销毁菜单资源  
			DestroyMenu(hroot); 
		}
这是我以前用过的一段 获取坐标的部分可以忽略掉,其他的部分可以参考下
这不是鸭头 2014-03-04
  • 打赏
  • 举报
回复
// CMenu Menu,*pMenu; // Menu.LoadMenu(IDR_MENU_POP); // pMenu=Menu.GetSubMenu(0); // POINT pt; // GetCursorPos(&pt); // pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,this);
打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/9mgm3 在MFC类库为开发者提供了构建Windows应用程序的便利的基础上,本篇文章详细讲解如何在MFC应用实现自绘或重绘右键菜单CMenu的功能。该功能允许开发者创建个性化的用户界面。自绘(Custom Draw)或重绘(Redraw)是指在系统默认渲染基础上,通过调用特定的API函数或MFC类的方法来控制控件显示样式和效果。在MFC,我们通常会使用`CMenu`类来操作菜单功能模块划分得更清晰。具体来说,我们需要处理`WM_MEASUREITEM`和`WM_DRAWITEM`消息。这两个消息是Windows系统向拥有自绘控件的窗口发送的消息,用于获取控件尺寸信息并绘制外观。对于一个典型的自绘应用,需要在派生自`CFrameWnd`或`CDialog`的类重载与菜单相关的成员函数。例如,在实现自绘菜单时,我们需要先设置菜单项的高度和宽度,并根据字体大小和边距进行调整(代码示例略)。在绘制逻辑部分,则会详细描述如何通过调用特定的方法来显示带有渐变背景和描边的菜单项。为了确保消息能够正确处理,需要在创建菜单时设置`ODS_OWNERDRAW`标志,并在适当的时候调用相关函数以标记为自绘。此外,在实际开发可能会遇到一些细节问题,例如如何优化性能或解决兼容性问题等。总体来说,通过掌握这些技术要点,开发者可以灵活运用MFC类库来实现更复杂的菜单功能并提升应用的用户体验。

15,977

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧