• C++ 最小化到托盘


    define WM_SHOWTASK (WM_USER + 1)

    void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
        }
        else
        {
            //增加关闭时最小化到托盘的函数
            if (nID == SC_CLOSE) //SC_MINIMIZE
            {
                ToTray();
                return;
            }
            CDialog::OnSysCommand(nID, lParam);
        }
    }
    BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
        ON_MESSAGE(WM_SHOWTASK, OnShowTask)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    //在托盘区添加图标 最小化到托盘函数
    void ToTray(void);
    void CTestDlg::ToTray(void)
    {
        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 = WM_SHOWTASK;//自定义的消息名称
        nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
        wcscpy_s(nid.szTip, _T("***程序"));//信息提示条
        Shell_NotifyIcon(NIM_ADD, &nid);//在托盘区添加图标
        ShowWindow(SW_HIDE);//隐藏主窗口
    }
    //恢复界面函数
    afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
    //托盘事件
    LRESULT CTestDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
    {
        if (wParam != IDR_MAINFRAME)
        {
            return 1;
        }
        switch(lParam)
        {
        case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个关闭
        {
            LPPOINT lpoint = new tagPOINT;
            ::GetCursorPos(lpoint);//得到鼠标位置
            CMenu menu;
            menu.CreatePopupMenu();//声明一个弹出式菜单
            //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
            //隐藏),将程序结束。
            menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出"));
            //确定弹出式菜单的位置
            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);//简单的显示主窗口
            this->ShowWindow(SW_RESTORE);
            DeleteTray();
        }
        break;
        default:
            break;
        }
        return 0;
    }
    //删除托盘中图标
    void DeleteTray();
    void CTestlDlg::DeleteTray()
    {
        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 = WM_SHOWTASK;//自定义的消息名称
        nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
        wcscpy_s(nid.szTip, _T("***程序"));//信息提示条为“按计划任务提醒”
        Shell_NotifyIcon(NIM_DELETE, &nid);//在托盘中删除图标
    }
    //退出程序需时需要DeleteTray();
    void CTestDlg::OnDestroy()
    {
        CDialog::OnDestroy();
        // TODO: 在此处添加消息处理程序代码
        DeleteTray();
    }
    //修改风格使得他不在任务栏显示
    int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CDialog::OnCreate(lpCreateStruct) == -1)
            return -1;
        // TODO:  在此添加您专用的创建代码
        //修改风格使得他不在任务栏显示
        ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
        return 0;
    }
    

    DeleteTray改为:

    void CTestDlg::DeleteTray()
    {
    	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 = WM_SHOWTASK;//自定义的消息名称
    	//nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
    	//wcscpy_s(nid.szTip, _T("***程序"));//信息提示条为“按计划任务提醒”
    	Shell_NotifyIcon(NIM_DELETE, &nid);//在托盘中删除图标
    }
    

    否则会出现程序退出后,托盘图标还在的情况,鼠标移动到图标上后,图标一闪然后消失的问题。

  • 相关阅读:
    学习HTML-第一章HTML基础
    javascript中apply 和 call 的区别
    数据库
    贝叶斯公式的直观理解(先验概率/后验概率)
    4-决策树
    消息队列
    RESTful api 设计规范
    MySql索引
    MySQL并发控制
    MySQL三层逻辑架构
  • 原文地址:https://www.cnblogs.com/yhcao/p/6237621.html
Copyright © 2020-2023  润新知