日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

VC++中把一个对话框最小化到托盘

發(fā)布時(shí)間:2025/5/22 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++中把一个对话框最小化到托盘 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://zhidao.baidu.com/question/39126833.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 _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

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

cbSize : 結(jié)構(gòu)的長(zhǎng)度,用“位”來(lái)做單位。一般在程序中,我們用(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來(lái)得到句柄。例如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所代表的窗口。所以說(shuō),在uFlags中,一般都得標(biāo)志它有效。這里一般都是自定義的消息。

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

三、托盤編程例子

1、將程序最小化到系統(tǒng)托盤區(qū)的函數(shù)toTray()。

void CTimeWakeDlg::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,"計(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í)候(無(wú)論是左鍵還是右鍵),會(huì)向hWnd所代表的窗口傳送消息.
如上例,我們自定義了消息WM_SHOWTASK。根據(jù)VC的消息機(jī)制,對(duì)自定義消息增加消息響應(yīng)函數(shù).

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

在頭文件的//{{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ù)映射起來(lái)。

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

LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是圖標(biāo)的ID,而lParam接收的是鼠標(biāo)的行為
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右鍵起來(lái)時(shí)彈出快捷菜單,這里只有一個(gè)“關(guān)閉”
{

LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠標(biāo)位置
CMenu menu;
menu.CreatePopupMenu();//聲明一個(gè)彈出式菜單
//增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已
//隱藏),將程序結(jié)束。
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);//簡(jiǎn)單的顯示主窗口完事兒
}
break;
}
return 0;
}

總結(jié)

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

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