用VC设计托盘图标程序

 我来答
爱创文化
2022-11-17 · TA获得超过9967个赞
知道大有可为答主
回答量:2247
采纳率:100%
帮助的人:131万
展开全部

  在Windows操作系统中 任务栏的右边(托盘)会常驻几个图标 如输入法切换图标 音量控制图标等 此外我们还经常遇到具有托盘图标的软件 如金山词霸 实时监测功能的杀毒软件等 这些软件在后台运行 通常不占用太多的屏幕资源 只在通知栏上放一个小小的标志 必要时我们可以通过用鼠标点击图标对其进行选单操作或激活其主窗口 有时我们自己编写的程序也希望有类似的效果 本文将详细地介绍用VC设计托盘图标程序的方法   一 NOTIFYICONDATA结构   NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息 它包括选择的图标 回调消息 提示消息和图标对应的窗口等内容 其定义为   typedef struct—NOTIFYICONDATA {   DWORD cbSize;   //以字节为单位的这个结构的大小   HWND hWnd;   //接收托盘图标通知消息的窗口句柄   UINT uID;   //应用程序定义的该图标的ID号   UINT uFlags;   //设置该图标的属性   UINT uCallbackMessage;   //应用程序定义的消息ID号 此消息传递给hWnd   HICON hIcon; //图标的句柄   char szTip[ ]; //鼠标停留在图标上显示的提示信息   } 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+   为了处理图标返回消息 如鼠标左键双击 鼠标右键单击消息 我们重载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( );   CPoint pos;   GetCursorPos(&&pos);   pMenu 〉TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON pos x pos y AfxGetMainWnd());   }   break;   case WM_SYSMAND:   //如果是系统消息   if(wParam= =SC_MINIMIZE){   //接收到最小化消息时主窗口隐藏   AfxGetApp() 〉m_pMainWnd 〉ShowWindow(SW_HIDE);   return ;   }   break;   }   return CFrameWnd::WindowProc(message wParam lParam);   }   为使应用程序退出时图标消失 映射WM_DESTROY消息 在OnDestroy()函数中加入   ::Shell_NotifyIcon(NIM_DELETE &&m_tnid);   至此 托盘图标程序的常规功能我们均已实现 我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变   本程序在VC++ Windows / Professional下调试通过 lishixinzhi/Article/program/net/201311/11634

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式