将应用程序放入托盘(MFC)

一、简介:

使程序托盘我们这里要用到了一个结构体NOTIFYICONDATA,它包含了系统需要用来传递托盘区域信息的消息;还有需要用到一个函数Shell_NotifyIcon,它的作用是对拖盘图标进行显示与删除。

NOTIFYICONDATA结构如下:

STRUCT NOTIFLYICONDATA
{
    cbSize                 //结构体的大小,以字节为单位
    hIcon                  //任务栏上显示的图标
    hWnd                   //窗口句柄
    uCallbackMessage       //自义定消息处理,当你对托管图标操作时,响应这消息
    uFlags                 //作用标识,比如你想让图标起作用可以用NIF_ICON ,想显示提标信息可用NIF_TIP
    uID                    //图标ID
    szTip                  //鼠标放上去的提示信息
};

二、具体实现步骤:

1、定义NOTIFYICONDATA对象,

private:
    NOTIFYICONDATA nid;

2、初始化对象

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); 
nid.hWnd=this-> m_hWnd; 
nid.uID=IDR_MAINFRAME; 
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP   ; 
nid.uCallbackMessage = WM_SHOWTASK;//自定义的消息名称 
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); 
strcpy(nid.szTip, _T("xxx"));//信息提示条 
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标

3、自定义用户消息、并添加回调函数

#define WM_SHOWTASK (WM_USER + 100)
afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);
LRESULT CQueueServerDlg::OnShowTask(WPARAM wParam,LPARAM lParam) //wParam是图标的ID,lParam是鼠标的行为 
{ 
    if(wParam != IDR_MAINFRAME) 
    {
        return   1; 
    }
    switch(lParam) 
    { 
        case WM_RBUTTONUP://右键起来时弹出快捷菜单
        { 
                LPPOINT   lpoint=new   tagPOINT; 
                ::GetCursorPos(lpoint);//得到鼠标位置 
                CMenu   menu; 
                menu.CreatePopupMenu();//声明一个弹出式菜单 
                menu.AppendMenu(MF_STRING,WM_DESTROY, "Close"); //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏)将程序结束。 
                SetForegroundWindow();     
                menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //确定弹出式菜单的位置
                HMENU   hmenu=menu.Detach();  //资源回收 
                menu.DestroyMenu(); 
                delete   lpoint; 
        } 
        break; 
        case WM_LBUTTONDBLCLK:
        { 
            this-> ShowWindow(SW_SHOW);
        } 
        break; 
        case  WM_LBUTTONDOWN:
            this-> ShowWindow(SW_SHOW);
            break;
    } 
    return   0; 
}

4、添加消息映射

BEGIN_MESSAGE_MAP(CSSDlg, CDialog)

 ON_MESSAGE(WM_SHOWTASK, &CQueueServerDlg::OnShowTask)
 
END_MESSAGE_MAP()

5、最后在OnDestroy函数删除托盘图标。

Shell_NotifyIcon(NIM_DELETE,&nid);
原文地址:https://www.cnblogs.com/zwj-199306231519/p/14146787.html