托盘(tray)编程及弹出菜单
托盘即像qq一样在右下角显示。
托盘显示分三步:先添加到托盘,再响应鼠标或键盘消息,最后退出时退出托盘。Shell_NotifyIcon可在任务栏(taskbar)增加、修改或删除一个图标。可以在启动时显示托盘图标,退出时删除托盘图标。此函数需要一个结构体NOTIFYICONDATA。
typedef struct _NOTIFYICONDATA {
DWORD cbSize;结构体大小
HWND hWnd; 接受taskbar与图标关联的通告消息
UINT uID; taskbar icon即任务栏显示的图标
UINT uFlags; 一系列标识的组合,用来确定下面三个参数哪个可用
UINT uCallbackMessage; //自定义的消息。当一个鼠标事件发生在任务栏的图标上时,这个消息被发送给hWnd标识的窗口。在此消息的响应函数中来实现弹出菜单。消息响应函数的wParam标示消息事件发生的任务栏图标;lParam根据事件不同,包含了鼠标或键盘的具体消息。有些文章说uID只要唯一就好,经验证:uID和hIcon以及接受消息的wParam必须为同一图标。
HICON hIcon; 要在任务栏增加、修改或删除的图标。
WCHAR szTip[64];鼠标放在任务栏的图标上时显示的提示信息。
} NOTIFYICONDATA, *PNOTIFYICONDATA;
弹出菜单就说下设置菜单显示位置,添加相应消息就行了。
// 确定鼠标位置以便在该位置附近显示菜单
GetCursorPos( &Point );
SetForegroundWindow();
uID和hIcon一般标识的是同一个图标,为什么要两个呢?没搞明白。
注释掉uID,则启动时任务栏不显示图标,托盘显示时任务栏才显示图标,但是不会响应鼠标消息。注释掉hIcon,则启动时任务栏显示图标,托盘显示时任务栏不显示图标,也不响应鼠标消息。