MFC對話框最小化到托盤

1、在資源中的Icon中導入一個自己喜歡的圖標,ID命名為IDR_MAINFRAME,將先前的IDR_MAINFRAME的圖標刪除掉;

2、在自己的Dialog頭文件中定義一個變量? NOTIFYICONDATA?m_nid,關于該結構體的具體信息可以查閱MSDN;

3、添加消息響應函數OnInitDialog(),并在該函數中添加以下代碼,這樣程序一啟動,就在托盤中顯示出了自己應用程序的圖標。

??? //---------------------------托盤顯示---------------------------------//

??? 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;? ?????????? // 自定義的消息名稱

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

??? strcpy(m_nid.szTip, "服務器程序");????????????????// 信息提示條為"服務器程序",VS2008 UNICODE編碼用wcscpy_s()函數

??? Shell_NotifyIcon(NIM_ADD, &m_nid);??????????? ??? // 在托盤區添加圖標

??? 這時候編譯,會報WM_SHOWTASK的錯,因為該消息要自己定義。

4、在Dialog頭文件中聲明消息函數原型????? ???????????????????????????????????

????LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

5、在Dialog源文件中進行消息映射

????ON_MESSAGE(WM_SHOWTASK,OnShowTask)

6、在Dialog源文件中添加自定義的消息響應代碼,左鍵雙擊彈出應用程序主窗口,右鍵單擊彈出菜單。

????LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam)

??? {

?????????? if(wParam != IDR_MAINFRAME)

????????????????? return 1;

?????????? switch(lParam)

?????????? {

?????????? case WM_RBUTTONUP:????????????????????????????????? ????? // 右鍵起來時彈出菜單

????????????????? {

????????????????????

???????????????????????? LPPOINT lpoint = new tagPOINT;

??????????????????????? ?::GetCursorPos(lpoint);????????????????????// 得到鼠標位置

??????????????????????? ?CMenu menu;

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

??????????????????????? ?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_SHOWNORMAL);???????? // 顯示主窗口

????????????????? }

????????????????? break;

?????????? }

?????????? return 0;

??? }

7、添加OnSize消息響應函數,處理最小化時的操作。

????void CServerDlg::OnSize(UINT nType, int cx, int cy)

??? {

?????????? CDialog::OnSize(nType, cx, cy);

?????????? // TODO: Add your message handler code here

?????????? if(nType == SIZE_MINIMIZED)??

?????????? {??

????????????????? ShowWindow(SW_HIDE); // 當最小化市,隱藏主窗口 ?????????????

?????????? }??

??? }

8、添加關閉窗口時的消息響應函數,將托盤中的應用程序圖標刪除

????BOOL CServerDlg::DestroyWindow()

??? {

?????????? // TODO: Add your specialized code here and/or call the base class

?????????? // 在托盤區刪除圖標

?????????? Shell_NotifyIcon(NIM_DELETE, &m_nid);?????????????

?????????? return CDialog::DestroyWindow();

??? }

??? 經過以上的步驟,就編寫出了一個簡單的可以最小化到托盤的程序。該程序在一啟動時,在托盤創立應用程序的圖標,最小化程序時隱藏主窗口,雙擊托盤區的圖標時,顯示主窗口,右鍵點擊托盤區窗口時,彈出菜單進行相應的操作。


*****************************************************************************************************************************************************************************

以工程為例說明過程:此程序編程環境是VS2008,在調試過程中,將字符集修改為“使用多字節字符集”(項目->屬性->配置屬性->字符集)。

例如新建一個MFC對話框工程Dialogtest,程序實現的功能是,修改對話框標題欄上默認的圖標,在程序中改為添加的資源Icon?IDI_ICON1,最小化對話框到托盤。

首先,在對話框資源屬性頁,選擇Minimize BoxTRUE。這樣可以實現對話框的最小化,但是這時最小化到了任務欄,為了使其最小化到托盤,還必須添加一些代碼,步驟如下:

首先添加變量NOTIFYICONDATA?m_nid;//NOTIFYICONDATA作用是用來向任務欄托盤區域發送消息和自定義消息響應函數OnShowTask?,自定義消息響應函數主要是添加三處代碼:

1)頭文件中聲明部分添加#define?WM_SHOWTASK WM_USER+1,代碼部分添加afx_msg LRESULT OnShowTask(WPARAMwParam,LPARAM lParam);

2)在源程序中添加:BEGIN_MESSAGE_MAP(CDialogtestDlg, CDialog)

?????ON_WM_SYSCOMMAND()

?????ON_WM_PAINT()

?????ON_WM_QUERYDRAGICON()

????

?????//}}AFX_MSG_MAP

?????ON_MESSAGE(WM_SHOWTASK,OnShowTask)//此處為添加部分

END_MESSAGE_MAP()

3)源程序中的響應函數代碼

在本實現中源程序中總共添加了五處代碼:(紅色為添加的代碼)

1、修改圖標資源:

CDialogtestDlg::CDialogtestDlg(CWnd*pParent?/*=NULL*/)

???? :CDialog(CDialogtestDlg::IDD,?pParent)

{

?????//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// IDR_MAINFRAME為系統默認

?????m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

}

2、同上自定義消息2

BEGIN_MESSAGE_MAP(CDialogtestDlg,CDialog)

?????ON_WM_SYSCOMMAND()

?????ON_WM_PAINT()

?????ON_WM_QUERYDRAGICON()

????

?????//}}AFX_MSG_MAP

?????ON_MESSAGE(WM_SHOWTASK,OnShowTask)

?????ON_WM_SIZE()//為了隱藏最小化到任務欄的圖標而添加的消息響應函數,這個函數系統自帶直接添加

END_MESSAGE_MAP()

3、修改對話框標題欄圖標并在托盤區添加圖標:

BOOL?CDialogtestDlg::OnInitDialog()

{

?????CDialog::OnInitDialog();

?

?????//?關于...菜單項添加到系統菜單中。

?

?????// IDM_ABOUTBOX?必須在系統命令范圍內。

?????ASSERT((IDM_ABOUTBOX& 0xFFF0) ==?IDM_ABOUTBOX);

?????ASSERT(IDM_ABOUTBOX< 0xF000);

?

?????CMenu*?pSysMenu=?GetSystemMenu(FALSE);

?????if?(pSysMenu?!=?NULL)

???? {

?????????CString?strAboutMenu;

?????????strAboutMenu.LoadString(IDS_ABOUTBOX);

?????????if?(!strAboutMenu.IsEmpty())

???????? {

??????????????pSysMenu->AppendMenu(MF_SEPARATOR);

??????????????pSysMenu->AppendMenu(MF_STRING,?IDM_ABOUTBOX,strAboutMenu);

???????? }

???? }

?

?????//?設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動

?????//??執行此操作

?????SetIcon(m_hIcon,TRUE);??????????//?設置大圖標

?????SetIcon(m_hIcon,FALSE);?????????//?設置小圖標

?????// TODO:?在此添加額外的初始化代碼

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

???? m_nid.hWnd = this->m_hWnd;

???? m_nid.uID = IDI_ICON1;

???? m_nid.uFlags = NIF_ICON|NIF_MESSAGE |NIF_TIP;

???? m_nid.uCallbackMessage = WM_SHOWTASK;

???? m_nid.hIcon?? = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

???? strcpy_s(m_nid.szTip,strlen("對話框")+1,"對話框");

???? Shell_NotifyIcon(NIM_ADD,&m_nid); // 在托盤區添加圖標

?????return?TRUE;??//?除非將焦點設置到控件,否則返回TRUE

}

4、自定義的消息響應函數代碼:

LRESULT CDialogtestDlg::OnShowTask(WPARAMwParam, LPARAM lParam)

{

???? if(wParam != IDI_ICON1) return 1;

?

???? switch(lParam)

???? {

???? case WM_RBUTTONUP:?????????????? //右鍵起來時彈出菜單

???????? {

????????????? LPPOINT lpoint = new tagPOINT;

????????????? ::GetCursorPos(lpoint);??????????????????? // 得到鼠標位置

????????????? CMenu menu;

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

????????????? menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end ofthis menu

????????????? //Displays a floating pop-up menu at the specifiedlocation and tracks the selection of items on the pop-up menu

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

????????????? HMENU hmenu = menu.Detach();

????????????? menu.DestroyMenu();

????????????? delete lpoint;

????????????? break;

???????? }

???? case WM_LBUTTONDBLCLK:??????????????????????????? // 雙擊左鍵的處理

???????? this->ShowWindow(SW_SHOWNORMAL);???????? // 顯示主窗口?

???????? break;

???? }

?

???? return 0;

}

5、處理最小化時任務欄出現圖標的程序:

void CDialogtestDlg::OnSize(UINTnType, int cx, int cy)

{

?????CDialog::OnSize(nType, cx, cy);

?????// TODO:?在此處添加消息處理程序代碼

?????if (nType == SIZE_MINIMIZED)

???? {

???????? ShowWindow(SW_HIDE);//隱藏最小化到任務欄的圖標

???? }

}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458682.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android acache讀后感

今天了解到了一個android輕量級的開源緩存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一點時間研究了一下源代碼&#xff0c;大概的思路就是每個緩存目錄對應一個Acache類&#xff0c;通過mInstanceMap關聯&#xff08;個人覺得這個主要是減少對…

continue break

塊作用域 一個塊或復合語句是用一對花括號&#xff08;"{}"&#xff09;括起來的任意數量的簡單的java語句。塊定義了變量的作用范圍。 1、嵌套塊是方法內的嵌套&#xff0c;不包括類的花括號。在嵌套塊內的 變量是不可以重復定義的。 2、不允許重復定義的是局部變…

GetVersionEx 獲取系統版本信息

轉自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上獲取系統版本信息需要調用系統API&#xff0c;于是用到了GetVersionEx。 首先看一看函數原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…

popoverController(iPad)

一、設置尺寸 提示&#xff1a;不建議&#xff0c;像下面這樣吧popover的寬度和高度寫死。 1 //1.新建一個內容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一個popoverController&#xff0c;并設置其內容控制器5 s…

靜態成員變量和非靜態成員變量的對比

靜態成員變量和非靜態成員變量的對比 1、存儲的數據 靜態成員變量存儲的是所有對象共享的數據 非靜態成員變量存儲的是每個對象特有的數據 2、存儲位置 靜態成員變量是隨著類的加載在方法區的靜態區開辟內存了 非靜態成員變量是隨著對象的創建再堆中開辟內存 3、調用方式 靜態成…

c++的thread類(c++線程簡單用法)

最近看了一個Thread類&#xff08;忘記在哪里看的了&#xff09;&#xff0c;感覺不錯。 創建線程時線程對應的函數必須是類的靜態成員&#xff0c;由于靜態成員無法訪問類的非靜態成員&#xff0c;我從前都是把對象的指針作為參數傳遞給線程函數來避免這個問題&#xff0c;但是…

[LeetCode]Merge Sorted Array

題目描述:(鏈接) Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additional elements from nums2. The number of eleme…

[LeetCode]Integer to Roman

題目描述:(鏈接&#xff09; Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 解題思路&#xff1a; 1 class Solution {2 public:3 string intToRoman(int num) {4 vector<int> values{1000…

[c++]代理對象模式

代理對象 <code class"hljs cpp has-numbering" style"display: block; padding: 0px; box-sizing: border-box; font-family: Source Code Pro, monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius:…

this static 面向對象三大特點

面向對象三大特點&#xff1a;封裝、繼承、多態 封裝&#xff1a;只對外界提供有用的屬性和行為 this&#xff1a;是一個引用&#xff0c;總是指向當前對象 static 存放位置是方法區中的靜態區 static特點 static修飾的成員變量隨著類的加載就在靜態區中開辟內存 所…

fastQC

Fastqc用途 FastQC aims to provide a simple way to do some quality control checks on raw sequence data coming from high throughput sequencing pipelines. It provides a modular set of analyses which you can use to give a quick impression of whether your data …

C++代理 Surrogate

容器通常只能包含一種類型的對象&#xff0c;所以很難在容器中存儲對象本身。存儲指向對象的指針&#xff0c;雖然允許通過繼承來處理類型不同的問題&#xff08; 多態性 &#xff09;&#xff0c;但是也增加了內存分配的額外負擔。所以我們通過定義名為 代理 的對象來解決該問…

C++ Handle(句柄) part1

本文是我學習C&#xff0b;&#xff0b;沉思錄第6章的筆記 本文主要講述了Handle類的概念&#xff0c;定義方法以及寫時復制技術。 在前文(Surrogate代理類)的講解中我們了解到了代理的實現方法. 代理類有很多好處,但是麻煩的是每次都得進行復制.如果該類是經常使用并且member很…

sscanf的高級用法

sscanf的高級用法&#xff08;總結&#xff09; 2012-04-25 18:50:25分類&#xff1a; C/C sscanf(recvbuf,"%*[^/]/%[^ ]s",buf_rev); sscanf(buf, "GET /%[^ ]", buf_rev);這個是在一個webserver.c里面的例子&#xff0c;通過sscanf&#xff08;&#xf…

選擇排序 冒泡排序 二分查找

選擇排序 int [] arr {2,48,28,32,90,12}; for&#xff08;int i 0&#xff1b; i < arr.length - 1;i&#xff09;{ for(int j i 1; j < arr.length;j){ if(arr[i] < arr[j]){ int c; c arr[i]; arr[i] arr[j]; arr[j] c; } } } 冒泡排序 for(int i 0;i <…

C++, ID、指針、handle (void *)的區別

原文鏈接&#xff1a; http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html 在Windows程序設計中&#xff0c;句柄是無法精確定義的術語。隨便找一個高手&#xff0c;讓他給你講講句柄是什么&#xff0c;恐怕他都很難給你一個具體的定義來。 在Wind…

Swift調用Objective C的FrameWork

很多Github的庫經過很多年的發展&#xff0c;源碼都是OC寫的&#xff0c;&#xff0c;所以&#xff0c;用Swift調用OC的庫就是開發中難免遇到的的一個問題&#xff0c;本文以AFNetworking為例&#xff0c;講解如何跨語言調用。 第一步 創建一個空的工程 注意&#xff0c;語言選…

命令行 java文本編輯工具 重載 內存區域 棧 堆

一、dir 列出當前目錄下的文件以及文件夾 md創建目錄 rd刪除目錄 cd 進入指定目錄 cd..返回到上一級目錄 &#xff1a; 切換盤符 比如&#xff1a; F: 二、editPlus 編寫程序 三、重載&#xff1a;在同一個class中&#xff0c;出現了函數名稱相同&#xff0…

數據結構(Java)——查找和排序(1)

1.查找的定義 查找是這樣一個過程&#xff0c;即在某個項目組中尋找某一指定目標元素&#xff0c;或者確定該組中并不存在該目標元素。 對其進行查找的項目的組有時也成為查找池。兩種常見的查找方式&#xff1a;線性查找和二分查找。為了能夠查找某一對象&#xff0c;我們就必…

GetProcAddress()用法

函數功能描述: GetProcAddress()函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName // 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的…