使用CXTTrayIcon时,动态改变菜单项的方法
在程序中使用了CXTTrayIcon,发现不能动态改变菜单项,如禁止/允许菜单项,修改菜单的文本等。
在看了CXTTrayIcon的源码后发现找到了两种解决的办法:
1.如果在对话框中直接使用了CXTTrayIcon变量,则要在对话框中增加消息处理函数
afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
BEGIN_MESSAGE_MAP(CTrayIconTestDlg, CDialog)
//{{AFX_MSG_MAP(CTrayIconTestDlg)
//}}AFX_MSG_MAP
ON_MESSAGE(TIN_XT_TRAYICON,OnTrayNotification)
END_MESSAGE_MAP()
LRESULT CTrayIconTestDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(lParam)) {
case WM_RBUTTONUP:
{
CMenu menu;
if (!menu.LoadMenu(IDR_MENU1)) {
return 0;
}
CMenu* pSubMenu = menu.GetSubMenu(0);
if (pSubMenu == NULL) {
return 0;
}
// Display the menu at the current mouse location. There's a "bug"
// (Microsoft calls it a feature) in Windows 95 that requires calling
// SetForegroundWindow. To find out more, search for Q135788 in MSDN.
//
CPoint pos;
GetCursorPos(&pos);
menu.EnableMenuItem(ID_MENUITEM_MENU1,MF_DISABLED|MF_GRAYED);
menu.CheckMenuItem(ID_MENUITEM_MENU2,MF_CHECKED);
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y,
0,this->m_hWnd, NULL);
menu.Detach();
}
break;
}
return TRUE;
}
注意的地方: 一定要返回TRUE,以避免CXTTrayIcon的处理;
使用menu.EnableMenuItem(ID_MENUITEM_MENU1,MF_DISABLED|MF_GRAYED)禁止菜单项的时候,一定要注意加上MF_GRAYED
2.如果新建类CTrayIconEx继承自CXTTrayIcon的话,则可以覆盖CXTTrayIcon中的消息处理函数:
virtual afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
其他处理同上