在使用VC++ 2008开发Windows Mobile程序的时候常常会需要更改菜单项的状态,比如更改Checked属性。通常的做法是在程序中加入如下代码:
CMenu *pMenu=this->GetMenu();
If(pMenu!=NULL)
{
pMenu->CheckMenuItem(菜单项ID,MF_CHECKED 或 MF_UNCHECKED);
}
但是在使用VC2008开发PDA应用程序的过程中,在对话框类中加入上面方法却不能改变菜单项的状态,原因是当菜单被点击的过程时候会发出WM_INITMENUPOPUP消息,如果程序没有代码响应该消息则MFC默认程序再响应该消息的时候会将菜单项的状态恢复原状,因此若要使上述代码有效,则必须相应该消息。用过VC6.0的朋友都会下意识的找UPDATE_COMMAND_UI事件,可是VC++2008下没有提供该通用事件,因此只能靠响应WM_INITMENUPOPUP消息来实现了。传统对话框程序可以很容易的在属性——事件列表中找到WM_INITMENUPOPUP事件,而如果程序为SDI应用程序则必须要在CMainFrame类中手动创建该消息的响应函数。创建步骤如下:
首先在MainFrame.cpp中添加消息影射标志,代码如下:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_INITMENUPOPUP() //响应WM_INITMENUPOPUP事件
END_MESSAGE_MAP()
其次在MainFrame.h中添加消息相应成员函数,代码如下:
prvate:
afx_msg void OnInitMenuPopup(CMenu *pMenu,UINT nStyle,BOOL bSysMenu);
最后,在MainFrame.cpp中添加该函数的实现,代码如下:
void CMainFrame::OnInitMenuPopup(CMenu *pMenu,UINT nStyle,BOOL bSysMenu)
{
//修改菜单状态
if(nDisplayMode==DISP_MODE_FULL){
pMenu->CheckMenuItem(菜单ID,MF_CHECKED 或 MF_UNCHECKED);
}
}
运行程序后,菜单项状态将会被显示
QQ:819543772
EMail:wuchunlei@163.com