1. 程式人生 > >MFC程式最小化到系統托盤

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函式進行註冊
	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);
3.增加自定義的訊息處理函式或者過載WindowProc函式,在訊息處理函式或WindowProc函式中對自定義的訊息進行處理

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、進入網絡卡的配置檔案,進行修改。 首先