为自己的应用程序添加任务栏托盘功能

来源:互联网 发布:优酷视频解析 知乎 编辑:程序博客网 时间:2024/04/30 02:06

1 在你的主对话框头文件中添加一个NOTIFYICONDATA结构

NOTIFYICONDATA NotfityData;

当然你也可以把它定义为一个全局变量。

2 在主对话框的初始化中对其进行赋值,赋值过程如下

NotfityData.cbSize = sizeof(NOTIFYICONDATA);
 NotfityData.hIcon = AfxGetApp()->LoadIcon(IDI_ICON_TEST);
 NotfityData.hWnd = this->m_hWnd;
 lstrcpyn(NotfityData.szTip,TEXT("MY TRAY"),sizeof(NotfityData.szTip));
 NotfityData.uCallbackMessage = WM_NC;
 NotfityData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
 Shell_NotifyIcon(NIM_ADD, &NotfityData); 

其中hicon是要显示的小图标,如果用应用程序自己默认图标,就选IDR_MAINFRAM;

sztip是鼠标移到托盘上时显示的数字,自己随便写都可以,这里我们用MY TRAY代替;

uCallbackMessage是个很重要的字段,指定为一个自定义的消息,托盘的相关消息将通过这个发出;也就是首先自定一个消息,这里是WM_NC。(自定义消息就是在文件的头部#define WM_NC WM_USER+120)

Shell_NotifyIcon是设置托盘类型,这里设为NIM_ADD,就是添加托盘了。

3.在程序结束时,比如添加对话框的OnClose()响应,在其中将托盘关闭:

Shell_NotifyIcon(NIM_DELETE, &NotfityData);

到这里其实就可以显示托盘了,但是为了让托盘能够合理工作,还需要继续做下去哦。

4.在程序中添加WM_NC也就是我们设定的与托盘相关的自定义消息的响应函数。

主要有三步:首先在头文件中添加申明:afx_msg LRESULT OnTrayNotification(WPARAM wparam, LPARAM lparam);

其次在消息映射表中添加映射关联:ON_MESSAGE(WM_NC,OnTrayNotification)

最后实现该响应函数:

LRESULT CTrayIconTestDlg::OnTrayNotification(WPARAM wParam, LPARAM IParam) 

 switch (IParam )
 {
 case WM_RBUTTONUP:
  {
   CPoint pt;
   GetCursorPos(&pt);
   CMenu menu;
   menu.LoadMenu(IDR_MENU_TRAY);
   CMenu *pMenu = menu.GetSubMenu(0);

   pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this);
   
   menu.DestroyMenu();
  }
  break;
 case WM_LBUTTONDOWN:
  {
   ShowWindow(SW_SHOW);   
  }
 }
 return 0;

}

可以随便实现自己想要的消息,这里我们实现了左键摁下和右键弹起的消息,左键摁下我们会SHOW窗口,右键弹起时会显示一个菜单。嫌麻烦就只获取左键摁下也行。

5.如果实现了上述的右键弹出菜单的话,我们一般在菜单上含有一个exit的菜单项,我们添加该菜单项的COMMAND消息如下:

void CTrayIconTestDlg::OncomRang()
{
 SendMessage(WM_CLOSE);
 // TODO: Add your command handler code here
}

这样,当我们右键点击托盘,弹出含有exit项的菜单,点击exit,程序也可以退出了。到这里,托盘应用程序就实现了,如果还不清楚,我发了源码,可以去下载。

原创粉丝点击