VC最小化程序到托盤_第1頁
VC最小化程序到托盤_第2頁
VC最小化程序到托盤_第3頁
VC最小化程序到托盤_第4頁
VC最小化程序到托盤_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

一、NOTIFYICONDATA結(jié)構(gòu)NOTIFYICONDATA結(jié)構(gòu)包含了系統(tǒng)用來處理托盤圖標(biāo)的信息,它包括選擇的圖標(biāo)、回調(diào)消息、提示消息、圖標(biāo)對應(yīng)的窗口等內(nèi)容。其定義為:

typedefstruct_NOTIFYICONDATA{

DWORDcbSize;

//以字節(jié)為單位的這個結(jié)構(gòu)的大小

HWNDhWnd;

//接收托盤圖標(biāo)通知消息的窗口句柄

UINTuID;//應(yīng)用程序定義的該圖標(biāo)的ID號

UINTuFlags;

//設(shè)置該圖標(biāo)的屬性

UINTuCallbackMessage;

//應(yīng)用程序定義的消息ID號,此消息傳遞給hWnd

HICONhIcon;

//圖標(biāo)的句柄

charszTip[64];

//鼠標(biāo)停留在圖標(biāo)上顯示的提示信息

}NOTIFYICONDATA,*PNOTIFYICONDATA;

該結(jié)構(gòu)中,成員uFlags可以使下列之一或組合:

NIF_ICON

設(shè)置成員hIcon有效

NIF_MESSAGE

設(shè)置成員uCallbackMessage有效

NIF_TIP

設(shè)置成員szTip有效二、Shell_NotifyIcon函數(shù)

全局函數(shù)Shell_NotifyIcon()用于在托盤上增加、刪除或修改圖標(biāo)。其原型為:

WINSHELLAPIBOOLWINAPIShell_NotifyIcon(DWORDdwMessage,PNOTIFYICONDATApnid);Pnid是上面的NOTIFYICONDATA結(jié)構(gòu)的指針;dwMessage是被傳遞的消息,可以是以下消息之一:

NIM_ADD

增加圖標(biāo)

NIM_DELETE

刪除圖標(biāo)

NIM_MODIFY

修改圖標(biāo)三、托盤圖標(biāo)程序設(shè)計示例

首先我們用AppWizard創(chuàng)建一個基于對話框的應(yīng)用程序CUserDlg。m_nid為類成員變量voidCUserDlg::ToTray()

{

m_nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);

m_nid.hWnd=this->m_hWnd;

m_nid.uID=IDR_MAINFRAME;

m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;

m_nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱WM_SHOWTASK頭函數(shù)中定義為WM_USER+1

m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(m_nid.szTip,"托盤圖標(biāo)");//當(dāng)鼠標(biāo)放在上面時,所顯示的內(nèi)容

Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盤區(qū)添加圖標(biāo)

}四.添加消息WM_SHOWTASK的響應(yīng)函數(shù)afx_msgLRESULTonShowTask(WPARAMwParam,LPARAMlParam);在BEGIN_MESSAGE_MAP(CUserDlg,CDialog)和END_MESSAGE_MAP()之間加代碼:ON_MESSAGE(WM_SHOWTASK,onShowTask)編寫該函數(shù):LRESULTCUserDlg::onShowTask(WPARAMwParam,LPARAMlParam)//wParam接收的是圖標(biāo)的ID,lParam接收的是鼠標(biāo)的行為

{

if(wParam!=IDR_MAINFRAME)

return1;

switch(lParam)

{

caseWM_RBUTTONUP://右鍵起來時彈出快捷菜單,這里只有一個“關(guān)閉”

{

LPPOINTlpoint=newtagPOINT;

::GetCursorPos(lpoint);//得到鼠標(biāo)位置

CMenumenu;

menu.CreatePopupMenu();//聲明一個彈出式菜單

//增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已

//隱藏),將程序結(jié)束。

menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");

//確定彈出式菜單的位置

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);

//資源回收

HMENUhmenu=menu.Detach();

menu.DestroyMenu();

deletelpoint;

}

break;

caseWM_LBUTTONDBLCLK://雙擊左鍵的處理

{

this->ShowWindow(SW_SHOWNORMAL);//簡單的顯示主窗口

}

break;

}

return0;

}然后在OnInitDialog函數(shù)中調(diào)用ToTray();五為使應(yīng)用程序退出時圖標(biāo)消失,映射WM_DESTROY消息,在OnDestroy()函數(shù)中加入:

::Shell_NotifyIcon(NIM_DELETE,&m_tnid);六。至此,托盤圖標(biāo)程序的常規(guī)功能我們均已實(shí)現(xiàn)。我們還可以通過Shell_NotifyIcon()函數(shù)的調(diào)用實(shí)現(xiàn)不同狀態(tài)下圖標(biāo)的改變,就象金山詞霸在主窗口打開與暫停取詞時圖標(biāo)有所改變一樣。它常用來顯示一些系統(tǒng)的狀態(tài)。如:系統(tǒng)時間,音量控制以及其它的一些圖標(biāo)總體的思想就是這樣的在VC++中,想實(shí)現(xiàn)將MFC最小化到系統(tǒng)托盤,需要調(diào)用NOTIFYICONDATA類,并注冊相應(yīng)的消息,以下詳細(xì)講解如何實(shí)現(xiàn):

第一步,聲明一個NOTIFYICONDATA類,也就是NOTIFYICONDATANotifyIcon;該句可以放在Dlg類的聲明中,作為Dlg類的一個成員;也可以放在Dlg類的實(shí)現(xiàn)中,作為全局變量來使用。

第二步,聲明一個響應(yīng)函數(shù)afx_msgvoidOnNotifyIcon(WPARAMwParam,LPARAMIParam);用于響應(yīng)鼠標(biāo)操作。將這個函數(shù)放入Dlg類的聲明中,作為Dlg類的一個成員。

第三步,定義消息名稱以消息號,并注冊消息,該步很重要!我就是因?yàn)闆]有注冊消息,導(dǎo)致調(diào)試了很久都找不到問題所在。該步都是在Dlg.cpp(Dlg的實(shí)現(xiàn)中)中操作。定義消息名稱和消息號:#defineWM_NC(WM_USER+1001),1001只是用于指定一個消息號,可以隨便指定。注冊則是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之間添加ON_MESSAGE(WM_NC,OnNotifyIcon)。

第四步,在要將MFC最小化到系統(tǒng)托盤的函數(shù)中添加如下代碼:

NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);

NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

NotifyIcon.hWnd=m_hWnd;

lstrcpy(NotifyIcon.szTip,"NotifyIconTest");

NotifyIcon.uCallbackMessage=WM_NC;

NotifyIcon.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;

Shell_NotifyIcon(NIM_ADD,&NotifyIcon);

有了上面的代碼,當(dāng)程序運(yùn)行到含有如上代碼的函數(shù)時就會在系統(tǒng)托盤處添加一個圖標(biāo),想隱藏主對話框,就再添加一句ShowWindow(SW_HIDE);這樣就實(shí)現(xiàn)了將MFC最小化到系統(tǒng)托盤。但還要添加點(diǎn)擊托盤圖標(biāo)時響應(yīng)鼠標(biāo)的函數(shù),也就是第二步中的函數(shù)OnNotifyIcon。

第五步,OnNotifyIcon函數(shù),如下:

voidCDlg::OnNotifyIcon(WPARAMwParam,LPARAMIParam)

{

if((IParam==WM_LBUTTONDOWN)||(IParam==WM_RBUTTONDOWN))

{

ModifyStyleEx(0,WS_EX_TOPMOST);

ShowWindow(SW_SHOW);

//Shell_NotifyIcon(NIM_DELETE,&NotifyIcon);

}

}

以上函數(shù)寫的很簡單,因?yàn)槲叶x的是基于對話框的MFC,沒有添加menu,所以只是實(shí)現(xiàn)了簡單的點(diǎn)擊托盤圖標(biāo)就彈出主對話框。對于右鍵點(diǎn)擊托盤圖標(biāo)彈出小menu,然后選擇操作,最好是建立工程的時候就選擇基于菜單的MFC,這樣會容易很多,詳細(xì)的我自己還沒有研究,就不亂講了。對于上面函數(shù)中Shell_NotifyIcon(NIM_DELETE,&NotifyIcon)一句,是清除托盤圖標(biāo),在這里可以沒有,但在退出整個程序的時候一定要加上,不然程序退出了,托盤處還有一個圖標(biāo),只有鼠標(biāo)指到那里時系統(tǒng)才會發(fā)現(xiàn)是進(jìn)程殘留而清除,這種做法很不好!

轉(zhuǎn)自:/s/blog_55f9aac501008gql.html

/hejiady/blog/item/44b730cfb0b0ed38f9dc6163.html

/bester/archive/2009/04/03/78842.html

/course/3_program/vc/vc_js/2007930/75148.html

有了這個是不是還不知道代碼放到哪里那?請看下面

vc響應(yīng)最大化最小化按鈕的事件或消息方法一。在OnSize消息事件中處理

最小化SIZE_MINIMIZED,

最大化SIZE_MAXIMIZED,

還原SIZE_RESTORED,例如:voidCMainDlg::OnSize(UINTnType,intcx,intcy)

{

CDialog::OnSize(nType,cx,cy);//TODO:Addyourmessagehandlercodehere

//::SendMessage(g_hMain,WM_FORM_RESIZE,0,0);

if

(nType==SIZE_MAXIMIZED)

{

//在這里添加最小化

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論