日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++中把一个对话框最小化到托盘[转载]

發(fā)布時(shí)間:2023/12/9 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++中把一个对话框最小化到托盘[转载] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

From:?http://hi.baidu.com/maxlcl/blog/item/61e83c87de35e529c65cc3e0.html

一、托盤簡(jiǎn)介?

所謂的“托盤”,在Windows系統(tǒng)界面中,指的就是下面任務(wù)條右側(cè),有系統(tǒng)時(shí)間等等的標(biāo)志的那一部分。在程序最小化或掛起時(shí),但有不希望占據(jù)任務(wù)欄的時(shí)候,就可以把程序放到托盤區(qū)。?

二、托盤編程相關(guān)函數(shù)?

把程序放到托盤上的本質(zhì)就是先在托盤區(qū)繪制一個(gè)圖標(biāo),然后把程序隱藏不見,再對(duì)托盤的圖標(biāo)進(jìn)行消息處理,就可以了。?

繪制圖標(biāo)以及確定圖標(biāo)所傳送消息的函數(shù)只有一個(gè):?

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(?
DWORD dwMessage,?
PNOTIFYICONDATA pnid?
);?

這個(gè)函數(shù),負(fù)責(zé)向系統(tǒng)傳遞消息,以添加、修改或刪除托盤區(qū)的圖標(biāo)。?

參數(shù)dwMessage 是表示這個(gè)函數(shù)的應(yīng)用功能是哪一方面,是添加、刪除,還是修改圖標(biāo)。如果是添加,則它的值為NIM_ADD;刪除則是NIM_DELETE;而修改是NIM_MODIFY。參數(shù)pnid就是具體的和程序在托盤區(qū)的圖標(biāo)有關(guān)系的結(jié)構(gòu)了。它的定義如下:?

typedef struct _NOTIFYICONDATAA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;CHAR szTip[64]; } NOTIFYICONDATAA, *PNOTIFYICONDATAA;

下面就對(duì)該結(jié)構(gòu)各個(gè)參數(shù)進(jìn)行刨析:?

cbSize : 結(jié)構(gòu)的長(zhǎng)度,用“位”來做單位。一般在程序中,我們用(DWORD)sizeof(NOTIFYICONDATA) 給它賦值。?

HWnd : 一個(gè)句柄,如果對(duì)托盤中的圖標(biāo)進(jìn)行操作,相應(yīng)的消息就傳給這個(gè)句柄所代表的窗口。大多數(shù)情況下是this->m_hWnd。?

uID : 在工程中定義的圖標(biāo)ID?

uFlags : 這個(gè)成員標(biāo)志著其他哪些成員的數(shù)據(jù)是有效的,分別為NIF_ICON, NIF_MESSAGE, NIF_TIP,分別代表著數(shù)據(jù)有效的成員是hIcon, uCallbackMessage, szTip。當(dāng)然,三個(gè)值可以用“|”聯(lián)系到一起。下面分別對(duì)涉及到的成員進(jìn)行闡述?

hIcon : 要增加,刪除或修改的圖標(biāo)句柄。如果只知道個(gè)uID, 一般可能會(huì)用函數(shù)LoadIcon來得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。?

uCallbackMessage : 這在對(duì)托盤區(qū)的操作中,是比較重要的數(shù)據(jù)成員。這是個(gè)消息標(biāo)志,當(dāng)用鼠標(biāo)對(duì)托盤區(qū)相應(yīng)圖標(biāo)進(jìn)行操作的時(shí)候,就會(huì)傳遞消息給Hwnd所代表的窗口。所以說,在uFlags中,一般都得標(biāo)志它有效。這里一般都是自定義的消息。?

szTip : 鼠標(biāo)移動(dòng)到托盤圖標(biāo)上時(shí)的提示文字。?

三、托盤編程例子?

1、將程序最小化到系統(tǒng)托盤區(qū)的函數(shù):添加一個(gè)按鈕的點(diǎn)擊事件。?
? void CDdDlg::OnBtnHide() // 隱藏主窗口,顯示到系統(tǒng)托盤區(qū) {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, "計(jì)劃任務(wù)提醒"); // 信息提示條為“計(jì)劃任務(wù)提醒” Shell_NotifyIcon(NIM_ADD, &nid); // 在托盤區(qū)添加圖標(biāo)ShowWindow(SW_HIDE); // 隱藏主窗口 }

這是個(gè)很簡(jiǎn)單的函數(shù),里面首先給NOTIFYICONDATA賦值,然后調(diào)用shell_NotifyIcon, 頭一個(gè)參數(shù)是NIM_ADD,表示添加。然后用函數(shù)ShowWindow 隱藏主窗口,這樣,就實(shí)現(xiàn)了將程序最小化到系統(tǒng)托盤區(qū)的任務(wù)了。?

2、程序已經(jīng)最小化到托盤區(qū)了,但是對(duì)托盤圖標(biāo)的操作如何進(jìn)行呢?這就體現(xiàn)了結(jié)構(gòu)NOTIFYICONDATA的成員uCallbackMessage 的作用了。它所提供的作用就是,當(dāng)用戶用鼠標(biāo)點(diǎn)擊托盤區(qū)的圖標(biāo)的時(shí)候(無論是左鍵還是右鍵),會(huì)向hWnd所代表的窗口傳送消息.?
如上例,我們自定義了消息WM_SHOWTASK。根據(jù)VC的消息機(jī)制,對(duì)自定義消息增加消息響應(yīng)函數(shù).?

在*Dlg.cpp文件上面定義一個(gè)用戶消息:?
#define WM_SHOWTASK (WM_USER + 2012)?

在頭文件的//{{AFX_MSG和//}}AFX_MSG之間聲明消息響應(yīng)函數(shù):?

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam); ?

然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之間加入: ON_MESSAGE(WM_SHOWTASK,onShowTask)將消息和消息響應(yīng)函數(shù)映射起來。?

然后就是在CPP文件中加入函數(shù)onShowTask的實(shí)現(xiàn)了:?

LRESULT CDdDlg::onShowTask(WPARAM wParam, LPARAM lParam) // wParam接收的是圖標(biāo)的ID,而lParam接收的是鼠標(biāo)的行為 { if(wParam != IDR_MAINFRAME)return 1; switch(lParam) { case WM_RBUTTONUP: //右鍵菜單 {LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint); // 得到鼠標(biāo)位置 CMenu menu; menu.CreatePopupMenu(); // 創(chuàng)建一個(gè)彈出式菜單 //增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已隱藏),退出程序menu.AppendMenu(MF_STRING, WM_DESTROY, "關(guān)閉");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); // 顯示主窗口} break;}return 0; }

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的VC++中把一个对话框最小化到托盘[转载]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。