MFC程式最小化到系統托盤
為了使MFC程式(SDI,MDI,DLG)均能最小化到系統托盤,這裡運用訊息機制來實現系統托盤效果。
那麼什麼是托盤呢?所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或掛起時,但有不希望佔據工作列的時候,就可以把程式放到托盤區。
怎麼實現呢?這裡需要運用到的Windows API函式:
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
函數了裡面的引數對於實現不同的效果尤其重要,包括托盤圖示、托盤選單等等。那麼我們來了解一下兩個引數吧:
dwMessage可以取以下值:
NIM_ADD 向托盤中加入一個圖示
NIM_MODIFY 修改托盤中的圖示
NIM_DELETE 從托盤中刪除一個圖示
引數pnid是NOTIFYICONDATA結構的一個引用。該結構的原型如下:
具體步驟如下:typedef struct _NOTIFYICONDATA { DWORD cbSize; // 結構的大小,必須在程式中給出 HWND hWnd; // 程式中將要接收托盤訊息的視窗控制代碼 UINT uID; // 應用程式中定義的托盤圖示ID,此引數用作標識 UINT uFlags; //設定屬性 標記下邊3個引數是否有效 UINT uCallbackMessage;// 自定義的訊息ID值 HICON hIcon;//顯示在系統托盤上的Icon的控制代碼 #if (_WIN32_IE < 0x0500) TCHAR szTip[64;// 用於圖示顯示的提示字串 #else TCHAR szTip[128]; #endif #if (_WIN32_IE >= 0x0500) DWORD dwState; DWORD dwStateMask; TCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; #endif #if (_WIN32_IE >= 0x600) GUID guidItem; #endif } NOTIFYICONDATA, *PNOTIFYICONDATA;
1.在程式中增加一個私有的NOTIFYICONDAT物件
private:
NOTIFYICONDATA m_tnid;
2.在初始化視窗時對NOTIFYICONDAT物件初始化 用Shell_NotifyIcon函式進行註冊3.增加自定義的訊息處理函式或者過載WindowProc函式,在訊息處理函式或WindowProc函式中對自定義的訊息進行處理m_notify.cbSize=sizeof NOTIFYICONDATA; m_notify.hWnd=this->m_hWnd; m_notify.uID=IDR_MAINFRAME; m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(m_notify.szTip,"Michael_Chen is a good man"); m_notify.uCallbackMessage=WM_USER_NOTIFYICON; m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //OK,下面就是托盤產生了. Shell_NotifyIcon(NIM_ADD,&m_notify);
1)運用自定義訊息
i,WM_USER_NOTIFYICON是自定義的訊息 在標頭檔案中進行宣告;
#define WM_USER_NOTIFYICON WM_USER+1
ii,在.h檔案中宣告訊息函式原型 afx_msg LRESULT OnNotifyMsg(WPARAM wparam,LPARAM lparam);
iii,在.cpp檔案中進行訊息對映BEGIN_MESSAGE_MAP(CNotifyiconDlg, CDialog)
//{{AFX_MSG_MAP(CNotifyiconDlg)
...
ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
iiii,在.cpp檔案中新增自定義的訊息響應程式碼,左鍵雙擊彈出應用程式主視窗,右鍵單擊彈出選單。LRESULT CNotifyiconDlg::OnNotifyMsg(WPARAM wparam,LPARAM lparam)
//wParam接收的是圖示的ID,而lParam接收的是滑鼠的行為
{
if(wparam!=IDR_MAINFRAME)
return 1;
switch(lparam)
{
case WM_RBUTTONUP://右鍵起來時彈出快捷選單,這裡只有一個“關閉”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到滑鼠位置
CMenu menu;
menu.CreatePopupMenu();//宣告一個彈出式選單
//增加選單項“關閉”,點選則傳送訊息WM_DESTROY給主視窗(已
//隱藏),將程式結束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"關閉");
//確定彈出式選單的位置
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;
}
2)過載WindowProc函式
i,過載WindowProc函式(方法略)
ii,在WindowProc中增加的訊息相應程式碼
//WindowProc中增加的程式碼
LRESULT CNotifyiconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message) //判斷訊息型別
{
case WM_USER_NOTIFYICON:
//如果是使用者定義的訊息
if(lParam==WM_LBUTTONDBLCLK)
{
//滑鼠雙擊時主窗口出現
if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判斷視窗當前狀態
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隱藏視窗
}
else
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //顯示視窗
}
}
else if(lParam==WM_RBUTTONDOWN)
{ //滑鼠右鍵單擊彈出選單
CMenu menu;
menu.LoadMenu(IDR_MENU1); //載入事先定義的選單
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND:
//如果是系統訊息
if(wParam==SC_MINIMIZE)
{
//接收到最小化訊息時主視窗隱藏
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
if(wParam==SC_CLOSE)
{
::Shell_NotifyIcon(NIM_DELETE,&m_notify); //關閉時刪除系統托盤圖示
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
經過以上的步驟,就編寫出了一個簡單的可以最小化到托盤的程式。該程式在一啟動時,在托盤創立應用程式的圖示,最小化程式時隱藏主視窗,雙擊托盤區的圖示時,顯示主視窗,右鍵點選托盤區視窗時,彈出選單。
相關推薦
MFC程式最小化到系統托盤
為了使MFC程式(SDI,MDI,DLG)均能最小化到系統托盤,這裡運用訊息機制來實現系統托盤效果。 那麼什麼是托盤呢?所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或
Python:程式最小化到托盤功能實現
本文講解如何裝python的開發的命令列程式最小化到托盤的方法,並提供選單操作功能。 上個月使用python實現了一個多功能抓圖工具,見《Python:一個多功能的抓圖工具開發(附原始碼)》,此程式為一個命令列程式,windows下執行時會彈出一個cmd視窗,裡面什
將程式最小化到托盤(實用工具)
如何將程式最小化到系統托盤? 有些軟體點選最小化是自動最小化到系統托盤而不是工作列的(如QQ,MSN,各種防毒軟體等等),多數軟體點選最小化會將軟體最小化到工作列(如IE,文件等等),怎麼讓這些軟體也最小化到系統托盤呢?利用工具可以幫到你:Tray Everything Tray Everything 使用
VC++MFC對話方塊應用程式實現程式最小化到系統托盤
轉自:http://blog.sina.com.cn/s/blog_6b23bc700100pqrm.html 現在使用系統托盤圖示的程式越來越多,尤其是需要長時間執行的程式。這並不是什麼高深的技術,純當做個筆記。 第一步:定義一個 NOTIFYICONDATA 結構
C# 程式最小化到系統托盤
找一個好的ICO圖示。 1、放一個notifyIcon1和contextMenuStrip1控制元件。 2、在notifyIcon1屬性中,關聯加入contextMenuStrip1控制元件。 3、notifyIcon1增加事件:notifyIcon1_MouseD
C#winform中怎麼將程式最小化到系統托盤
1.在form中新增一個NotifyIcon控制元件 2.把87.ico這個圖示放在/bin/Debug目錄下 using System; using System.Collections.Generic; using System.Compon
Qt 最小化到托盤,程式退出
主介面hide之後,程式退出,可在隱藏之前呼叫如下函式 setQuitOnLastWindowClosed(bool quit)來更改當前值。這個屬性用來保留"當最後一個視窗關閉的時候,應用程式是否隱式退出",預設值是true。true:退出,false:不退出。 因此,當
MFC最小化到托盤
1.右鍵對話方塊/屬性/Miniminze Box置為true 2.Cutton_DlgDlg.h : 標頭檔案 #define WM_SHOWTASK (WM_USER+1) 類中定義函式 LRESULT OnShowTask(WPARAM wParam, LPARAM lParam
MFC 主對話方塊最小化到托盤,托盤點選還原主對話方塊。
1.將主對話方塊資源屬性Minimize Box設定為true,這個屬性顯示對話方塊的最小化按鈕。 2.最小化到托盤。 (1)首先要了解,你工作列右下角的托盤都是圖示,所以最小化到托盤建議新增一個Icon資源。 (2)到托盤的函式需要自己重構。 先巨集定義 #define
C# 托盤程式 例項 雙擊顯示窗體,最小化到托盤
原文:http://blog.csdn.net/lan_liang/article/details/7697742 單擊工作列 顯示-隱藏切換,右鍵選單,捕捉關閉窗體事件 [csharp] view plaincopyprint? public
MFC對話方塊最小化到托盤程式設計實現步驟
以工程為例說明過程:此程式程式設計環境是VS2008,在除錯過程中,將字符集修改為“使用多位元組字符集”(專案->屬性->配置屬性->字符集)。 例如新建一個MFC對話方塊工程Dialogtest,程式實現的功能是,修改對話方塊標題欄上預設的圖示,在程式中改為新增的資源
總結:一個簡單的MFC實現最小化托盤效果
先上說明,最後我會附上程式碼,我也是臨時新學的,請諸位指正 對於標頭檔案中的CxxxDlg類定義而言,需要新增以下幾個地方,見下圖 對於上圖中的最下面的public部分,略作解釋 NOTIFYICONDATA m_nid; //新增成員變數 afx_msg LRESUL
MFC將視窗最小化到托盤
1、在標頭檔案中自定義訊息:#define WM_SHOWTASK WM_USER+1以及宣告訊息響應函式: afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam); 宣告一個結構體變數:NOTIFYICON
SWT 中實現最小化到托盤圖示,並只能通過托盤的彈出選單關閉程式
from: http://www.blogjava.net/Unmi/archive/2008/03/23/188040.html 我們有些程式會想要托盤處顯示圖示,最小化到系統欄;關閉按鈕不關閉程式,也是最小化到系統欄;點選托盤圖示啟用視窗,通過托盤圖示的彈出選單來退出程式
MFC對話方塊最小化到托盤
1、在資源中的Icon中匯入一個自己喜歡的圖示,ID命名為IDR_MAINFRAME,將先前的IDR_MAINFRAME的圖示刪除掉; 2、在自己的Dialog標頭檔案中定義一個變數 NOTIFYICONDATA m_nid,關於該結構體的具體資訊可以查閱MSDN; 3、新
Qt之程式最小化托盤顯示及操作
1.功能說明 對於GUI程式,如果想要實現當最小化時,程式從工作列消失,在系統托盤顯示一個圖示,表示此程式,並能在托盤內通過雙擊或者選單使程式介面恢復。 2.使用的類 主要使用的此類:QSystemTrayIcon。 其中QSystemTrayIcon是
MFC中將視窗最小化到托盤的一種方法
(二)程式實現 1、自定義訊息WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1) 2、在MFC的 ::OnSysCommand(UINT nID, LPARAM lParam) 函式體中增加一個命令響應 if(nID==SC_MINIMIZE) ToTray
Delphi7使用控制元件CoolTrayIcon時如何做到程式啟動就最小化到托盤
學習Delphi時,使用了第3方控制元件CoolTrayIcon。CoolTrayIcon的功能很強大,能夠將程式新增進托盤,省去了我們再編寫程式碼來實現托盤。但是在看搜CoolTrayIcon的時候,發現好多朋友在求如何讓程式在啟動就最小化多托盤的方法。但是貌似都不曾成功
C#最小化到托盤+雙擊托盤恢復+禁止運行多個該程序
create obj csdn HA etc chan HR 添加 圖標 托盤程序的制作: 1.添加notifyIcon控件,並添加Icon,否則托盤沒有圖標(托盤右鍵菜單也可直接在屬性裏添加);2.響應Form的Resize或SizeChanged消息: // H
Linux Centos7.5 檢視IP地址( 最小化系統安裝 )
ps: Linux Centos7.5 最小化系統預設是把網絡卡給沒開啟,所以檢視不了ip地址。而且無法使用ifconfig命令,會提示命令找不到。 1、進入網絡卡的配置檔案,進行修改。 首先