在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类

下面我们就来讲解一下如何简单实现一个系统托盘我们以对话框程序为列

第一步:在Dlg类中//定义一个NOTIFYICONDATA类的成员变量,用来设置托盘

NOTIFYICONDATA NotifyIcon;

第二步:声明一个消息响应函数 afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);

上面那条代码也放在Dlg的头文件中

第三步:定义一个自定义消息 #define WM_NC WM_USER+1

上面那条代码也在Dlg的头文件中声明

注册消息 ON_MESSAGE(WM_NC,OnNotifyIcon)

上面那条代码在Dlg类中

第四步:在Dlg头文件中添加一个函数用来响应点击最小化按钮

void changeMini();

并在Dlg类中实现这个函数

//响应最小化消息

void CChangeScreenDlg::changeMini()

{

ShowWindow(SW_HIDE);

NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);

NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

NotifyIcon.hWnd=m_hWnd;

lstrcpy(NotifyIcon.szTip,"MediaCraft EMMG");

NotifyIcon.uCallbackMessage=WM_NC;

NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;

Shell_NotifyIcon(NIM_ADD,&NotifyIcon);

}

第五步:截获最小化事件

在Dlg类中找到OnSysCommand函数

修改代码如下

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

   CAboutDlg dlgAbout;

   dlgAbout.DoModal();

}

//拦截最小化事件

if(nID==SC_MINIMIZE) 

{ 

   //ToTray();

//用我们自己的消息响应最小化事件

   changeMini();

} 

else

{

   CDialog::OnSysCommand(nID, lParam);

}

第六步:响应托盘的鼠标事件也是实现我们第二部声明的消息响应函数

void CChangeScreenDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)

{

if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))

{ 

ModifyStyleEx(0,WS_EX_TOPMOST);

ShowWindow(SW_SHOW);

}

}

最后一步:在类的析构函数中记得销毁托盘图标对象

Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);

傻朋提示:以上NOTIFYICONDATA类的一些具体参数,请参阅MSDN

一、NOTIFYICONDATA结构

NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提示消息、图标对应的窗口等内容。其定义为:

typedef struct _NOTIFYICONDATA { 

        DWORDcbSize;         

   //以字节为单位的这个结构的大小

        HWND hWnd;      

   //接收托盘图标通知消息的窗口句柄

        UINT uID; //应用程序定义的该图标的ID号

        UINTuFlags;          

   //设置该图标的属性

        UINT uCallbackMessage;   

   //应用程序定义的消息ID号,此消息传递给hWnd

        HICONhIcon;            

   //图标的句柄

      charszTip[64];          

   //鼠标停留在图标上显示的提示信息

    } NOTIFYICONDATA, *PNOTIFYICONDATA;

该结构中,成员uFlags可以使下列之一或组合:

   NIF_ICON        设置成员hIcon有效

    NIF_MESSAGE    设置成员uCallbackMessage有效

   NIF_TIP           设置成员szTip有效

二、Shell_NotifyIcon函数 

全局函数Shell_NotifyIcon() 用于在托盘上增加、删除或修改图标。其原型为:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);

Pnid是上面的NOTIFYICONDATA结构的指针; dwMessage是被传递的消息,可以是以下消息之一: 

             NIM_ADD            增加图标

             NIM_DELETE          删除图标

             NIM_MODIFY          修改图标

三、托盘图标程序设计示例 

       首先我们用AppWizard创建一个基于对话框的应用程序CUserDlg。m_nid为类成员变量

voidCUserDlg::ToTray()

{

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;

//自定义的消息名称 WM_SHOWTASK 头函数中定义为WM_USER+1

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

strcpy(m_nid.szTip,"托盘图标");//当鼠标放在上面时,所显示的内容 

Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标 

}

四.添加消息WM_SHOWTASK的响应函数afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);

在BEGIN_MESSAGE_MAP(CUserDlg,CDialog)和END_MESSAGE_MAP()之间加代码:

ON_MESSAGE(WM_SHOWTASK,onShowTask)

编写该函数:

LRESULTCUserDlg::onShowTask(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_SHOWNORMAL);//简单的显示主窗口

   } 

   break; 

} 

return 0; 

}

然后在OnInitDialog函数中调用ToTray();

五为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入: 

::Shell_NotifyIcon(NIM_DELETE,&m_tnid);

六。至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变,就象金山词霸在主窗口打开与暂停取词时图标有所改变一样。它常 用来显示一些系统的状态。如:系统时间,音量控制以及其它的一些图标

总体的思想就是这样的

【VS开发】开发最小化到托盘的功能的更多相关文章

  1. 【VS开发】最小化到托盘 shell_notifyicon和NOTIFYICONDATA

    shell_notifyicon和NOTIFYICONDATA Shell_NotifyIcon函数,向任务栏的状态栏发送一个消息 函数原型 BOOL Shell_NotifIcon( DWORD d ...

  2. C++ 最小化到托盘

    #define WM_SHOWTASK (WM_USER + 1) void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID &a ...

  3. VC++ 最小化到托盘、恢复

    所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分.在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区. 一.托盘编程相关函数   ...

  4. WPF实现窗口最小化到托盘,并且实现右击菜单

    原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System. ...

  5. outlook新邮件到达提醒设置以及outlook最小化到托盘设置

    有些邮件是需要马上处理的,因此希望能在收到邮件之后马上就知道,但是有不希望频繁的去检查有没有.outlook可以帮我们轻松做到新邮件到达提醒. 一 .设置outlook新邮件到达提醒:选项->电 ...

  6. vc++ 最小化到托盘的详细实现

    在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现: 1.声明一个NOTIFYICONDATA类,也就是NOTIFYICOND ...

  7. MFC窗口实现最小化到托盘 右键菜单和还原

    //.h文件 void toTray();//最小化到托盘 void DeleteTray();//删除托盘图标 afx_msg LRESULT OnShowTask(WPARAM wParam,LP ...

  8. (WinForm)文件夹状态监控,最小化到托盘,开机自启动

    原文 (WinForm)文件夹状态监控,最小化到托盘,开机自启动 . 文件夾監控(監測文件夾中的文件動態): //MSDN上的例子 public class Watcher { public stat ...

  9. WinForm 之 窗口最小化到托盘及右键图标显示菜单

    Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...

随机推荐

  1. jdango 2.x的url配置的改变

    新版本的url.py文件中,不在使用1.x的正则表达式,强制使用在程序启动的时候会提示: WARNINGS: ?: (2_0.W001) Your URL pattern '^*article/' h ...

  2. noi.ac #37 dp计数

    #include<algorithm> #include<cstring> #include<cstdio> #include<iostream> ty ...

  3. cgp的辣鸡比赛题解

    目录 cgp的gcd 题目链接 思路 代码 cgp调戏妹子 题目链接 思路 代码 cgp的序列 题目链接 思路 代码 cgp的背包 题目链接 思路 代码 cgp的gcd 题目链接 传送门 思路 首先看 ...

  4. javascript 中的对象初始化

    参考 developer.mozilla.org 网站.这个是一个前端必须经常光顾的网站. 记录一下对象的创建方法,虽然很简单,但是确需要非常注意. Objects can be initialize ...

  5. 本地spark报:java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/FileDescriptor;

    我是在运行rdd.saveAsTextFile(fileName)的时候报的错,找了很多说法……最终是跑到hadoop/bin文件夹下删除了hadoop.dll后成功.之前某些说法甚至和这个解决方法自 ...

  6. JS中的constructor 和 prototype

    object.constructor :对象的constructor 属性引用了该对象的构造函数. //例如,用Array()构造函数创建了一个数组,那么a.constructor 引用的就是Arra ...

  7. 咏南跨平台中间件支持LINUX和WINDOWS插件架构

    咏南跨平台中间件支持LINUX和WINDOWS插件架构

  8. Makefile教程(绝对经典,所有问题看这一篇足够了)【转】

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  9. python oracle 写文件 多个SQL变量问题

  10. 手动安装sublimeText3插件

    就在今天下午,我花了一个小时的时间安装sublime3插件stylus,就是为了让stylus文件能够高亮显示.网上找了很多方法,可以通过package control安装,然而,我的sublime ...