给一个程序添加系统托盘图标主要通过以下步骤:
如图1所示,通过函数InstallSysTrayIcon给程序添加系统托盘图标。
函数原型如下:
int InstallSysTrayIcon (const char iconImageFile[], const char toolTipText[], TrayIconCallback callbackFunction, int *iconHandle);
其中:
iconImageFile代表ICO图标路径;
ToolTipText代表你在系统托盘图标上停留鼠标时,显示的提示语;
callbackFunction参数表示给系统托盘装载的回调函数,你在系统托盘鼠标的任何动作以及系统托盘菜单事件均由此函数处理。
iconHandle表示系统托盘图标句柄,后续的所有操作都是以此句柄作为对象的。
系统托盘图标添加成功则返回0,否则为负数。
该函数如下所示:
int CVICALLBACK Func(int iconHandle,int event,int eventData); |
能够相应的托盘事件包括:
EVENT_LEFT_CLICK EVENT_LEFT_MOUSE_UP EVENT_RIGHT_CLICK EVENT_RIGHT_MOUSE_UP EVENT_LEFT_DOUBLE_CLICK EVENT_RIGHT_DOUBLE_CLICK EVENT_MENU_ITEM |
EVENTDATA只在EVENT_MENU_ITEM下有用,表示点击菜单项的索引。
2.给系统托盘图标装载菜单
利用函数AttachTrayIconMenu 给系统托盘图标装载菜单
函数原型为int AttachTrayIconMenu (int iconHandle);
iconHandle表示系统托盘句柄。
装载成功,则返回0。
3.给菜单添加菜单项
利用函数InsertTrayIconMenuItem给菜单添加具体的菜单项。
函数原型为:
int InsertTrayIconMenuItem (int iconHandle, const char itemName[], int *itemIndex);
itemName表示菜单项名称,itemIndex表示新插入项的基于1的索引。
成功则返回0.
4.根据自己的需求给系统托盘回调函数添加代码。
5.其他函数
函数SetTrayIconMenuAttr和函数SetTrayIconMenuItemAttr分别可以设置菜单和菜单项的属性。具体请F1
6.装载的系统托盘图标和菜单在使用完后需要释放
int DetachTrayIconMenu (int iconHandle);
用于释放菜单。
int RemoveSysTrayIcon (int iconHandle);
用于移除系统托盘图标。
7.示例
int CVICALLBACK OkCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
SetPanelAttribute(panel,ATTR_HAS_TASKBAR_BUTTON,0);
SetSystemAttribute(ATTR_TASKBAR_BUTTON_VISIBLE,0);
DetachTrayIconMenu(iconhandle);
RemoveSysTrayIcon(iconhandle);
InstallSysTrayIcon("2.ico","ʵÀý³ÌÐò",iconCB,&iconhandle);
AttachTrayIconMenu(iconhandle);
InsertTrayIconMenuItem(iconhandle,"ÏÔʾ",&itemindex);
InsertTrayIconMenuItem(iconhandle,NULL,&itemindex); //添加分分割线
InsertTrayIconMenuItem(iconhandle,"´ýÏÔʾ״̬",&itemindex);
InsertTrayIconMenuItem(iconhandle,0,&itemindex); //添加分分割线
InsertTrayIconMenuItem(iconhandle,"Í˳ö",&itemindex);
SetTrayIconMenuAttr(iconhandle,ATTR_POPUP_DEFAULT_ITEM,3);//加粗显示索引为3的图标
SetTrayIconMenuItemAttr(iconhandle,3,ATTR_CHECKED,1);//标记显示索引为3的图标
break;
}
return 0;
}
int CVICALLBACK iconCB(int iconhandle,int event,int eventdata)
{
int check;
switch(event)
{
case EVENT_MENU_ITEM:
if(eventdata==1)
{
//添加索引为1的菜单的处理代码
}
if(eventdata==3)
{
//添加索引为3的菜单的处理代码
}
if(eventdata==5)
{
//添加索引为5的菜单的处理代码
}
}
return 0;
}