MFC程序隐藏托盘+右键关闭菜单

发布时间 2023-05-17 13:42:10作者: 十一的杂文录
背景介绍:
  我的程序是启动后,默认就隐藏到托盘中,等待http请求后,显示界面。所以最小化到托盘的代码,我是写在初始化里面。
 
 
正文:

一、自定义消息 WM_SHOWTASK

#define WM_SHOWTASK        (WM_USER + 101)

 

 

二、在类向导中添加消息处理

  点击【类向导】、【消息】、【自定义消息】,填写自定义的消息【WM_SHOWTASK】,点击【确定】,双击,自动生成类函数,编写代码。

 

 

三、最小化到托盘

// 编写最小化到托盘的代码,我是写在初始化函数中
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;  
nid.uID = IDI_MAINFRAME;                                // 资源,icon 图片
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;                        // 绑定自定义的消息
nid.hIcon = m_hIcon;
lstrcpy(nid.szTip, _T("web server"));
Shell_NotifyIcon(NIM_ADD, &nid);

 

四、处理自定义消息,给托盘程序绑定右键菜单

afx_msg LRESULT CeloamDllDemoDlg::OnShowtask(WPARAM wParam, LPARAM lParam)
{
    switch (lParam)
    {
        case WM_RBUTTONUP:    // 只处理鼠标右键点击
        {
            LPPOINT lpoint = new tagPOINT;
            ::GetCursorPos(lpoint);
            CMenu menu;
            menu.CreatePopupMenu();
            menu.AppendMenuW(MF_STRING, WM_DESTROY, L"关闭");
            menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
            HMENU hmenu = menu.Detach();
            menu.DestroyMenu();
            delete lpoint;
        }break;
    }

    return 0;
}