QQ登录

只需一步,快速开始

上位机MFC如何实现系统托盘

[ 复制链接 ]
分为四步走。
1.定义变量,添加头文件等。
#include "shlwapi.h"
#define WM_NOTIFYICON        WM_USER+1
class CGkbc8Dlg : public CDialog
{
        NOTIFYICONDATA m_Nid;
}

2.0初始化变量
        //初始化NOTIFYICONDATA结构
        m_Nid.cbSize = sizeof(NOTIFYICONDATA);
        m_Nid.hWnd = m_hWnd;
        m_Nid.uID = 100;
        m_Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
        m_Nid.uCallbackMessage = WM_NOTIFYICON;
        m_Nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
                MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, NULL);
        StrCpy(m_Nid.szTip, _T("Demo"));

                        //隐藏窗口
        ShowWindow(SW_HIDE);       
        //在任务栏中添加图标
        Shell_NotifyIcon(NIM_ADD, &m_Nid);

3.实现消息WM_NOTIFYICON的关联。
afx_msg void OnNotifyIcon(WPARAM wParam, LPARAM lParam);
        ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)

  1. void CGkbc8Dlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
  2. {
  3.         if (wParam == 100)
  4.         {
  5.                 if (lParam == WM_LBUTTONDBLCLK)
  6.                 {
  7.                         //删除任务栏中的图标
  8.                         Shell_NotifyIcon(NIM_DELETE, &m_Nid);
  9.                         //显示窗口
  10.                         ShowWindow(SW_SHOWNORMAL);
  11.                         UpdateWindow();
  12.                 }

  13.                 else if ((lParam == WM_LBUTTONDOWN) || (lParam == WM_RBUTTONDOWN))
  14.                 {
  15.                         //显示快捷子菜单
  16.                         CMenu menu;
  17.                         if (!menu.LoadMenu(IDR_MENU1))
  18.                         {
  19.                                 return;
  20.                         }
  21.                         CPoint point;
  22.                         GetCursorPos(&point);
  23.                         SetForegroundWindow();
  24.                         CMenu* pSubMenu = menu.GetSubMenu(0);
  25.                         if (pSubMenu == NULL)
  26.                         {
  27.                                 return;
  28.                         }
  29.                         pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
  30.                                 point.x, point.y, this, NULL);
  31.                         PostMessage(WM_NULL, 0, 0);  
  32.                 }
  33.         }
  34. }
复制代码
4.实现程序退出时,对图标的清理。
  1. void CGkbc8Dlg::OnClose()
  2. {
  3.         // TODO: Add your message handler code here and/or call default
  4.                 //删除任务栏中的图标
  5.         Shell_NotifyIcon(NIM_DELETE, &m_Nid);

  6.         CDialog::OnClose();
  7. }
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索