MFC对话框最小化到托盘

来源:互联网 发布:php 今天24点时间戳 编辑:程序博客网 时间:2024/04/18 16:10

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:                                        // 右键起来时弹出菜单

                  {

CMenu menu,*pSubMenu; //后面要用的CMenu对象

CPoint point;

menu.LoadMenu(IDR_POPUP_MENU); //装载自定义的右键菜单  

pSubMenu = menu.GetSubMenu(0); //获取第一个弹出菜单

GetCursorPos(&point); //获取当前光标位置       

pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_BOTTOMALIGN,point.x,point.y,this);

                  }
                  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();


    }


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



注意:在托盘的右键菜单中要加入函数SetForegroundWindow();//设置对话框窗口为当前窗口显示在屏幕顶层

否则右键出来的菜单会点不掉。

原创粉丝点击