美文网首页程序员
基于Duilib的win32程序实现最小化到托盘

基于Duilib的win32程序实现最小化到托盘

作者: 拉普拉斯妖kk | 来源:发表于2016-12-23 10:21 被阅读1874次

    最近在学习使用Duilib,这个库实现PC程序的界面确实很方便。Duilib中的demo程序全是点击关闭按钮程序就关闭了,所以这里我实现了一个点击关闭按钮后程序最小化到托盘的效果。以及常规的,鼠标左键点击托盘里的程序图标后程序正常显示。右键点击后出现退出菜单,点击退出按钮后程序正常退出。
    下面是关键部分源码:

    • 包含头文件和自定义消息
    #include <ShellAPI.h>
    #define WM_SHOWTASK WM_USER+101 
    #define WM_ONCLOSE WM_USER+102
    
    • 处理关闭按钮点击事件,增加最小化到托盘功能
        memset(&m_nid,0,sizeof(NOTIFYICONDATA));
        m_nid.cbSize = sizeof(NOTIFYICONDATA);
        m_nid.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SMALL));
        m_nid.hWnd = m_hWnd;
        lstrcpy(m_nid.szTip, _T("Duilib程序"));
        m_nid.uCallbackMessage = WM_SHOWTASK;
        m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
        Shell_NotifyIcon(NIM_ADD, &m_nid);
        ShowWindow(SW_HIDE);
    
    • 自定义HandleCustomMessage或HandleMessage处理鼠标点击托盘图标的响应
        //如果在图标中单击左键则还原
        if( lParam == WM_LBUTTONDOWN )
        {             
            Shell_NotifyIcon(NIM_DELETE, &m_nid);//删除托盘图标
            ShowWindow(SW_SHOWNORMAL);//显示主窗口
        }
        //如果在图标中单击右键则弹出声明式菜单
        if( lParam == WM_RBUTTONDOWN )
        {             
            //获取鼠标坐标  
            POINT pt; GetCursorPos(&pt);  
            SetForegroundWindow(m_hWnd); //右击后点别地可以清除“右击出来的菜单”
    
            HMENU hMenu; //托盘菜单    win32程序使用的是HMENU,如果是MFC程序可以使用CMenu
            hMenu = CreatePopupMenu();//生成托盘菜单   
            AppendMenu(hMenu, MF_STRING, WM_ONCLOSE, _T("退出"));  
    
            int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, m_hWnd,  NULL);  
            if(cmd == WM_ONCLOSE)   
            {
                //退出程序
                m_nid.hIcon = NULL;
                Shell_NotifyIcon(NIM_DELETE, &m_nid);
                ::PostQuitMessage(0);
            }
        }
    

    相关文章

      网友评论

        本文标题:基于Duilib的win32程序实现最小化到托盘

        本文链接:https://www.haomeiwen.com/subject/wtfkvttx.html