CListCtrl响应鼠标右键点击弹出菜单
网上这有很多这类的代码。但是我在实现的时候,GetSubMenu(0)总是为空。程序是基于对话框的,运行环境是XP+VC6.0.具体的代码如下:
C/C++ code
C/C++ code
void CProcess_InfromationDlg::OnRclickTotalInfo(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem != -1) { DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); CMenu menu; VERIFY( menu.LoadMenu( IDR_MENU1) ); //加载菜单正确的。 /* 菜单的格式是 |------------| | 打开 |view as popup |------------| | 关闭 |view as popup |------------| */ CMenu* popup = menu.GetSubMenu(0); //这里总是为空。为什么?????? ASSERT( popup != NULL ); popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this ); } *pResult = 0; }
作者: shaotine_wu 发布时间: 2011-06-16
CMenu menu;
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu()); ?? 这个成立吗?
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu()); ?? 这个成立吗?
作者: VisualEleven 发布时间: 2011-06-16
你把CMenu menu;做成全局的把,现在是局部的,可能被释放了
作者: bdmh 发布时间: 2011-06-16
你资源文件的IDR_MENU1里面有子菜单项么?
作者: kyotrue 发布时间: 2011-06-16
引用 1 楼 visualeleven 的回复:
CMenu menu;
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu()); ?? 这个成立吗?
CMenu menu;
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu()); ?? 这个成立吗?
这个是成立的,刚刚调试了
作者: shaotine_wu 发布时间: 2011-06-16
引用 2 楼 bdmh 的回复:
你把CMenu menu;做成全局的把,现在是局部的,可能被释放了
你把CMenu menu;做成全局的把,现在是局部的,可能被释放了
结果是一样的,还是为空
作者: shaotine_wu 发布时间: 2011-06-16
引用 3 楼 kyotrue 的回复:
你资源文件的IDR_MENU1里面有子菜单项么?
你资源文件的IDR_MENU1里面有子菜单项么?
菜单IDR_MENU1的子菜单为下面格式:
|------------|
| 打开 |效果是:view as popup ID为ID_MENU_OPEN
|------------|
| 关闭 |效果是:view as popup ID为ID_MENU_CLOSE
|------------|
作者: shaotine_wu 发布时间: 2011-06-16
void CXXXDlg::OnNMRclickTasklist(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->iItem == -1)
{
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
CMenu menu;
VERIFY(menu.LoadMenu(IDR_TASK_BLANK));
CMenu* popup = menu.GetSubMenu(0);
ASSERT(popup != NULL);
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
}
参考。
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->iItem == -1)
{
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
CMenu menu;
VERIFY(menu.LoadMenu(IDR_TASK_BLANK));
CMenu* popup = menu.GetSubMenu(0);
ASSERT(popup != NULL);
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
}
参考。
作者: oldmtn 发布时间: 2011-06-16