利用"NOTIFYICONDATA"實現MFC的托盤程序

本文章爲轉發百度空間內容,,保存一下,以防以後用到。。

一、自定義信息

在頭文件中加入下面這句話:
#define WM_SHOWTASK (WM_USER+1)

二、MYDLG.CPP文件中添加_messageEntries數組添加自定義信息WM_SHOWTASK
ON_MESSAGE(WM_SHOWTASK,OnShowTask)//將自定義信息WM_SHOWTASK應用於OnShowTask
放置於BEGIN_MESSAGE_MAP(MYDlg, CDialog)==END_MESSAGE_MAP()之間

三、創建縮放函數ToTray()
void CNewMfcDlg::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); //隱藏主窗口
}

四、創建信息處理函數OnShowTask
//wParam接收的是圖標的ID,而lParam接收的是鼠標的行爲
LRESULT CNewMfcDlg::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();//聲明一個彈出式菜單
   //增加菜單項“關閉”,點擊則發送消息WM_DESTROY給主窗口(已隱藏),將程序結束。
   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_SHOW);//簡單的顯示主窗口
    DeleteTray();
   }
   break;
  default: break;
 }
 return 0;
}

五、創建關閉程序函數DeleteTray()
void CNewMfcDlg::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); //在托盤區刪除圖標
}

六、CNewMfcDlg::OnSysCommand函數中添加事件以觸發縮放到拖盤的功能如下:
void CNewMfcDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if(nID==SC_CLOSE) //SC_CLOSE:關閉程序時,SC_MINIMIZE:最小化程序時)
 {
  ToTray();
 }

 else if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章