托盘程序有时显得很必要,而且会让别人认为你的程序够专业。其实实现托盘程序很简单。
实现托盘程序,主要用到这个函数:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
); 它负责绘制图标以及确定图标所传送消息。关于它的详细介绍,可以自己查看msdn.
程序实现细节:
最小化到托盘程序:
拦截程序wm_size消息,判断它的消息是最小化时,将窗口最小化到托盘:
void CScanServerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(nType==SIZE_MINIMIZED)
toTray();
}
void CScanServerDlg::toTray()
{
NOTIFYICONDATA nid;
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_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"123456..."); //信息提示条为“123456”
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}
然后,在dlg.cpp文件中定义一个消息:
#define WM_SHOWTASK (WM_USER + 1983) //托盘消息影射
同时添加消息实现函数 afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
LRESULT CScanServerDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint="new" tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
/ /增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口,将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
/ /资源回收
HMENU hmenu="menu".Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
}
break;
}
return 0;
}
并在cpp文件中将消息和消息实现链接起来
BEGIN_MESSAGE_MAP(CScanServerDlg, CDialog)
ON_MESSAGE(WM_SHOWTASK,onShowTask)
END_MESSAGE_MAP()
到此,你的托盘程序已然实现了。不过还有一个小问题,就是关闭窗口后托盘图标还在任务栏中显示,所以
要捕捉wm_destroy消息,将托盘图标给删掉:
void CScanServerDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
//删除托盘图标
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = IDR_MAINFRAME;
//用NIM_DELETE删除图标
Shell_NotifyIcon(NIM_DELETE, &tnid);
}
文章评论(0条评论)
登录后参与讨论