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::IDDpParent)

{

     //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);

 

     CMenupSysMenuGetSystemMenu(FALSE);

     if (pSysMenu != NULL)

     {

         CString strAboutMenu;

         strAboutMenu.LoadString(IDS_ABOUTBOX);

         if (!strAboutMenu.IsEmpty())

         {

              pSysMenu->AppendMenu(MF_SEPARATOR);

              pSysMenu->AppendMenu(MF_STRINGIDM_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.mzph.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] 包含此函数的…