将程序最小化到系统托盘

    技术2022-05-20  43

     最近自己利用activemovie制作了一个简单的音乐播放器,希望像qq,千千静听,暴风影音那样程序最小化时在系统托盘中显示而不是在任务栏中。如下:

    1.在基于对话框的程序的头文件中添加成员变量 NOTIFYICODATA m_nid

    2.自定义消息函数OnShowTask

     1)首先在头文件中定义 #define WM_SHOWTASK WM_USER+1

     2)在头文件映射中在添加 afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam)

     3)在源文件中的消息映射队列中添加 ON_MESSAGE(WM_SHOWTASK,OnShowTask)

     4)在原文件中添加自定义消息函数定义:

       LRESULT CMediaPlayerDialog::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, "退出(&X)");      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; 

     }

    3.在程序的InitDialog函数中添加如下代码:

    //---------------------------托盘显示初始化---------------------------------//     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, "自制播放器");                // 信息提示条为"服务器程序"     Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区添加图标

    4.重载对话框程序的WM_SIZE消息

       void CMediaPlayerDlg::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); // 当最小化时,隐藏主窗口                }  

    }

    5.重载WM_DESTROY消息,关闭程序时关闭托盘上的程序图标

    void CMediaPlayerDlg::OnDestroy(){ CDialog::OnDestroy();  // TODO: Add your message handler code here

     // 系统关闭时在托盘区删除图标 Shell_NotifyIcon(NIM_DELETE, &m_nid);             // return CDialog::DestroyWindow(); }


    最新回复(0)