桌面搜索-系统托盘 - 林建华的专栏

来源:百度文库 编辑:神马文学网 时间:2024/05/23 23:59:45
桌面搜索-系统托盘
在程序最小化时,不在windows的任务栏中出现,而是在右下角的系统托盘中显示一个小图标,当鼠标单击时显示功能菜单,双击时打开主界面。这就是系统托盘程序的一般功能,想qq和很多桌面搜索程序都是这么做了,给人的感觉比较清爽,不用的时候就缩在一个小角落里,用的时候也能很快的找到。
在技术实现上
首先是创建托盘:
void CDiskSearchDlg::InitTray()
{
m_NotifyID.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
m_NotifyID.hWnd=this->m_hWnd;
m_NotifyID.uID=IDR_MAINFRAME;
m_NotifyID.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_NotifyID.uCallbackMessage=WM_NOTIFYICON;//自定义的消息名称
m_NotifyID.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_NotifyID.szTip,"桌面搜索");//信息提示
Shell_NotifyIcon(NIM_ADD,&m_NotifyID);//在托盘区添加图标
}
上面的代码就是一个一般创建的方法,其中定义NOTIFYICONDATA m_NotifyID;
WM_NOTIFYICON是自定义的消息,我们可以用
#define WM_NOTIFYICON WM_USE+5
来定义
调用InitTray()后会在托盘上出现一个小图标,当然我们也同时要把任务栏中的程序任务去掉,只要调用ShowWindow(SW_HIDE)就可以了
接下来是创建一个菜单资源,假设为IDR_MENU_TP
然后要做的是添加WM_NOTIFYICON消息:
在BEGIN_MESSAGE_MAP(CDiskSearchDlg, CDialog)内要添加
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加托盘消息映射
并定义函数
LONG CDiskSearchDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是响应消息的图标ID,lParam中则是Windows的消息
switch ( lParam )
{
case WM_RBUTTONDOWN:
{// 用户在托盘图标上单击鼠标右键,弹出菜单
CMenu pMenu;
if (pMenu.LoadMenu(IDR_MENU_TP))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
}
}
break;
case WM_LBUTTONDBLCLK:
//  OnMenuitemShow();
break;
case WM_LBUTTONDOWN:
{// 用户在托盘图标上单击鼠标右键,弹出菜单
CMenu pMenu;
if (pMenu.LoadMenu(IDR_MENU_TP))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
}
}
break;
default:break;
}
return 0;
}
上面这段代码中,添加了鼠标单击的消息,双击和其他消息其实是一样的。
最后,在退出的时候记得要调用
Shell_NotifyIcon(NIM_DELETE, &m_NotifyID);
来把托盘图标删除。
当然还有做动画托盘,就是托盘上的图标是变化的,这个可以在上面的dlg类中添加Timer函数,定时更换图标就可以了。