VC Tray Icon的使用

博客介绍了为CMainFrame增加成员变量,在OnCreate函数末尾添加系统托盘图标相关设置,增加消息WM_TRAYICON响应函数处理不同鼠标事件。还提到若要屏蔽窗口关闭按钮需增加消息处理函数,最后在窗口Destroy函数调用删除系统托盘图标的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为CMainFrame增加如下的成员变量:
 NOTIFYICONDATA m_trayIcon;
 CMenu m_menuTray;

在CMainFrame的OnCreate函数末尾增加:
 m_trayIcon.cbSize = sizeof(NOTIFYICONDATA);
 m_trayIcon.hIcon = (HICON)LoadImage(AfxGetApp()->m_hInstance,
  MAKEINTRESOURCE(IDI_TRAYICON), IMAGE_ICON, 16, 16, 0);
 m_trayIcon.hWnd = m_hWnd;
 m_trayIcon.uID = MAINTRAYICON;
 m_trayIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
 m_trayIcon.uCallbackMessage = WM_TRAYICON;
 strcpy(m_trayIcon.szTip, LoadResString(IDS_TOOLTIP));
 Shell_NotifyIcon(NIM_ADD, &m_trayIcon);

增加消息WM_TRAYICON响应函数:
ON_MESSAGE(WM_TRAYICON,OnTrayNotify)

int CMainFrame::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
 if(wParam != MAINTRAYICON)
  return 0L;
 
 if(m_menuTray.m_hMenu == NULL && !m_menuTray.LoadMenu(IDR_MAINFRAME))
  return 0;
 
 CMenu* pSubMenu = m_menuTray.GetSubMenu(0);
 if (!pSubMenu)
  return 0;
 
 if (lParam == WM_RBUTTONUP)
 {
  ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);
  CPoint pos;
  GetCursorPos(&pos);
  
  SetForegroundWindow();
  pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON
   |TPM_RIGHTBUTTON, pos.x, pos.y, this, NULL);
 }
 else if(lParam == WM_LBUTTONDOWN)
 {
  ShowWindow(SW_SHOW);
  SetForegroundWindow();
 }
 else if(lParam == WM_LBUTTONDBLCLK)
 {
  SendMessage(WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);
 }
 return 1L;
}
如果同时还需要屏蔽窗口关闭按钮的话需要增加消息处理函数:
ON_WM_SYSCOMMAND()

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
 if(nID == SC_CLOSE)
 {
  ShowWindow(SW_HIDE);
  return;
 }
 CFrameWnd::OnSysCommand(nID, lParam);
}

在窗口的Destroy函数调用:
 Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值