对于一些不是很需要与用户交互的应用程序来说,在应用程序最小化的时候将它变成托盘图标。对用户来说是一种不错的用户体验。那这个功能应该怎么样实现呢?其实实现功能十分的简单,我们只需要调用Shell_NotifyIcon函数就可以为应用程序添加托盘图标。然后我们只需要在提供一个回调函数处理相应的消息就可以了。
让我们来看一看Shell_NotifyIcon函数,该函数的完整声明如下:
参数dwMessage定义了该函数将要执行的功能。如我们传递NIM_ADD调用该函数,则函数执行后就可以为应用程序添加托盘图标。而我们传递NIM_DELETE调用该函数,则函数执行后就将删除应用程序的托盘图标。该参数还能接受的值还包括NIM_MODIFY、NIM_SETFOCUS、NIM_SETVERSION等,感兴趣的朋友可以参考MSDN来了解传递该值后函数将会执行的动作。
参数PNOTIFYICONDATA是一个指向NOTIFYICONDATA结构体的指针,我们可以通过填充该结构体来定制托盘图标中显示的图标和当鼠标停留在图标上显示的文字等。
下面让我们再来看看NOTIFYICONDATA结构体的主要成员如下:
成员cbSize表示该结构体的大小,我们只需要为该成员填入sizeof(NOTIFYICONDATA)就可以了。
成员hWnd表示要生成托盘的窗口句柄。
成员uID表示托盘图标的资源ID。
成员uFlags是一个掩码值,通过位域来判断结构体中哪些成员在Shell_NotifyIcon函数的调用中有效。我们一般为该成员覆的值为NIF_ICON | NIF_MESSAGE | NIF_TIP。该组合表示图标句柄、回调消息以及提示信息的相应成员变量有效。如果您还对其它的成员变量有兴趣,请参看MSDN。
成员uCallbackMessage表示一个用户自定义消息。
成员hIcon表示托盘图标的句柄。
成员szTip表示将鼠标放到托盘图标上时显示出来的提示文字。
下面在让我们来看一下添加、删除以及处理NotifyIcon消息的具体代码。
首先让我们来看一下添加托盘图标的代码。
然后再让我们来看一下删除托盘图标的代码。
下面再让我们来看一下在MFC下处理托盘图标消息的代码,比起上面的代码,要稍微麻烦了一点。不过也不是很难。
首先是在要添加托盘图标的窗口类中添加MFC的标准消息处理函数声明。
然后是在窗口类的实现文件中添加用户自定义消息和相应的消息映射。
然后就是实现OnNotifyIcon函数,在OnNotifyIcon函数中,wParam表示图标的资源ID,lParam表示消息ID,如lParam值可以是WM_LBUTTONDOWN、WM_RBUTTONDOWN等消息。
为了重用代码,也为了更方便的增加新的功能,我们完全可以将NotifyIcon做成一个类。而且在.Net下面,NotifyIcon本身就是一个封装好了的控件。我们的目标就是做一个与.Net下面NotifyIcon类似的类。隐藏添加、删除以及NotifyIcon消息处理的细节,而为用户提供跟.Net相似的事件订阅来处理NotifyIcon消息。隐藏NotifyIcon消息处理函数采用了宏定义的方法。具体代码如下:
如果有哪位朋友想要该类的测试代码的话,请在博客留言中留下自己的邮箱,我会将代码给您发送过来。