在工作列上顯示圖示 (轉)

worldblog發表於2007-12-04
在工作列上顯示圖示 (轉)[@more@]

在工作列上顯示圖示

阿倫工作室 邱理 95/工作列的右邊是一狀態區,Windows95/Wi ndowsNT在其上顯示時間和一些小圖示,這些圖示代表著特定的功能或 ,用滑鼠單擊、右擊或雙擊這些圖示,就會彈出功能選單或程式視窗等。你也許想把自己的程式圖示也放在工作列的狀態區上,很簡單, VC++ 5.0提供了一個,讓你很容易地實現該功能。 _NotifyIcon()函式 該函式傳送訊息給在工作列的狀態區,增加、刪除或修改圖示。Shell_NotifyI con()有兩個引數: 1. D dwMessage 訊息標誌值,為以下三個中之一: NIM_ADD 在工作列狀態區增加圖示 NIM_DELETE 從工作列狀態區刪除圖示 NIM_MODITY 修改工作列狀態區的圖示 2. PNOTIFYICONDATA pnid 指向NOTIFYICONDATA結構的指標。NOTIFYICONDATA結構如下: typedef struct _NOTIFYICONDATA { // nid DWORD cbSize; // NOTIFYICONDATA 結構的大小 HWND hWnd; //接收回撥訊息的視窗控制程式碼 UINT uID; //自定義的圖示標誌值 UINT uFlags; //標誌後面的三個資料成員哪個有效, //可由NIF_ICON,NIF_MESSAGE和   NIF_TIP組合。 UINT uCallbackMessage; //回撥訊息 HICON hIcon; //圖示控制程式碼 char szTip[64]; //提示字元。當把滑鼠移到工作列 //狀態區該圖示上時,系統顯示該字元 } NOTIFYICONDATA, *PNOTIFYICONDATA; 如何在工作列狀態區實現程式圖示及其功能 1. 首先生成一個單文件的工程。 2. 在StdAfx.h 新增自定義的訊息: //回撥訊息 #define MYWM_NOTIFYICON WM_USER+1 //在工作列狀態區顯示圖示的訊息 #define MYWM_SHOPICONIC WM_USER+2 3. 在MainFrm.h 裡新增定義訊息處理函式說明,該部分看起來如下: protected: //{{AFX_MSG(CMainFrame) afx_msg void OnSymmand(UINT nID, LPARAM lParam); //手工加 afx_msg void OnMyIconNotify(WPARAM wParam, LPARAM lParam ); //手工加 afx_msg void OnShowAppIconic(WPARAM wParam, LPARAM lPara m); //手工加 afx_msg void OnClose(); //系統生成 //}}AFX_MSG DECLARE_MESSAGE_MAP() 另外,需在MainFrm.h定義一開關值,記錄程式視窗是開啟或關閉狀態: BOOL boolWndHadShow; 4. 在MainFrm.cpp裡實現訊息對映和訊息處理函式。訊息對映部分看起來如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)  //{{AFX_MSG_MAP(CMainFrame) ON_MESSAGE(MYWM_NOTIFYICON, OnMyIconNotify)  ON_MESSAGE(MYWM_SHOWAPPICONIC, OnShowAppIconic)  ON_WM_SYSCOMMAND()  ON_WM_CLOSE()  //}}AFX_MSG_MAP END_MESSAGE_MAP() 訊息處理及相關函式如下所示: //在工作列狀態區新增圖示 BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID; tnid.uFlags = NIF_ICON | NIF_T| NIF_MESSAGE; tnid.uCallbackMessage = MYWM_NOTIFYICON; tnid.hIcon = hicon; if (lpszTip) lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); else tnid.szTip[0]=‘'; res=shell_NotifyIco n(NIM_ADD, &tnid); if (hicon) DestroyIcon(hicon); return res; } //從工作列狀態區刪除圖示 BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID; res = Shell_NotifyIcon(NIM_DELETE, &tnid); return res; } //處理圖示回撥訊息MYWM_NOTIFYICON void CMainFrame::OnMyIconNotify( WPARAM wParam, LPARAM l Param ) { UINT nID; UINT uMouseMsg; nID = (UINT)wParam; uMouseMsg = (UINT) lParam; if(uMouseMsg == WM_LBUTTONDOWN)  //點選圖示 { if( boolWndHadShow ) //如果視窗已開啟,隱藏視窗 ShowWindow(SW_H ); else  //否則,顯示視窗 ShowWindow(SW_SHOWNORMAL ); boolWndHadShow = ~boolWndHadShow; } } //訊息MYWM_SHOWAPPICONIC處理函式,在工作列顯示圖示並隱藏視窗 void CMainFrame::OnShowAppIconic(WPARAM wParam, LPARAM l Param ) { HICON theIcon = LoadIcon(AfxGetInstance-Handle(),MAKEINT RE(IDR_MAI NFRAME) ); MyTaskBarAddIcon(GetSafeHwnd(), 100, theIcon, _T("示範程式")); ShowWindow(SW_HIDE ); boolWndHadShow = FALSE; } 當程式關閉時,需把圖示從任務樣狀態區刪除,你可以新增一個處理WM_CLOSE訊息的函式來刪除圖示。透過ClassWizard來新增處理WM_ CLOSE的函式OnClose(),該函式如下: void CMainFrame::OnClose() { // TODO: Add your message handler code here and/or call default MyTaskBarDeleteIcon( GetSafeHwnd(), 100 ); CFrameWnd::OnClose(); } 當把視窗最小化時,你應隱藏整個視窗,所以要處理ON_SYSCO MMAND訊息。首先在MainFrm.h新增函式說明,如第三步所示;然後在Ma inFrm.cpp裡說明訊息對映和實現函式。訊息對映如前面所示,函式實現如下: void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam ) { if (nID==SC_MINIMIZE ) { ShowWindow(SW_HIDE ); boolWndHadShow=FALSE; } else CWnd::OnSysCommand(nID, lParam ); } 5. 在InitInstance()函式返回前,新增一語句 m_pMainWnd->PostMessage( MYWM_SHOWAP- PICONIC ); 它是傳送一個自定義的訊息MYWM_SHOWAP- PICONIC使程式啟動後隱藏程式視窗並在工作列狀態區顯示小圖示。 6. 現在,你可編譯和執行該程式了。程式執行後,點選工作列狀態區該程式的圖示, 系統會彈出程式視窗,再點選一下,又隱藏了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988011/,如需轉載,請註明出處,否則將追究法律責任。

相關文章