MFC添加系统托盘图标

来源:互联网 发布:高达00剧场版结局知乎 编辑:程序博客网 时间:2024/05/02 02:54

先在dlg.cpp中定义两个宏

#include <Dbt.h>#define WM_SYSTEMTRAYWM_USER + 1 // 托盘图标消息绑定#define MY_BACKGROUNDER_DLGWM_USER + 2 // 后台运行按键消息

在dlg.h中添加变量

NOTIFYICONDATA m_nid;

NOTIFYICONDATA结构定义:(具体解释可自行百度)

typedef struct _NOTIFYICONDATA {DWORD cbSize; // 结构体的大小,以字节为单位。HWND hWnd;    // 窗口的句柄UINT uID;     // 应用程序定义的任务栏图标的标识符UINT uFlags;UINT uCallbackMessage; // 应用程序定义的消息标示HICON hIcon;// 增加、修改或删除的图标的句柄TCHAR szTip[64];// 指向一个以\0结束的字符串的指针。DWORD dwState;    // 图标的状态DWORD dwStateMask;// 指明dwState成员的那些位可以被设置或者访问TCHAR szInfo[256];// 指向一个以\0结束的字符串的指针,字符串的内容为气球提示内容union {// 和uVersion成员为联合体。uTimeout表示气球提示超时的时间UINT uTimeout;UINT uVersion;};TCHAR szInfoTitle[64];// 指向一个以\0结束的字符串的指针。字符串的内容为气球提示的标题DWORD dwInfoFlags;// 设置此成员用来给气球提示框增加一个图标。GUID guidItem;} NOTIFYICONDATA, *PNOTIFYICONDATA;


在OnInitDialog()中初始化m_nid;

    m_nid.cbSize = sizeof( NOTIFYICONDATA );    m_nid.hWnd = m_hWnd;     m_nid.uID = IDR_MAINFRAME;     m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;    m_nid.uCallbackMessage = WM_SYSTEMTRAY;    //自定义消息    m_nid.hIcon = m_hIcon;                                                   strcpy_s(m_nid.szTip, "U盘自动更新程序");

重写WindowProc函数;

LRESULT CUDiskDetectionDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// TODO: 在此添加专用代码和/或调用基类if (WM_SYSTEMTRAY == message){ShowSystemTrary(wParam, lParam);}else if (MY_BACKGROUNDER_DLG == message){::Shell_NotifyIcon(NIM_ADD, &m_nid); // 显示托盘图标。this->ShowWindow(FALSE); //  隐藏窗体}return CDialog::WindowProc(message, wParam, lParam);}

ShowSystemTrary函数:

BOOL CUDiskDetectionDlg::ShowSystemTrary(WPARAM wParam, LPARAM lParam){if (lParam == WM_LBUTTONDBLCLK){  ShowWindow(SW_SHOWNORMAL); // 用最近的大小和位置显示::Shell_NotifyIcon(NIM_DELETE, &m_nid);}if (lParam == WM_RBUTTONDOWN){  //右击弹出托盘菜单CMenu menu;menu.LoadMenu(IDR_MENU_QUIT);CMenu *pPopUp=menu.GetSubMenu(0);CPoint pt; GetCursorPos(&pt); SetForegroundWindow(); pPopUp->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this); }return 0;}

后台运行按键加入代码:

    SendMessage(MY_BACKGROUNDER_DLG);
增加的退出菜单增加代码:

    SendMessage(WM_CLOSE);    ::Shell_NotifyIcon(NIM_DELETE, &m_nid);










原创粉丝点击