VC++2008下响应WM_INITMENUPOPUP事件更改菜单项状态

         在使用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:[email protected]

你可能感兴趣的:(vc++)