在MFC中让对话框最小化到托盘

    xiaoxiao2026-08-16  0

    1、在资源中的Icon中导入一个自己喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR_MAINFRAME的图标删除掉;

    2、在自己的Dialog头文件中定义一个变量  NOTIFYICONDATA m_nid,关于该结构体的具体信息可以查阅MSDN;

    3、添加消息响应函数OnInitDialog(),并在该函数中添加以下代码,这样程序一启动,就在托盘中显示出了自己应用程序的图标。

        //---------------------------托盘显示---------------------------------//

        m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);

        m_nid.hWnd    = this->m_hWnd;

        m_nid.uID     = IDR_MAINFRAME;

        m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

        m_nid.uCallbackMessage = WM_SHOWTASK;             // 自定义的消息名称

        m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

        strcpy(m_nid.szTip, "服务器程序");                // 信息提示条为"服务器程序",VS2008 UNICODE编码用wcscpy_s()函数

        Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区添加图标

        这时候编译,会报WM_SHOWTASK的错,因为该消息要自己定义。

    4、在Dialog头文件中声明消息函数原型                                         

        LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

    5、在Dialog源文件中进行消息映射

        ON_MESSAGE(WM_SHOWTASK,OnShowTask)

    6、在Dialog源文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。

        LRESULT CServerDlg::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();                    // 声明一个弹出式菜单

                             menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭");

                             menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);

                             HMENU hmenu = menu.Detach();

                             menu.DestroyMenu();

                             delete lpoint;

                      }

                      break;

               case WM_LBUTTONDBLCLK:                                 // 双击左键的处理

                      {

                             this->ShowWindow(SW_SHOWNORMAL);         // 显示主窗口

                      }

                      break;

               }

               return 0;

        }

    7、添加OnSize消息响应函数,处理最小化时的操作。

        void CServerDlg::OnSize(UINT nType, int cx, int cy)

        {

               CDialog::OnSize(nType, cx, cy);

               // TODO: Add your message handler code here

               if(nType == SIZE_MINIMIZED)  

               {  

                      ShowWindow(SW_HIDE); // 当最小化市,隐藏主窗口              

               }  

        }

    8、添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除

        BOOL CServerDlg::DestroyWindow()

        {

               // TODO: Add your specialized code here and/or call the base class

               // 在托盘区删除图标

               Shell_NotifyIcon(NIM_DELETE, &m_nid);             

               return CDialog::DestroyWindow();

        }

        经过以上的步骤,就编写出了一个简单的可以最小化到托盘的程序。该程序在一启动时,在托盘创立应用程序的图标,最小化程序时隐藏主窗口,双击托盘区的图标时,显示主窗口,右键点击托盘区窗口时,弹出菜单进行相应的操作。

    转载请注明原文地址: https://ju.6miu.com/read-1311241.html
    最新回复(0)