本文档提供了一个小型模板,用于在基于WTL的应用程序中添加系统托盘图标支持。在此,向Chris Maunder表示敬意,因为在MFC时代,使用了他出色的CSystemTray类,这个WTL版本的灵感来源于此(尽管他的版本提供了更多的功能)。
此模板可用于为应用程序添加“默认”托盘图标行为。当右键单击图标时,会显示一个菜单,双击图标将执行默认菜单项。请注意,第一个菜单项将用作默认项,但可以通过调用SetDefaultItem来更改此设置。
要使用CTrayIconImpl模板,请按照以下步骤操作:
首先,包含头文件:
#include "trayiconimpl"
接下来,从CTrayIconImpl派生主窗口类(对于SDI/MDI应用程序通常是CMainFrame,对于基于对话框的应用程序是CMainDlg):
class CMainDlg : public CTrayIconImpl { ... };
然后(这一点很重要)在窗口消息映射中添加一个CHAIN_MSG_MAP条目(以确保WM_TRAYICON消息被正确处理):
BEGIN_MSG_MAP(CMainDlg) { ... CHAIN_MSG_MAP(CTrayIconImpl) END_MSG_MAP()}
要将图标安装到系统托盘,请在OnCreate(SDI/MDI应用程序)或OnInitDialog(对话框应用程序)中调用InstallIcon。注意,需要为这个调用提供三个参数 - 工具提示文本、图标句柄和当托盘图标被右键单击时显示的弹出菜单的资源ID。
HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
InstallIcon(_T("Tooltip text"), hIconSmall, IDR_POPUP);
最后,为弹出菜单命令添加必要的COMMAND_ID_HANDLERs。就是这样!
通过调用SetDefaultItem更改默认菜单项:
SetDefaultItem(ID_APP_ABOUT);
通过调用SetTooltipText更改工具提示文本:
SetTooltipText(_T("Yeeha!"));
void PrepareMenu(HMENU hMenu) { CMenuHandle menu(hMenu); menu.EnableMenuItem(ID_TEST_DISABLED, MF_GRAYED); menu.CheckMenuItem(ID_TEST_CHECKED, MF_CHECKED); }