vc6.0 托盘图标

在Windows操作系统中,任务栏的右边(托盘)会常驻几个图 标,如输入法切换图标、音量控制图标等,此外我们还经常遇到具有托盘图标的软件,如金山词霸、实时监测功能的杀毒软件等。这些软件在后台运行,通常不占用 太多的屏幕资源,只在通知栏上放一个小小的标志,必要时我们可以通过用鼠标点击图标对其进行选单操作或激活其主窗口。有时我们自己编写的程序也希望有类似 的效果,本文将详细地介绍用VC设计托盘图标程序的方法。

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

 typedef struct—NOTIFYICONDATA { 

  DWORD cbSize; 

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

  HWND hWnd; 

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

  UINT uID; 

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

  UINT uFlags; 

  //设置该图标的属性 

  UINT uCallbackMessage; 

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

  HICON hIcon; //图标的句柄 

  char szTip[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创建一个不基于文档和视图结构的应用程序Tray。我们并不想在应用程序启动时显示主窗口,所以需要删除应用程序类CTrayApp中成员函数InitInstance()的以下两句代码:

 pFrame-〉ActivateFrame(); 

  pFrame-〉ShowWindow(SW_SHOW); //

在CMainFrame类中加入NOTIFYICONDATA结构的保护成员变量m_tnid,并在其OnCreate函数中return语句前加入生成托盘图标的代码:

 
  m_tnid.cbSize=sizeof(NOTIFYICONDATA); 

  m_tnid.hWnd=this-〉m_hWnd; 

  m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 

  m_tnid.uCallbackMessage=MYWM_NOTIFYICON; 

  //用户定义的回调消息 

  CString szToolTip; 

  szToolTip=_T("托盘图标实例"); 

  _tcscpy(m_tnid.szTip, szToolTip); 

  m_tnid.uID=IDR_MAINFRAME; 

  HICON hIcon; 

  hIcon=AfxGetApp()-〉LoadIcon(IDR_MAINFRAME); 

  m_tnid.hIcon=hIcon; 

  ::Shell_NotifyIcon(NIM_ADD,&&m_tnid); 

  if(hIcon)::DestroyIcon(hIcon); 

  返回消息的ID应在主框架类的头函数中定义:

  #define MYWM_NOTIFYICON WM_USER+1

  为了处理图标返回消息,如鼠标左键双击、鼠标右键单击消息,我们重载WindowProc()函数。此外,我们还希望在主框架窗口最小化时图标不在任务栏的空白区出现,在此函数中同时作相应处理。

   LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 

  { 

  switch(message){ 

  case MYWM_NOTIFYICON: 

  //如果是用户定义的消息 

  if(lParam==WM_LBUTTONDBLCLK){ 

  //鼠标双击时主窗口出现 

  AfxGetApp()-〉m_pMainWnd-〉ShowWindow(SW_SHOW); 

  } 

  else if(lParam==WM_RBUTTONDOWN){ //鼠标右键单击弹出选单 

  CMenu menu; 

  menu.LoadMenu(IDR_RIGHT_MENU); //载入事先定义的选单 

  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; 

  } 

  break; 

  } 

  return CFrameWnd::WindowProc(message, wParam, lParam); 

  } 

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

  ::Shell_NotifyIcon(NIM_DELETE,&&m_tnid); 

 至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变。
    设置托盘图标的闪烁就是在一个定时器里面,用一副空白的ICON图标,和原先的托盘图标相互替换

 void CMainFrame::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    if(nIDEvent == 1)
    {
        //任务栏窗口的闪烁
        if(!m_bIsShow)
        {
            FlashWindow(TRUE);
        }
        else
        {
            FlashWindow(FALSE);
        }

        //托盘图标的闪烁
        HICON hIcon;
        if (m_ntimes == 0)
        {
            m_ntimes = 1;
            hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        }
        else if(m_ntimes==1)
        {
            m_ntimes = 0;
            hIcon=AfxGetApp()->LoadIcon(IDI_ICON_NONE);
        }
        m_TrayIcon.hIcon=hIcon;
        ::Shell_NotifyIcon(NIM_MODIFY,&m_TrayIcon);
        if(hIcon)
        {
            ::DestroyIcon(hIcon);
        }

    }

    CFrameWnd::OnTimer(nIDEvent);
}

本程序在VC++ 6.0下调试通过。

时间: 2024-10-25 16:41:29

vc6.0 托盘图标的相关文章

(转)VC6.0中OpenGL开发环境配置

首先简单介绍一下OpenGL: OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性.       OpenGL官方网站(英文)    http://www.opengl.org 然后设置编程的一些环境,及其安装必备文件的步骤如下: 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的.但这里我们选择VC++ 6.0作为学习OpenGL的环

VC6.0在Win10下的兼容性问题设置(可以试试)

Microsoft Visual C++ 6.0,简称VC6.0,是微软推出的一款C++编译器,将"高级语言"翻译为"机器语言(低级语言)"的程 序.Visual C++是一个功能强大的可视化软件开发工具.自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问 世,Visual C++已成为专业程序员进行软件开发的首选工具. VC++6.0主要是在Windows XP下运行,在win7,win8和win10下运行均会存在一些兼容性的

【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,

Visual C++ 6.0/VC6.0经典插件之源码窗口管理(Visual Booster )插件 安装图解

Visual Booster 是Visual C++ 6.0开发环境的辅助工具,使用该工具打开.cpp..h或者其他资源文件时会在左边及下边显示打开的窗口(并以后缀归类),查看源码的时候相当有用. 1.下载 Visual Booster  Visual Booster 下载地址:http://pan.baidu.com/s/1o6BTbV8 密码:vikq 2.安装 Visual Booster  下载之后解压文件,运行文件夹内的 "Visual Booster.exe" 进行安装.如

windows下vc6.0下的OpeSSL编译过程中的问题

我的机器环境是:window7 + vs2010 + vc6.0; 其实,在windows上用VS2010以上的工具来编译Openssl源码库很简单,估计大家都测试过,用VS2008及其以上的工具编译Openssl源码库就3行代码即可: perl Configure -WIN32 --prefix=d:/openssl ms\do_ms nmake -f ms\nt.mak vc6.0版本的openssl编译步骤如下: 1.打开命令提示符,找到vc6.0所在的bin目录,输入VCVARS32.B

关于VS2010帮助文档的使用和VC6.0在Win7 64位下的使用

由于购置了新的电脑,安装的是Win7 64位的操作系统,这两天我在重新安装编程环境的时候遇到一些问题,现在都解决掉了,分享出来以供需要的人参考. 一.以前使用的是VS2008,从VC6到2008这么多年了一只使用的MSDN是带索引的本地帮助,到了现在使用VS2010了,发现VS2010采用的是Web版形式的帮助. 并且也没有了索引.书签等非常的不习惯. 后来找到一个名字为:"h3viewer"的工具,在前提:已经安装了VS2010帮助文档的情况下.安装h3viewer,运行后界面如下:

vc6.0 PK vs2010

从VC++6.0不足看VisualC++2010新特性 说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯定会想到Visual C++6.0.为什么是6.0而不是其它的版本?这里的原因就不用我再多讲了,因为太经典了!这个经典已经有了10年的光荣历史,微软的Visual Studio系列也已经发展到了Visual Studio 2010.漫长的辉煌中Visual C++6.0也暴露出了一些问题,在这篇文章

VC6.0学习C语言入门SDK

百度网盘链接 VC6.0    密码:t6bd VS2010 密码:3of2 C语言入门教程 在线视频地址(PS此链接摘抄至博主lellansin) Acfun.tv:http://www.acfun.tv/search.aspx#query=C语言入门教程 Bilibili.tv:http://www.bilibili.tv/search?keyword=C语言入门教程 最后和大家分享一个实现行列式算法的C代码 /*=======================================

VC6.0在Win8,10下的兼容性调整

|   版权声明:本文为博主原创文章,未经博主允许不得转载. Microsoft Visual C++ 6.0,简称VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程 序.Visual C++是一个功能强大的可视化软件开发工具.自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问 世,Visual C++已成为专业程序员进行软件开发的首选工具. VC++6.0主要是在Windows XP下运行,在win7,win8和wi