我的想法是:
CMenu *checkMenu;
然后 将chenckMenu指向名为IDR_MENU1 的menu,
然后 checkMenu.GetSubMenu(0);
然后 checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);
这样可以再那个选项上显示被打勾的标志,
下次如果checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_UNCHECKED);就将标识除去。但是我不知道如何将指针指向名为IDR_MENU1 的menu,
也不知道checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);是否需要updatedata来更新显示还是它会自动显示,
请多多指点,谢谢!
CMenu *checkMenu;
然后 将chenckMenu指向名为IDR_MENU1 的menu,
然后 checkMenu.GetSubMenu(0);
然后 checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);
这样可以再那个选项上显示被打勾的标志,
下次如果checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_UNCHECKED);就将标识除去。但是我不知道如何将指针指向名为IDR_MENU1 的menu,
也不知道checkMenu.CheckMenuItem(ID_SHUTDOWN,MF_CHECKED);是否需要updatedata来更新显示还是它会自动显示,
请多多指点,谢谢!
解决方案 »
- 想用MFC写个计算器,卡在了数据处理上,大家给个思路
- VS向类添加成员函数问题
- 求一个利用COM读WORD内容的例子
- 完成端口的数据流顺序问题,救命啊.!!!
- 如何得到整个FlexGrid宽度和长度的数值??
- 急问:关于单文档菜单问题 (在线等待,非常感谢!)
- 求救呀!我现在在同一程序中一方接收UDP包,一方建立tcp连接,可为什么在程序从启动到运行一段时间都比较正常,可一段时间后会出现接收不
- 各位高手们,在COM中,什么叫非虚拟继承?
- 目的:16个按钮,单击每个按钮,并用SetState(1)来显示按下状态,再点击一下,SetState(0),恢复原状。但为什么我SetState(1)后,
- 以前做php,vc,现在要我做图像编程,从哪里入手??????
- 求助 关于 PIDL
- 位图按钮条件显示不同位图
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if (!bSysMenu)
{
//查看弹出菜单中是否包含 ID_SHUTDOWN 项。
int nCount = pPopupMenu->GetMenuItemCount();
for (int i = 0; i < nCount; i++)
{
if (pPopupMenu->GetMenuItemID(i) == ID_SHUTDOWN)
{
pPopupMenu->CheckMenuItem(ID_SHUTDOWN, MF_BYCOMMAND | (m_bChecked ? MF_CHECKED : MF_UNCHECKED));
break;
}
}
}
}
checkMenu.GetSubMenu(1)->CheckMenuItem(1,MF_BYPOSITION|MF_CHECKED);//这里的1是个举例,具体看你的设计
另外,在类向导里添加ON_UPDATE_COMMAND_UI消息函数,
里面实现
CheckMenuItem(1,MF_BYPOSITION|MF_UNCHECKED)
不用updatedata
if ( lp == WM_RBUTTONDOWN )
{
checkShutDown = false;
::AfxGetMainWnd()->SetForegroundWindow();
CMenu menu;
menu.LoadMenu(IDR_MENU_RIGHT);
CMenu *pPopup= menu.GetSubMenu(1);
pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);
CPoint point;
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
} 但是如果把CMenu menu;CMenu *pPopup放在类的成员变量里,就会报错,不知道为什么...
是处理窗口主菜单,修改后,现在的菜单只有一个,但是有两个子菜单,想在第二个子菜单的第一项上做打勾操作。
GetMenu()->GetSubMenu(1)->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); 只是我这样做程序直接死掉了。
...
void CUploadFilesDlg::OnShellNotify( WPARAM wp, LPARAM lp )
{
if ( lp == WM_LBUTTONDOWN )
{
if ( IsWindowVisible() )
ShowWindow( SW_HIDE );
else
SetWindowPlacement( & m_wndPlaceMent );
} if ( lp == WM_RBUTTONDOWN )
{
checkShutDown = false;
::AfxGetMainWnd()->SetForegroundWindow();
// CMenu menu; ------------和CMenu *pPopup 放在成员变量里
menu.LoadMenu(IDR_MENU_RIGHT);
// CMenu *pPopup= menu.GetSubMenu(1);
pPopup= menu.GetSubMenu(1);
// pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); --可以被打勾
CPoint point;
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
}
}---托盘的右键菜单//来更改check的状态的函数
void CUploadFilesDlg::OnShutdown()
{
// TODO: Add your command handler code here
if(!checkShutDown)
{
pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);//--直接死掉???
checkShutDown = true;
}
else
{
pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_UNCHECKED);
checkShutDown = false;
}
}
{
checkShutDown = false;
::AfxGetMainWnd()->SetForegroundWindow();
// CMenu menu; ------------和CMenu *pPopup 放在成员变量里
menu.LoadMenu(IDR_MENU_RIGHT);
// CMenu *pPopup= menu.GetSubMenu(1);
pPopup= menu.GetSubMenu(1);
// pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED); --可以被打勾 ,但是会死程序。如果CMenu menu; 和CMenu *pPopup 放在函数局部变量里,不会死。
CPoint point;
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
}
{
checkShutDown = false; ::AfxGetMainWnd()->SetForegroundWindow();
CMenu menu;
menu.LoadMenu(IDR_MENU_RIGHT);
CPoint point;
GetCursorPos(&point);
menu.GetSubMenu(1)->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
}
在函数里定义menu一切正常,如果将 CMenu menu;定义在全局或者成员变量里,右键点击就只是一次,第二次就死程序,麻烦老大们指点。谢谢
{
checkShutDown = false;::AfxGetMainWnd()->SetForegroundWindow();
CMenu menu;
menu.LoadMenu(IDR_MENU_RIGHT);
CMenu *pPopup= menu.GetSubMenu(1);
pPopup= menu.GetSubMenu(1);
pPopup->CheckMenuItem(0, MF_BYPOSITION | (checkShutDown ? MF_CHECKED : MF_UNCHECKED));
CPoint point;
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd(),NULL);
::AfxGetMainWnd()->PostMessage(WM_NULL,0,0);
}
}
void CUploadFilesDlg::OnShutdown()
{
// TODO: Add your command handler code here
if(!checkShutDown)
{
pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);//--直接死掉???checkShutDown = true;
}
else
{
pPopup->CheckMenuItem(0, MF_BYPOSITION|MF_UNCHECKED);checkShutDown = false;}
}
---------------------------------
我现在右键点托盘,正确显示出了MENU中第二菜单(只需要显示第二菜单)。只是我想在这个右键菜单的第一项加上打勾的功能。
改成
CMenu *pPopup= menu.GetSubMenu(0);