關(guān)于在MFC中將窗口最小化到托盤(pán)實(shí)現(xiàn)原理及操作步驟
更新時(shí)間:2013年01月28日 10:38:52 作者:
最小化的原理:首先要將窗口隱藏,然后在右下角繪制圖標(biāo);恢復(fù)的原理:將窗口顯示,再將托盤(pán)中的圖片刪除,接下來(lái)介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助
步驟/方法
(一) 原理
1、最小化的原理:首先要將窗口隱藏,然后在右下角繪制圖標(biāo)。
2、恢復(fù)的原理:將窗口顯示,再將托盤(pán)中的圖片刪除。
(二)程序?qū)崿F(xiàn)
1、自定義消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER +1)
2、在MFC的
::OnSysCommand(UINT nID, LPARAM lParam) 函數(shù)體中增加一個(gè)命令響應(yīng)
if(nID==SC_MINIMIZE)
ToTray(); //最小化到托盤(pán)的函數(shù)
3、在消息映射中添加
ON_MESSAGE(WM_SHOWTASK,OnShowTask); //其中WM_SHOWTASK是消息名,
OnShowTask是自己定義的消息響應(yīng)函數(shù),后面有說(shuō)明。
(三)具體函數(shù)內(nèi)容
1、最小化到托盤(pán)函數(shù)
void CMyDlg::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;//自定義的消息名稱(chēng)
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名稱(chēng)"); //信息提示條
Shell_NotifyIcon(NIM_ADD,&nid); //在托盤(pán)區(qū)添加圖標(biāo)
ShowWindow(SW_HIDE); //隱藏主窗口
}
2、恢復(fù)界面函數(shù)
在頭文件中定義消息響應(yīng)函數(shù)
afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
//wParam接收的是圖標(biāo)的ID,而lParam接收的是鼠標(biāo)的行為
LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
{
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è)彈出式菜單
menu.AppendMenu(MF_STRING,WM_DESTROY,"關(guān)閉"); //增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已隱藏),將程序結(jié)束。
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)單的顯示主窗口完事兒
DeleteTray();
} break;
default: break;
}
return 0;
}
刪除托盤(pán)圖標(biāo)函數(shù)
void CMyDlg::DeleteTray()
{
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; //自定義的消息名稱(chēng)
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名稱(chēng)"); //信息提示條為“計(jì)劃任務(wù)提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盤(pán)區(qū)刪除圖標(biāo)
}
(一) 原理
1、最小化的原理:首先要將窗口隱藏,然后在右下角繪制圖標(biāo)。
2、恢復(fù)的原理:將窗口顯示,再將托盤(pán)中的圖片刪除。
(二)程序?qū)崿F(xiàn)
1、自定義消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER +1)
2、在MFC的
::OnSysCommand(UINT nID, LPARAM lParam) 函數(shù)體中增加一個(gè)命令響應(yīng)
if(nID==SC_MINIMIZE)
ToTray(); //最小化到托盤(pán)的函數(shù)
3、在消息映射中添加
ON_MESSAGE(WM_SHOWTASK,OnShowTask); //其中WM_SHOWTASK是消息名,
OnShowTask是自己定義的消息響應(yīng)函數(shù),后面有說(shuō)明。
(三)具體函數(shù)內(nèi)容
1、最小化到托盤(pán)函數(shù)
復(fù)制代碼 代碼如下:
void CMyDlg::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;//自定義的消息名稱(chēng)
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名稱(chēng)"); //信息提示條
Shell_NotifyIcon(NIM_ADD,&nid); //在托盤(pán)區(qū)添加圖標(biāo)
ShowWindow(SW_HIDE); //隱藏主窗口
}
2、恢復(fù)界面函數(shù)
在頭文件中定義消息響應(yīng)函數(shù)
復(fù)制代碼 代碼如下:
afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
//wParam接收的是圖標(biāo)的ID,而lParam接收的是鼠標(biāo)的行為
LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
{
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è)彈出式菜單
menu.AppendMenu(MF_STRING,WM_DESTROY,"關(guān)閉"); //增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已隱藏),將程序結(jié)束。
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)單的顯示主窗口完事兒
DeleteTray();
} break;
default: break;
}
return 0;
}
刪除托盤(pán)圖標(biāo)函數(shù)
復(fù)制代碼 代碼如下:
void CMyDlg::DeleteTray()
{
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; //自定義的消息名稱(chēng)
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名稱(chēng)"); //信息提示條為“計(jì)劃任務(wù)提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盤(pán)區(qū)刪除圖標(biāo)
}
您可能感興趣的文章:
- MFC中動(dòng)態(tài)創(chuàng)建控件以及事件響應(yīng)實(shí)現(xiàn)方法
- MFC程序執(zhí)行過(guò)程深入剖析
- MFC程序?qū)ξ募奶幚矸椒?/a>
- MFC創(chuàng)建模態(tài)對(duì)話框和非模態(tài)對(duì)話框的方法
- VC MFC非模態(tài)對(duì)話框的實(shí)現(xiàn)方法
- MFC命名規(guī)則匯總
- MFC自定義消息的實(shí)現(xiàn)方法
- 構(gòu)建mfc窗體的簡(jiǎn)單示例
- MFC中exe圖標(biāo)修改的方法
- MFC擴(kuò)展DLL中導(dǎo)出類(lèi)和對(duì)話框的實(shí)現(xiàn)方法
相關(guān)文章
C語(yǔ)言中auto,register,static,const,volatile的區(qū)別詳細(xì)解析
以下是對(duì)C語(yǔ)言中auto,register,static,const,volatile的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09Qt實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的圖片瀏覽器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03C++?Boost?StringAlgorithms超詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11C語(yǔ)言棧與隊(duì)列相互實(shí)現(xiàn)詳解
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊(duì)列實(shí)現(xiàn)棧與用棧實(shí)現(xiàn)隊(duì)列2022-04-04C語(yǔ)言實(shí)現(xiàn)用戶(hù)態(tài)線程庫(kù)案例
下面小編就為大家?guī)?lái)一篇C語(yǔ)言實(shí)現(xiàn)用戶(hù)態(tài)線程庫(kù)案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05