急********急*******急死了,100分求大虾救命,如何给对话框弹出菜单中的选项打上选定小勾(checked)????
我在对话框里加了一个treectrl;希望右健点击树的某个结点时弹出菜单,对菜单的某个子项(子项名为“常用”相应函数为OnEditFreqshow和OnUpdateEditFreqshow)设置checked选择,选择时打勾。
程序中对话框类CDlog,树的类为CWizardTree
void CWizardTempTree::OnEditFreqshow()
{
UpdateData( TRUE ) ;
HTREEITEM hSelItem = GetSelectedItem() ;
if( ! hSelItem )
{
return ;
}
……
if(……)
m_bCheckMark = FALSE;
else if(……)
m_bCheckMark = TRUE;
}
void CWizardTree::OnUpdateEditFreqshow(CCmdUI *pCmdUI)
{
if(m_bCheckMark)
{
cMenu.CheckMenuItem(ID_EDIT_FREQSHOW,MF_CHECKED);
}
else
{
cMenu.CheckMenuItem(ID_EDIT_FREQSHOW,MF_UNCHECKED);
}
return;
}
现在运行时开始右键点击树的某个结点后选择“常用”,反复选两次小勾才会正常选择和取消,还有所有结点小勾的选择状态相一致,即某个结点选勾所有的都有小勾,不选了所有的都没有。
折腾了两天了,查了好多资料还是搞不定,请大家帮忙。
[解决办法]
在OnUpdateEditFreqshow中:
pCmdUI-> SetCheck(m_bCheckMark);
[解决办法]
ModifyMenu 试试看
[解决办法]
在菜单弹出之前,修改
[解决办法]
CheckMenuItem在弹出前调用!
[解决办法]
void CWizardTree::OnUpdateEditFreqshow(CCmdUI *pCmdUI)
{
if(m_bCheckMark)
{
cMenu.CheckMenuItem(ID_EDIT_FREQSHOW,MF_CHECKED);
}
else
{
cMenu.CheckMenuItem(ID_EDIT_FREQSHOW,MF_UNCHECKED);
}
return;
}
能不全部打勾吗??至于两次来说,那是因为
void CWizardTempTree::OnEditFreqshow()
{
UpdateData( TRUE ) ;
HTREEITEM hSelItem = GetSelectedItem() ;
if( ! hSelItem )
{
return ;
}
……
if(……)
m_bCheckMark = FALSE;
else if(……)
m_bCheckMark = TRUE;
}
第一次是先Update再执行
if(……)
m_bCheckMark = FALSE;
else if(……)
m_bCheckMark = TRUE;
等到第二次点的时候:
Update到上一次的操作.
[解决办法]
CMenu menu;
menu.LoadMenu(IDR_MYMENU);
CMenu* pSubMenu = menu.GetSubMenu(0);
pSubMenu-> CheckMenuItem(ID_EDIT_FREQSHOW,m_bCheckMark ? MF_CHECKED : MF_UNCHECKED);
TrackPopupMenuEx(pSubMenu, ....);
[解决办法]
定义一个标志变量如果这个小勾是互斥的,比如int Sign;
Update的时候用pCmdUI-> SetCheck(Sign==XX)
如果在其他函数中改变Sign,并且想在该函数没有退出之前就更新则要使用UpdateDialogControls(this,flase);
没时间看你的详细代码~就这样掠过~望见晾