C++对话框系统托盘实现

背景需求:

1、MFC对话框最小化时,只显示系统右下角托盘图标。

2、双击托盘,对话框还原。

3、右键点击托盘,弹出“关闭”菜单,可关闭对话框。


参考:http://baike.baidu.com/view/1773959.htm。


实现步骤:

1、创建MFC对话框程序(本例程序名为TaskbarIcon),属性中设置“MinimizeBox”为true。

2、定义自定义消息宏。

#define NOTIFY_SHOW WM_USER+2500

3、OnSysCommand(系统消息响应函数)添加对话框最小化执行代码。

void CTaskbarIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if (SC_MINIMIZE == nID)
    {
        NOTIFYICONDATA nid;
        nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);   
        nid.hWnd = this->m_hWnd;   
        nid.uID = IDR_MAINFRAME;   
        nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP   ;   
        nid.uCallbackMessage = NOTIFY_SHOW;//自定义的消息名称
        nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));   
        wcscpy_s(nid.szTip, _T("图标测试"));//信息提示条

        Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
        ShowWindow(SW_HIDE);//隐藏主窗口
        return;
    }

    //...系统自带代码
}

4、托盘自定义消息响应

BEGIN_MESSAGE_MAP(CTaskbarIconDlg, CDialog)
    //...省略其他消息映射

    ON_MESSAGE(NOTIFY_SHOW, OnTrayIcon)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);

LRESULT CTaskbarIconDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
    if (wParam != IDR_MAINFRAME)
    {
        return 1;
    }
    
    switch(lParam)
    {
    case WM_RBUTTONUP:
        {
            //右键起来时弹出快捷菜单,这里只有一个“关闭”

            //声明一个弹出式菜单
            //增加菜单项“关闭”,点击则发送消息WM_CLOSE给主窗口(已   
            //隐藏),将程序结束。 
            CMenu menu;
            menu.CreatePopupMenu();
            menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("关闭"));

            //得到鼠标位置
            LPPOINT lpoint= new tagPOINT;
            ::GetCursorPos(lpoint);

            //确定弹出式菜单的位置   
            menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y,this);

            //资源回收
            HMENU   hmenu=menu.Detach();
            menu.DestroyMenu();

            delete lpoint;
            lpoint = NULL;

            break;
        }
    case WM_LBUTTONDBLCLK:
        {
            //双击左键的处理

            //显示界面
            ShowWindow(SW_SHOW);
            //界面置顶
            SetForegroundWindow();

            break;
        }
    }

    return 0;
}

5、关闭时删除托盘图标。

覆盖(override)OnCancel函数。

virtual void OnCancel();

void CTaskbarIconDlg::OnCancel()
{
    //删除任务栏图标
    NOTIFYICONDATA nid;
    nid.hWnd=this->m_hWnd;
    nid.uID=IDR_MAINFRAME;
    Shell_NotifyIcon(NIM_DELETE, &nid);

    CDialog::OnCancel();
}


你可能感兴趣的:(C++对话框系统托盘实现)