现在很多程序都有托盘功能,下面介绍一下如何在VC下实现托盘程序的功能:
1.准备一个菜单
菜单有两上项“显示”和“退出”。
菜单的名为“托盘菜单”ID为:IDR_MENU_TRAY,两个项分别为:IDR_MENU_SHOW,IDR_MENU_EXIT。
2.初始化托盘
(1)源代码
void CSmsDlg::InitTray()
{
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_NOTIFYICON;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"东讯短信平台");//信息提示
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
}
(2)消息的定义#define WM_NOTIFYICON WM_USER+5,一般放在头文件的开始。
(3)所有到的变量 NOTIFYICONDATA nid; 一般在头文件中定义。
(4)初始化托盘函数一般在初始化对话框函数中引用或在单文档中int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)引用。
3.响应托盘消息函数
(1)源代码
LONG CSmsDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是响应消息的图标ID,lParam中则是Windows的消息
CMenu pMenu;
switch ( lParam )
{
case WM_RBUTTONDOWN:// 用户在托盘图标上单击鼠标左、右键,弹出菜单
case WM_LBUTTONDOWN:
if (pMenu.LoadMenu(IDR_MENU_TRAY))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;