MFC程序添加通知区域图标
VC++任务栏提示区图标的实现

VC++任务栏提示区图标的实现目前,许多应用软件都实现了WINDOW任务栏提示区图标,如金山词霸、超级解霸等,这不仅增强了软件的特色,更方便了用户的使用。
本文将介绍一个封装好的类,用VC++来实现这项功能,希望对读者有所帮助。
一、一个简单的直接引用的方法:我们可以使用直接引用WIN32 API函数的方法实现任务栏提示区图标。
1、定义一个NOTIFYICONDATA数据结构,初始化各数据项。
其结构详见在线帮助。
2、使用WIN32 API函数Shell_NotifyIcon实现任务栏提示区图标。
函数原形如下:WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,//消息类型PNOTIFYICONDATA pnid //指向NOTIFYICONDATA结构的指针);消息类型包括:NIM_ADD 增加图标到任务栏;NIM_DELETE 从任务栏删除图标;NIM_MODIFY 修改任务栏图标;二、一个更好的面对对象的方法:为了使使用更加方便、合理,更符合面对对象的处理方法,我们应当封装一个类(CSystemIcon),由此类实现任务栏提示区图标。
1、由CObject类派生出CsystemIcon类。
2、构造下列函数:LRESULT OnIconNotification(WPARAM wID,LPARAM lEvent) //自定义消息处理函数void DeleteIcon() //删除图标void HideIcon() //隐藏图标void ShowIcon() //显示图标BOOL SetTooltipText(LPCTSTR pszTip) //设置提示文本BOOL SetTooltipText(UINT nID)CString GetTooltipText() const //得到提示文本BOOL SetNotificationWnd(CWnd* pWnd) //设置通知窗口CWnd* GetNotificationWnd() const //得到通知窗口HICON GetIcon() const //得到图标BOOL SetIcon(HICON hIcon) //设置图标BOOL SetIcon(LPCTSTR lpszIconName)BOOL SetIcon(UINT nIDResource)BOOL SetStandardIcon(LPCTSTR lpIconName) //设置系统标准图标BOOL SetStandardIcon(UINT nIDResource)3、生成的CsystemIcon类详见下列源文件:a、CsystemIcon类.H头文件://///////////////////////////////////////////////////////////////////////////// SystemIcon.h : header file//#ifndef _INCLUDED_SYSTEMICON_H_#define _INCLUDED_SYSTEMICON_H_/////////////////////////////////////////////////////////////////////////////// CSystemIcon windowclass CSystemIcon : public CObject// Construction/destructionpublic:CSystemIcon();CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); virtual ~CSystemIcon();// Operationspublic:BOOL Enabled() { return m_bEnabled; }BOOL Visible() { return !m_bHidden; }//创建系统图标Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID);//关于提示文本BOOL SetTooltipText(LPCTSTR pszTooltipText);BOOL SetTooltipText(UINT nID);CString GetTooltipText() const;//关于图标BOOL SetIcon(HICON hIcon);BOOL SetIcon(LPCTSTR lpIconName);BOOL SetIcon(UINT nIDResource);BOOL SetStandardIcon(LPCTSTR lpIconName);BOOL SetStandardIcon(UINT nIDResource);HICON GetIcon() const;void HideIcon();void ShowIcon();void DeleteIcon();//关于通知窗口BOOL SetNotificationWnd(CWnd* pNotifyWnd);CWnd* GetNotificationWnd() const;//自定义消息处理函数virtual LRESULT OnIconNotification(WPARAM uID, LPARAM lEvent);// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSystemIcon)//}}AFX_VIRTUAL// Implementationprotected:BOOL m_bEnabled; //是否支持图标BOOL m_bHidden; //是否隐藏图标NOTIFYICONDATA m_tnd; //数据结构,请参考在线帮助DECLARE_DYNAMIC(CSystemIcon)};#endif/////////////////////////////////////////////////////////////////////////////b、CsystemIcon类.CPP源文件:// SystemIcon.cpp : implementation file#include "stdafx.h"#include "SystemIcon.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_DYNAMIC(CSystemIcon, CObject)/////////////////////////////////////////////////////////////////////////////CSystemIcon::CSystemIcon()memset(&m_tnd, 0, sizeof(m_tnd));m_bEnabled = FALSE;m_bHidden = FALSE;CSystemIcon::CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, HICON icon, UINT uID)Create(pWnd, uCallbackMessage, szToolTip, icon, uID);m_bHidden = FALSE;BOOL CSystemIcon::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, HICON icon, UINT uID)//文件只能使用在WINDOW 95以上的版本中VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4);if (!m_bEnabled) return FALSE;//确认通知窗口有效VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd())));if (!m_bEnabled) return FALSE;//确认自定义消息大于WM_USERASSERT(uCallbackMessage >= WM_USER);//确定提示文本长度小于64ASSERT(_tcslen(szToolTip) <= 64);//定义NOTIFYICONDATA结构的数据项m_tnd.cbSize = sizeof(NOTIFYICONDATA);m_tnd.hWnd = pWnd->GetSafeHwnd();m_tnd.uID = uID;m_tnd.hIcon = icon;m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;m_tnd.uCallbackMessage = uCallbackMessage;strcpy (m_tnd.szTip, szToolTip);//设置图标VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd));return m_bEnabled;CSystemIcon::~CSystemIcon()DeleteIcon();void CSystemIcon::DeleteIcon()if (!m_bEnabled) return;m_tnd.uFlags = 0;Shell_NotifyIcon(NIM_DELETE, &m_tnd);m_bEnabled = FALSE;void CSystemIcon::HideIcon()if (m_bEnabled && !m_bHidden) {m_tnd.uFlags = NIF_ICON;Shell_NotifyIcon (NIM_DELETE, &m_tnd);m_bHidden = TRUE;void CSystemIcon::ShowIcon()if (m_bEnabled && m_bHidden) {m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;Shell_NotifyIcon(NIM_ADD, &m_tnd);m_bHidden = FALSE;BOOL CSystemIcon::SetIcon(HICON hIcon)if (!m_bEnabled) return FALSE;m_tnd.uFlags = NIF_ICON;m_tnd.hIcon = hIcon;return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);BOOL CSystemIcon::SetIcon(LPCTSTR lpszIconName)HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName);return SetIcon(hIcon);BOOL CSystemIcon::SetIcon(UINT nIDResource)HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);return SetIcon(hIcon);BOOL CSystemIcon::SetStandardIcon(LPCTSTR lpIconName)HICON hIcon = LoadIcon(NULL, lpIconName);return SetIcon(hIcon);BOOL CSystemIcon::SetStandardIcon(UINT nIDResource)HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource)); return SetIcon(hIcon);HICON CSystemIcon::GetIcon() constHICON hIcon = NULL;if (m_bEnabled)hIcon = m_tnd.hIcon;return hIcon;BOOL CSystemIcon::SetTooltipText(LPCTSTR pszTip)if (!m_bEnabled) return FALSE;m_tnd.uFlags = NIF_TIP;_tcscpy(m_tnd.szTip, pszTip);return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);BOOL CSystemIcon::SetTooltipText(UINT nID)CString strText;VERIFY(strText.LoadString(nID));return SetTooltipText(strText);CString CSystemIcon::GetTooltipText() constCString strText;if (m_bEnabled)strText = m_tnd.szTip;return strText;BOOL CSystemIcon::SetNotificationWnd(CWnd* pWnd)if (!m_bEnabled) return FALSE;ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd()));m_tnd.hWnd = pWnd->GetSafeHwnd();m_tnd.uFlags = 0;return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);CWnd* CSystemIcon::GetNotificationWnd() constreturn CWnd::FromHandle(m_tnd.hWnd);LRESULT CSystemIcon::OnIconNotification(UINT wParam, LONG lParam)if (wParam != m_tnd.uID)return 0L;CMenu menu, *pSubMenu;//单击右键弹出菜单if (LOWORD(lParam) == WM_RBUTTONUP)if (!menu.LoadMenu(m_tnd.uID)) return 0;if (!(pSubMenu = menu.GetSubMenu(0))) return 0;//设定第一项为缺省::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);//定义弹出菜单CPoint pos;GetCursorPos(&pos);::SetForegroundWindow(m_tnd.hWnd);::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL); ::PostMessage(m_tnd.hWnd, WM_NULL, 0, 0);menu.DestroyMenu();else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)if (!menu.LoadMenu(m_tnd.uID)) return 0;if (!(pSubMenu = menu.GetSubMenu(0))) return 0;//双击左键起动缺省菜单::SetForegroundWindow(m_tnd.hWnd);::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0); menu.DestroyMenu();return 1;三、一个简单的例子1、使用MFC AppWizard(EXE)创建项目文件。
MFC如何给工具条上的按钮添加提示功能

MFC-给工具条上的按钮添加提示功能网上没有找到这样的例程,因此在此将自己的经验分享一下,有不对的地方还请指正。
MFC添加工具条的步骤为:1、构造CToolBar类型的对象 CToolBar tool ;2、调用CreateEx()函数 tool.CreateEx(…) ; (CreateEx参数较多,这里可以直接复制CMainFrame的OnCreate函数中创建工具栏的代码)3、在资源编辑器中新建一个工具栏资源,假定ID为IDT_MYTOOL4、调用CToolBar的函数LoadToolBar(IDT_MYTOOL) ;5、(可选)如果想让工具条可以停靠,那么可以调用tool.EnableDocking(TRUE) ;此后还必须调用父窗口的EnableDocking(TRUE);意思是父窗口可以被停靠。
6、(可选)如果希望工具条可以隐藏和显示,需要调用ShowControlBar(CControlBar*pcontrol) ;至此,工具栏就添加完成了。
接下来我们希望让工具栏中的按钮可以在我们鼠标经过时显示提示信息,如图:实现这个功能需要做以下工作:1、调用tool.EnableToolTips(TRUE);或者在CreateEx()函数中设置CBRS_TOOLTIPS标识。
2、在框架窗口类CMainFrame中的消息映射模块添加如下红色代码:BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_NOTIFY_EX(TTN_NEEDTEXT, 0,OnToolTipsNotify)//声明工具栏提示通知消息END_MESSAGE_MAP()3、定义如下函数:BOOL CMainFrame::OnToolTipsNotify(UINT id, NMHDR* pNMHDR,LRESULT* pResult){TOOLTIPTEXT* pT =(TOOLTIPTEXT*)pNMHDR ; //将pNMHDR转换成TOOLTIPTEXT 指针类型数据UINT nID =pNMHDR->idFrom ; //获取工具栏按钮的IDif(nID == IDC_XXX) //如果nID是希望获取的ID,那么就设置相应提示信息到TOOLTIPTEXT结构体的lpszText中。
mfc使用手册

mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。
以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。
通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。
2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。
安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。
3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。
选择“File”菜单中的“New”选项,然后选择“Project”。
在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。
4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。
以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。
CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。
CDocument:文档类,用于管理应用程序中的文档数据。
CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。
5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。
每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。
通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。
6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。
您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。
mfc菜单使用总结

06 MFC菜单的发展趋势与展 望
发展趋势
智能化
随着人工智能技术的不断发展, MFC菜单将更加智能化,能够根 据用户的使用习惯和需求进行自 我学习和调整,提供更加个性化
的服务。
多样化
MFC菜单将更加多样化,不仅包 括传统的菜单选项,还将出现更 多创新的交互方式和功能,以满
足不同用户的需求。
集成化
03 MFC菜单的定制与扩展
定制菜单样式
更改背景色
通过设置菜单的背景色,可以改变菜单的整体外观,使其与应用 程序的主题或品牌形象相匹配。
添加边框和分隔线
在菜单项之间添加边框或分隔线,可以增强菜单的可读性和视觉效 果。
调整字体和文字样式
通过调整字体、字号、加粗、斜体等样式,使菜单文本更易于阅读 和识别。
04 MFC菜单的优缺点
优点
易用性
MFC(Microsoft Foundation Class)菜单是Windows应用程序 的标准组件之一,它提供了丰富的 API和功能,使得开发者可以轻松
地创建和管理菜单。
灵活性
MFC菜单具有高度的自定义性, 开发者可以根据需要自定义菜单 的外观、行为和功能,实现各种
用程序的开发过程。
它提供了一套丰富的类和函数, 涵盖了Windows编程的各个方 面,包括窗口管理、图形界面、
网络通信等。
MFC是C编程语言在Windows 平台上的重要工具,广泛应用于 Windows桌面应用程序的开发。
MFC菜单的种类和功能
菜单栏
应用程序的主菜单,包含应用程序的主要功 能和操作。
弹出菜单
通过鼠标右键点击某个对象弹出的菜单,包含 与该对象相关的操作。
上下文菜单
根据当前操作或选定的对象动态生成的菜单,提 供与当前操作相关的选项。
在MFC加入的帮助提示

VC技巧三 - 界面在MFC加入的帮助提示MFC在CPropertySheet中封装了属性,但不支持标题的"这是什么?"帮助提示.函数CPropertySheet::OnNcCreate()屏蔽了扩展风格WS_EX_CONTEXTHELP, 因此,即使你在构造函数中加入了扩展风格,它也不能出现在窗口中.解决方法很简单,在继承类中设置好风格位,如下所示:BOOL CWhatsThisPropertySheet::OnNcCreate(LPCREATESTRUCT lpCreateStruct)(if(!CPropertySheet::OnNcCreate(lpCreateStruct))return FALSE;//显式地定义此风格//CPropertySheet默认是关ModifyStyleEx(0, WS_EX_CONTEXTHELP);return true;)精通工具条VC++的工具条有很多特性,但有时候也会让你感到困惑. 这里有一些使它们服服贴贴的小技巧.要移走一个工具条项,只须将它拖到空工具条的右边,然后点击右上角的关闭按钮.注意显示在浮动工具条菜单条上的工具条的名称,可以通过右击菜单条来关闭一个工具条,使之挂起.反过来,激活一个挂起的工具条,右击你菜单条或另一个工具条,然后选中你想看到的工具条的名字.如果你想同时开关好几个工具条,不用一个一个地去右击,使用菜单上的工具, 用户化菜单命令,会出现工具条制表顺序对话框,然后进行选择. 这个对话框也允许挂起干扰你的工具条,或者增大看不见工具条按钮的图标.你可以在调试时使用和编辑代码时不同的工具条布局,而二者不互相干扰.当你发现浮动工具条停在不期望的位置时,按住Ctrl键,然后用鼠标将它移到旁边去, 当你停下来的时候,它不再回去,即使你把它放在另一个工具条的上面.如何改变视窗的背景颜色Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以防止Windows擦除窗口。
MFC实例

实例8 简易记事本
知识点: 1)菜单的使用 2)CStdioFile类的使用 3)CFont类的使用 4)CFileDialog的使用 5)CFontDialog的使用
1)菜单的使用
通过Resource View,右键点选Insert,选择 menu,即可新建菜单。
2)CStdioFile类的使用
MFC实例教程
实例1 最简单的对话框程序
新建MFC工程
选择基本对话框
设置对话框参数
选择对话框风格
设置类名
实例2 鼠标测试程序
修改提示信息
添加鼠标左键、右键按下代码
实例3 点鼠标游戏
实例4 为程序添加图标
步骤
1.新建一个MFC AppWizard(exe)工程,工程 名为IconTest
7.将按钮控件的Style中的Icon选项选中
8.找到CIconTestDlg类的OnInitDialog()函数,在其 中添加下图中的语句:
9.执行程序,图标就被显示在界 面上了。
实例5 三国游戏之选择武将
1.建立一个基于MFC对话框的项目 “ComposedDialog”。
2.切换到Resource View视图,在左边的资源 树上点右键,选择“insert”,弹出“Insert Resource”对话框,选择“Bitmap”,点 “import”,导入事先准备好的位图文件。
lf);
在Windows内部,字体是以一个名为LOGFONT的结构来表示的。 结构LOGFONT的定义如下: typedef struct tagLOGFONT { // lf LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;
用MFC设计Windows应用程序-完成-带图片

第1章Windows应用程序基础知识Windows是一种应用于微型计算机的操作系统,它为应用程序提供了一个多任务环境,这个环境具有一致的图形化窗口和菜单。
在Windows操作系统上运行的应用程序叫做Windows应用程序。
1.1 Windows应用程序的基本概念1.1.1 Windows应用程序的界面Windows应用程序的一个突出特点是它有一个美观的图形用户界面(GUI)。
这个图形界面是Windows应用程序与用户交换信息的一个“窗口”。
简单的Windows应用程序只有一窗口,而复杂的Windows应用程序可能需要多个窗口。
因此,设计一个或一组满足要求的窗口,是Windows应用程序设计中的一项重要任务。
1.1.2 Windows应用程序与API函数为了设计Windows应用程序,Windows提供了大量预定义的用C语言编写的函数,这些函数叫做API(Application Programming Interface)函数。
API函数几乎包含了Windows 程序中所有操作功能。
以前用来设计Windows应用程序的开发工具是SDK(Software Development Kit,软件开发工具包),使用SDK来设计Windows应用程序,实际上就是在使用API函数来开发应用程序。
自从出现了面向对象程序设计方法以来,人们用类对Windows API函数进行了封装,从而使用应用程序开发工具发生了巨大的变化。
目前,用来设计Windows应用程序的开发工具大多是“面向对象”的而且是“可视的”,如Visual C++、Visaul Basic、Java等。
1.1.3 Windows的一个特殊数据类型——句柄在Windows应用程序中,存在着很多诸如窗口、按钮、滚动条等复杂的对象和实例,为了在程序中区分和使用它们,必须对它们进行标识。
为了区别于普通变量的标识,Windows 把这种复杂对象的标识叫做“句柄”。
电脑怎么添加通知区域

电脑怎么添加通知区域通知区域是电脑操作系统中的一个重要功能,它可以让用户方便地收到各种系统通知和应用程序的消息。
无论是Windows、MacOS还是Linux系统,都提供了添加通知区域的功能。
对于Windows系统用户来说,添加通知区域非常简单。
首先,点击电脑屏幕右下角的系统托盘区域,找到一个小的向上箭头图标。
点击该图标,会弹出一个包含多个图标的菜单。
在菜单底部有一个“自定义”选项,点击进入自定义通知区域的设置界面。
在这里,用户可以选择哪些图标显示在通知区域,以及它们的行为。
点击“选择图标”,可以看到所有可用的图标,并可以通过拖动和放置来调整它们的顺序。
用户还可以选择是否显示通知、隐藏通知或者只显示通知图标,以满足个人需求。
对于MacOS系统用户来说,添加通知区域也很简单。
首先,点击电脑屏幕右上角的通知中心图标,或者使用快捷键“Command + 空格”打开Spotlight搜索,输入“通知中心”打开。
在通知中心界面,点击底部的“编辑”按钮,进入通知中心的设置界面。
在这里,用户可以选择通知中心的布局、排序和显示方式。
点击“通知”选项卡,用户可以选择哪些应用程序的通知将显示在通知中心中。
除了应用程序通知外,用户还可以添加小组件,例如日历、天气等,以便更方便地获取信息。
对于Linux系统用户来说,添加通知区域的方法可能会因不同的Linux发行版而有所不同。
一般来说,用户可以通过右击任务栏或面板,选择“添加小工具”或“添加通知区域”来添加通知区域。
在一些发行版中,用户还可以通过系统设置或面板设置来自定义通知区域的外观和行为。
在添加通知区域之后,用户可以根据自己的需要进行个性化设置。
例如,可以调整通知区域的位置、大小和透明度。
还可以设置通知的显示时长和方式,以及是否显示通知的横幅、声音或振动。
通过合理设置通知区域,用户可以更高效地管理各种通知和消息,提升工作和生活的效率。
总之,无论是Windows、MacOS还是Linux系统,都提供了方便的方法来添加和自定义通知区域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[转载]VC学习:MFC程序添加通知区域图标
/s/blog_3f04f1de0100k90x.html
给MFC程序添加通知区域图标
现在起来越多的程序都有一个通知区域图标(托盘图标),既美观又方便。
但是MFC不像C#一样提供NotifyIcon控件,要实现通知区域图标,就要自己做
一个CTrayIcon类或者使用NOTIFYICONDATA结构。
MSDN中关于NOTIFYICONDATA的介绍:
/en-us/library/ms910625.aspx
我在这里记录一下自己通过NOTIFYICONDATA实现MFC程序中的通知区域
图标的过程,既是分享,也方便以后自己查阅。
1. 在CMainFrame类(或者是CXxxDlg类)中添加一个NOTIFYICONDATA
的结构体变量:
NOTIFYICONDATA m_ntIcon;
并在CMainFrame的OnCreate函数中(或者是OnInitDialog)设置该
变量: m_ntIcon.cbSize = sizeof(NOTIFYICONDATA); //该结构体变量的大小
m_ntIcon.hIcon = AfxGetApp()->LoadIconA(IDR_MAINFRAME); //
图标,通过资源ID得到
m_ntIcon.hWnd = this->m_hWnd; //接收托盘图标通知消息的窗口句柄 char atip[128] = "a notify
icon"; //鼠标设上
面时显示的提示
strcpy_s(m_ntIcon.szTip, 128, atip);
m_ntIcon.uCallbackMessage = MY_WM_NOTIFYICON;
//应用程序定义的消息ID号
m_ntIcon.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
//图标的属性:设置成员uCallbackMessage、hIcon、szTip有效
::Shell_NotifyIconA(NIM_ADD, &m_ntIcon); //在系统通知区域增加这个图标
2. 为这个图标添加消息处理
(1)定义回调消息的ID
#define MY_WM_NOTIFYICON (WM_USER+1001)
(2)添加消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//OnNotifyIcon 就是消息处理函数的名称
ON_MESSAGE(MY_WM_NOTIFYICON, &CMainFrame::OnNotifyIcon) END_MESSAGE_MAP()
(3)在CMainFrame类(或者是CXxxDlg类)中添加该图标的消息处理
函数
.h文件中:
public:
afx_msg LRESULT OnNotifyIcon(WPARAM, LPARAM);
.cpp文件中:
LRESULT CMainFrame::OnNotifyIcon(WPARAM wparam,
LPARAM lparam)
{
if(lparam == WM_LBUTTONDOWN)
{
//这里添加对鼠标左键点击的处理,具体处理见(4)
}
else if(lparam == WM_RBUTTONDOWN)
{
//这里添加对鼠标右键点击的处理,具体处理见(5)
}
return 0;
}
(4)对鼠标左键点击的处理:
我一般的处理是如果窗口是正常显示的,点一下将窗口最小化到系统
托盘;如果窗口是最小化的,点一下则将其恢复到正常显示。
这里我通过一个bool成员变量m_bMin来判断当前窗口的状态
//恢复窗口或者最小化
if(m_bMin == true)
{
AfxGetMainWnd()->ShowWindow(SW_SHOW);
AfxGetMainWnd()->ShowWindow(SW_RESTORE);
//这里貌似只有写这样两句才能保证恢复窗口后,该窗口处于活
动状态(在最前面)
m_bMin = false;
}
else
{
AfxGetMainWnd()->ShowWindow(SW_MINIMIZE);
m_bMin = true;
}
其中m_bMin的值,可以在OnSize(UINT nType, int cx, int cy)中进行设定,如果nType为SIZE_MINIMIZED时,将其设为true;其它则设为fasle。
具体代码就不在这里写了。
(5)对鼠标右键点击的处理:
我一般是鼠标右键点击,则弹出一个右键菜单:
//弹出左键菜单
CMenu popMenu;
popMenu.LoadMenuA(IDR_MENU_POPUP); //IDR_MENU_POPUP是在ResourceView中创建并编辑的一个菜单 CMenu* pmenu =
popMenu.GetSubMenu(0); //弹出的菜单实际上是IDR_MENU_POPUP菜单的某项的子菜单,这里是第一项 CPoint pos;
GetCursorPos(&pos); //弹出菜单的位置,这里就是鼠标的当前位置//显示该菜单,第一个参数的两个值分别表示在鼠标的右边显示、响应鼠标右击
pmenu->TrackPopupMenu(TPM_RIGHTALIGN|TPM_RIGHTBUTTON, pos.x, pos.y, AfxGetMainWnd(), 0);
对于这个菜单的项及其处理,写在后面。
3. 程序退出时,删除该图标
这一步一定不能没有,不然的话,程序退出后,通知区域还有这个图标,只有鼠标放上去后才会消失。
在OnDestroy()函数里面:
//删除该图标
::Shell_NotifyIcon(NIM_DELETE, &m_ntIcon);
4. 关于弹出的右键菜单
我做的简单的右键菜单包含”显示窗口“,”关于...“和”退出“,可以在ResuourceView中,对该菜单添加消息处理函数。
(1)显示窗口
点这个菜单,这显示程序的主窗口,消息处理函数如下:
void CMainFrame::OnPopupShow()
{
// TODO: Add your command handler code here
AfxGetMainWnd()->ShowWindow(SW_SHOWNORMAL );
}
(2)关于...
弹出一个”关于“对话框:
void CMainFrame::OnPopupAbout()
{
// TODO: Add your command handler code here
CAboutDlg abdlg;
abdlg.DoModal();
}
(3)退出
发送一个WM_CLOSE消息,关闭窗口
void CMainFrame::OnPopupQuit()
{
// TODO: Add your command handler code here
SendMessage(WM_CLOSE);
}
这里要注意的是:如果主窗口的关闭按钮点击后,不是退出程序,而是最小化到系统托盘(现在越来越多的程序是这样了,可以在OnClose()函数中实现),就不能通过
SendMessage(WM_CLOSE);
来关闭窗口了。
我用的方法是
this->DestroyWindow();
但不确定这个方法是否合适。