网上这有很多这类的代码。但是我在实现的时候,GetSubMenu(0)总是为空。程序是基于对话框的,运行环境是XP+VC6.0.具体的代码如下: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;
}
{
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;
}
menu.LoadMenu(IDR_MENU1);
ASSERT(menu.GetSafeHmenu()); ?? 这个成立吗?
|------------|
| 打开 |效果是:view as popup ID为ID_MENU_OPEN
|------------|
| 关闭 |效果是:view as popup ID为ID_MENU_CLOSE
|------------|
{
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);
}
}
参考。
还有除了这点,貌似你的代码和我的没什么区别。
|------------|
| 打开 |效果是:ID为ID_MENU_OPEN
|------------|
| 关闭 |效果是:ID为ID_MENU_CLOSE
|------------|