1. 程式人生 > >MFC 子視窗工作列顯示圖示和主視窗最小化在系統托盤中顯示圖示

MFC 子視窗工作列顯示圖示和主視窗最小化在系統托盤中顯示圖示

MFC子視窗工作列顯示圖示很簡單,

只需要在子視窗的初期化函式OnInitDialog()中新增ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);

主視窗在系統托盤中顯示圖示以及恢復視窗是參考某位大神的程式碼

(一)  原理
1、最小化的原理:首先要將視窗隱藏,然後在右下角繪製圖標。
2、恢復的原理:將視窗顯示,再將托盤中的圖片刪除。
(二)程式實現
1、自定義訊息WM_SHOWTASK:
    #define WM_SHOWTASK (WM_USER +1)
2、在MFC的
            ::OnSysCommand(UINT nID, LPARAM lParam)   函式體中增加一個命令響應                       
            if(nID==SC_MINIMIZE)
              ToTray();           //最小化到托盤的函式
3、在訊息對映中新增
       ON_MESSAGE(WM_SHOWTASK,OnShowTask);       //其中WM_SHOWTASK是訊息名,
       OnShowTask是自己定義的訊息響應函式,後面有說明。
(三)具體函式內容
1、最小化到托盤函式
void CMyDlg::ToTray()
  {
       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));
       strcpy(nid.szTip,"程式名稱");    //資訊提示條
       Shell_NotifyIcon(NIM_ADD,&nid);    //在托盤區新增圖示
       ShowWindow(SW_HIDE);    //隱藏主視窗
}
2、恢復介面函式
在標頭檔案中定義訊息響應函式
  afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
      //wParam接收的是圖示的ID,而lParam接收的是滑鼠的行為
LRESULT CMyDlg::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,"關閉"); //增加選單項“關閉”,點選則傳送訊息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_SHOW);//簡單的顯示主視窗完事兒
                   DeleteTray();
                  }  break;
                   default:   break;
              }
              return 0;
      }
3、刪除托盤圖示函式
void CMyDlg::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));
    strcpy(nid.szTip,"程式名稱");    //資訊提示條為“計劃任務提醒”  
    Shell_NotifyIcon(NIM_DELETE,&nid);    //在托盤區刪除圖示
}

以上是轉載的,感謝共享的大神們。