WEB开发网
开发学院软件开发VC 系统托盘编程完全指南 阅读

系统托盘编程完全指南

 2010-07-25 20:46:55 来源:WEB开发网   
核心提示:自从Windows 95面市以来,系统托盘应用作为一种极具吸引力的UI深受广大用户的喜爱,系统托盘编程完全指南,使用系统托盘UI的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等,CTrayIcon对上面的特性进

自从Windows 95面市以来,系统托盘应用作为一种极具吸引力的UI深受广大用户的喜爱。使用系统托盘UI的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。那么如何编写自己的托盘应用呢?本文是系列文章中的第一篇,这些文章将比较系统地描述托盘应用的编程。并创建自己的C++类来增强系统托盘应用的特性。读完这些文章,再参照例子,相信读者能轻松自如地在自己的程序中应用系统托盘。

大家知道,MFC框架没有提供任何现成的类应用于系统托盘UI,那么如何将表示应用程序的图标添加到任务栏中呢?方法很简单,只用到一个API函数,它就是Shell_NotifyIcon。这个函数本身也相当容易理解和使用。看看它的原型就知道了:

BOOL Shell_NotifyIcon(
  DWORD dwMessage,
  PNOTIFYICONDATA pnid
);

第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一:

NIM_ADD:    添加一个图标到任务栏。
   NIM_MODIFY:  修改状态栏区域的图标。
   NIM_DELETE:  删除状态栏区域的图标。
   NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正
           显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
   NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。

第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。这个结构在SHELLAPI.H文件中定义如下:

typedef struct _NOTIFYICONDATA {
 DWORD cbSize; // 结构大小(sizeof struct),必须设置
 HWND hWnd; // 发送通知消息的窗口句柄
 UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
 UINT uFlags;
 UINT uCallbackMessage; // 消息被发送到此窗口过程
 HICON hIcon; // 图标句柄
 CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
uFlags的值:
#define NIF_MESSAGE 0x1  // 表示uCallbackMessage 有效
#define NIF_ICON  0x2  // 表示hIcon 有效
#define NIF_TIP   0x4  // 表示szTip 有效

有关Shell_NotifyIcon函数的详细使用细节请参考MSDN。

NOTIFYICONDATA结构中的 hWnd 是"拥有" 图标的窗口句柄。uID可以是任何标示托盘图标的ID(如果有多个图标),一般使用资源ID。HIcon可以是任何图标的句柄,包括预定义的系统图标,如IDI_HAND、IDI_QUESTION、IDI_EXCLAMATION、或者Windows的徽标IDI_WINLOGO。

图标的显示并不难,关键是事件的处理。 当用户将鼠标移到图标上或者在图标上单击鼠标时,为了得到通知消息,你可以将自己的消息ID赋给uCallbackMessage,并设置NIF_MESSAGE标志。当用户在图标上移动或单击鼠标时,Windows将用hWnd指定的窗口句柄调用你建立的窗口过程;消息ID在uCallbackMessage中指定,uID的值即为wParam,lParam为鼠标事件,如WM_LBUTTONDOWN等。

尽管Shell_NotifyIcon函数简单实用。但它毕竟是个Win32 API,为此我将它封装在了一个C++类中,这个类叫做CTrayIcon,有了它,托盘编程会更加轻松自如,因为它隐藏了NOTIFYICONDATA、消息代码、标志以及所有那些你必须要看MSDN才能搞掂的繁琐细节。CTrayIcon的定义以及实现细节请下载源代码参考。CTrayIcon为程序员提供了一个更加友好的托盘编程接口,它除了对Shell_NotifyIcon函数进行打包之外,它还是一个迷你框架呢!之所以这么说,是因为按照Windows系统应用软件界面指南所提倡的原则(这个指南可以在MSDN中找到),这个类增强了托盘图标的用户界面行为。以下便是CTrayIcon最终实现的UI特性:

1、 托盘图标应该有信息提示,也就是ToolTips。

2、 单击右键应该弹出上下文菜单,这个菜单中应包含打开属性页的命令或者打开与图标相关的其它窗口的命令。

3、 单击左键应该显示进一步的信息或者控制图标所代表的对象,例如,当左键单击声音图标时进行音量控制。如果没有进一步的信息或控制,则不要有任何动作。

CTrayIcon对上面的特性进行了全面的封装。为了示范CTrayIcon的工作原理,本文提供一个例子程序TrayTest1,图一是运行程序后显示的一个对话框:

图一 TrayTest1运行后显示的对话框

1 2 3 4 5  下一页

Tags:系统 托盘 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接