MFC視窗最小化到托盤

2022-05-07 18:24:10 字數 2299 閱讀 8118

把程式放到托盤上的本質就是先在托盤區繪製乙個圖示,然後把程式隱藏不見,再對托盤的圖示進行訊息處理,就可以了。繪製圖示以及確定圖示所傳送訊息的函式只有乙個,那就是  winshellapi bool winapi shell_notifyicon( dword dwmessage, pnotifyicondata pnid );  這個函式負責向系統傳遞訊息,以新增、修改或刪除托盤區的圖示。它的返回值是個布林型別的。就是說,如果返回0就是不成功,非0才成功。引數dwmessage  是表示這個函式的應用功能是哪一方面,是新增、刪除,還是修改圖示。如果是新增,則它的值為nim_add;刪除則是nim_delete;而修改是nim_modify。引數pnid就是具體的和程式在托盤區的圖示有關係的結構了。它的定義如下:

typedef struct _notifyicondata  notifyicondata, *pnotifyicondata;

cbsize : 結構的長度,用「位」來做單位。一般在程式中,我們用(dword)sizeof(notifyicondata) 給它賦值。 

hwnd : 乙個控制代碼,如果對托盤中的圖示進行操作,相應的訊息就傳給這個控制代碼所代表的視窗。大多數情況下是this->m_hwnd。 

uid :  在工程中定義的圖示id  

uflags : 這個成員標誌著其他哪些成員的資料是有效的,分別為nif_icon, nif_message, nif_tip,分別代表著資料有效的成員是hicon, ucallbackmessage, sztip。當然,三個值可以用「|」聯絡到一起。

下面分別對涉及到的成員進行闡述: 

hicon :  要增加,刪除或修改的圖示控制代碼。如果只知道個uid, 一般可能會用函式loadicon來得到控制代碼。例如loadicon ( afxgetinstancehandle() ,makeintresource (idr_mainframe) )。 

ucallbackmessage : 這在對托盤區的操作中,是比較重要的資料成員。這是個訊息標誌,當用滑鼠對托盤區相應圖示進行操作的時候,就會傳遞訊息給hwnd所代表的視窗。所以說,在uflags中,一般都得標誌它有效。這裡一般都是自定義的訊息。  

sztip :  滑鼠移動到托盤圖示上時的提示文字。 

托盤程式設計例子:

1、將程式最小化到系統托盤區的函式totray()。  

void ctimewakedlg::totray()  

2、 程式已經最小化到托盤區了,但是對托盤圖示的操作如何進行呢?這就體現了結構notifyicondata的成員ucallbackmessage 的作用了。它所提供的作用就是,當使用者用滑鼠點選托盤區的圖示的時候(無論是左鍵還是右鍵),會向hwnd所代表的視窗傳送訊息,如果是上例,訊息的名稱就是wm_showtask。

根據vc的訊息機制,對自定義訊息增加訊息響應函式。  

在標頭檔案的//}afx_msg之間宣告訊息響應函式:  

afx_msg lresult onshowtask(wparam wparam,lparam lparam);  

然後在cpp檔案中新增訊息對映。在begin_message_map和end_message_map  之間加入: 

on_message(wm_showtask,onshowtask)將訊息和訊息響應函式對映起來。  

然後就是在cpp檔案中加入函式onshowtask的實現了:  

lresult ctimewakedlg::onshowtask(wparam wparam,lparam lparam)  

//wparam接收的是圖示的id,而lparam接收的是滑鼠的行為

break;

case wm_lbuttondblclk://雙擊左鍵的處理

break;

} return 0;

}

3. 呼叫

在視窗新增wm_size的訊息onsize()

void ctimewakedlg::onsize(uint ntype, int cx, int cy)      

注意:定義訊息名稱以訊息號,並註冊訊息,該步很重要!我就是因為沒有註冊訊息,導致除錯了很久都找不到問題所在。該步都是在dlg.cpp(dlg的實現中)中操作。定義訊息名稱和訊息號:#define wm_ showtask (wm_user+1001),1001只是用於指定乙個訊息號,可以隨便指定。註冊則是在begin_message_map(dlg,cdialog)和end_message_map()之間新增on_message(wm_ showtask, onshowtask)。

MFC將視窗最小化到托盤

1 在標頭檔案中自定義訊息 define wm showtask wm user 1以及宣告訊息響應函式 afx msg lresult onshowtask wparam wparam,lparam lparam 宣告乙個結構體變數 notifyicondata nid 2 在cpp檔案訊息對映中...

視窗最小化到托盤

使用notifyicon控制項和contextmenustrip控制項實現 1.將notifyicon控制項和contextmenustrip控制項拖到form上 2.在form的formclosing事件 取消關閉窗體 e.cancel true 將窗體變為最小化 this.windowstate...

關於在MFC中將視窗最小化到托盤

摘要 關於在mfc中將視窗最小化到托盤 步驟 方法 一 原理 1 最小化的原理 首先要將視窗隱藏,然後在右下角繪製圖示。2 恢復的原理 將視窗顯示,再將托盤中的刪除。二 程式實現 1 自定義訊息wm showtask define wm showtask wm user 1 2 在mfc的 onsy...