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

来源:互联网 发布:sftp端口登录命令 编辑:程序博客网 时间:2024/06/12 19:28
需求:

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

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

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

 

 

实现步骤:

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

2、定义自定义消息宏。

#define NOTIFY_SHOW WM_USER+1 

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函数或OnClose函数。

virtual void OnCancel(); 
 
void CTaskbarIconDlg::OnCancel() 

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


 

原创粉丝点击