使用CXTTrayIcon时,动态改变菜单项的方法

使用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);
其他处理同上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值