我在写托盘程序的时候发现一个奇怪的问题
我首先生成一个cmenu对象,然后加载cmenu资源,接着屏蔽一些菜单项
然后启动系统托盘,这时候显示正常(状态1)
当通过用户认证之后,我开放一些菜单项,然后屏蔽另一些菜单项,可是发现这时候的系统菜单还是原来的样子(状态1)
我的程序如下:其中m_pmenu通过setMenu指向一个全局CMenu *变量,我通过其中标示了//->的语句检查了菜单项的状态,发现状态已经更改了,这是为什么?LRESULT CSysTray::OnTrayNotification(WPARAM wID, LPARAM lEvent){
if (wID!=m_nid.uID ||
(lEvent!=WM_RBUTTONUP && lEvent!=WM_LBUTTONDBLCLK))
return 0; if( m_pmenu ){
//->int retCode = m_pmenu->GetMenuState(IDM_USER_AUTH, MF_BYCOMMAND | MF_DISABLED);
if (lEvent==WM_RBUTTONUP) { CMenu * pmenu = m_pmenu->GetSubMenu(0);
//pmenu->EnableMenuItem(0, MF_BYPOSITION | MF_ENABLED);
//pmenu->SetDefaultItem(0, TRUE); CPoint mouse;
GetCursorPos(&mouse);
::SetForegroundWindow(m_nid.hWnd);
pmenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_LEFTBUTTON, 
mouse.x, mouse.y, ::AfxGetMainWnd(), NULL); } else 
::SendMessage(m_nid.hWnd, WM_COMMAND, m_pmenu->GetMenuItemID(0), 0);
} return 1; // handled
}

解决方案 »

  1.   

    看不懂,你根据不同的情况load不同的菜单资源,不同的菜单资源的部分菜单影射相同的消息函数,应该可以。
      

  2.   

    就是在系统启动的时候,加载系统主菜单,然后disable掉几个暂时无法使用的菜单项,使用EnableMenuItem(),譬如IDM_GOTO、IDM_GET,然后把菜单对象指针提交给CSysTray,当用户登录之后,我需要重新enable IDM_GOTO、IDM_GET这两个菜单项,然后disable IDM_USER_AUTH菜单项
      

  3.   

    设置CMainFrame的m_bAutoMenuEnable为FALSE
      

  4.   

    thank flyelf
    问题解决了