VC的MDI程序中如何获得主菜单的句柄并对其状态和菜单文字进行修改,最好有代码,谢谢!
我在主框架程序中,某个菜单的响应消息中代码CWnd*pMain=AfxGetMainWnd();if(pMain!=NULL){CMenu*pMenu=pMain->Ge...
我在主框架程序中,某个菜单的响应消息中代码
CWnd* pMain = AfxGetMainWnd();
if (pMain != NULL)
{
CMenu* pMenu = pMain-> GetMenu(); //这里永远为空
pMenu->ModifyMenu(ID_FILE_NEW, MF_BYCOMMAND , ID_FILE_NEW, strConnectTitle);
}
}
请求高手指示,哪里错了?该如何编写?分数可以增加! 展开
CWnd* pMain = AfxGetMainWnd();
if (pMain != NULL)
{
CMenu* pMenu = pMain-> GetMenu(); //这里永远为空
pMenu->ModifyMenu(ID_FILE_NEW, MF_BYCOMMAND , ID_FILE_NEW, strConnectTitle);
}
}
请求高手指示,哪里错了?该如何编写?分数可以增加! 展开
3个回答
展开全部
GetMenu(),是得到一个窗口的菜单的句柄。CreateWindow里面有个参数就是设置这个的,MDI/SDI程序都可以通过这个获取主菜单句柄。DLG程序如果有菜单,一样可以获取。
如果是系统菜单——,程序图标的弹出菜单,使用GetSystemMenu。获取主菜单句柄。
如果是右键菜单,大都是临时生成的句柄,不容易得到。除非是实现生成的一个句柄,右键点时候直接使用的。那就能知道这个句柄的值了。
GetMenuItemCount获取菜单项的个数。 GetMenuItemID GetMenuItemInfo GetMenuString等都是获取菜单句柄的某项的数据信息。
GetSubMenu 应该就是你要的函数来,得到子菜单的句柄,比如你要得到弹出菜单的子菜单,就用这个,就能得到子菜单句柄。再根据上面的获取子项的函数,来获取子菜单信息。
(具体看MSND,上面说明很详细,还有例子)
如果是系统菜单——,程序图标的弹出菜单,使用GetSystemMenu。获取主菜单句柄。
如果是右键菜单,大都是临时生成的句柄,不容易得到。除非是实现生成的一个句柄,右键点时候直接使用的。那就能知道这个句柄的值了。
GetMenuItemCount获取菜单项的个数。 GetMenuItemID GetMenuItemInfo GetMenuString等都是获取菜单句柄的某项的数据信息。
GetSubMenu 应该就是你要的函数来,得到子菜单的句柄,比如你要得到弹出菜单的子菜单,就用这个,就能得到子菜单句柄。再根据上面的获取子项的函数,来获取子菜单信息。
(具体看MSND,上面说明很详细,还有例子)
展开全部
你的代码我试过了,是没有问题的。这是我的代码:
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here
CWnd* pMain = AfxGetMainWnd();
if (pMain != NULL)
{
CMenu* pMenu = pMain-> GetMenu(); //这里永远为空
pMenu->ModifyMenu(ID_FILE_NEW, MF_BYCOMMAND , ID_FILE_NEW, "MenuTitle");
}
}
对菜单的状态和文字进行修改,其实不需要这样做,直接为相应的菜单添加UPDATE_COMMAND_UI消息即可,例如在CMainFrame中,可以这样写(这只是更改菜单的几个示例):
void CMainFrame::OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE); // 使菜单无效
pCmdUI->SetCheck(TRUE); // 前面加小勾
pCmdUI->SetText("Close"); // 更改文本
}
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here
CWnd* pMain = AfxGetMainWnd();
if (pMain != NULL)
{
CMenu* pMenu = pMain-> GetMenu(); //这里永远为空
pMenu->ModifyMenu(ID_FILE_NEW, MF_BYCOMMAND , ID_FILE_NEW, "MenuTitle");
}
}
对菜单的状态和文字进行修改,其实不需要这样做,直接为相应的菜单添加UPDATE_COMMAND_UI消息即可,例如在CMainFrame中,可以这样写(这只是更改菜单的几个示例):
void CMainFrame::OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE); // 使菜单无效
pCmdUI->SetCheck(TRUE); // 前面加小勾
pCmdUI->SetText("Close"); // 更改文本
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
错误可能是这儿,AfxGetMainWnd得到的不是你主线程的主窗口。
你的这段代码的是否在主线程里面执行?如果不是的话,是获取不到主线程绑定的主窗口的。
——通过别的方式可以获取。
你的这段代码的是否在主线程里面执行?如果不是的话,是获取不到主线程绑定的主窗口的。
——通过别的方式可以获取。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询