1.用visual c++新建一个基于对话框的应用程序,假设名字为Test。
2.在CTestDlg.cpp文件中加入:
#define WM_NOTIFYICON WM_USER+1
NOTIFYICONDATA nld;
3.在CTestDlg.h文件的CTestDlg类中添加消息响应函数的声明:
LONG OnNotifyIcon(WPARAM wParam, LPARAM lParam);
4.在CTestDlg.cpp文件的消息映射部分加入
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)
5.添加一个菜单资源,假设名为IDR_MENU1
该菜单有一个名为“菜单”的子菜单,其下的菜单项为“显示”(ID_SHOW)和“隐藏”(ID_HIDE)以及“退出”(ID_EXIT)
6.为该菜单添加响应函数
分别为“显示”“隐藏”“退出”添加OnShow(),OnHide(),OnExit()函数,如下
void CTestDlg::OnShow()
{
// TODO: Add your command handler code here
ShowWindow( SW_SHOWNORMAL);
}
void CbackdropDlg::OnExit()
{
::PostQuitMessage(WM_QUIT);
}
void CTestDlg::OnHide()
{
// TODO: Add your command handler code here
ShowWindow(SW_HIDE);
}
7.在CTestDlg.cpp文件中实现OnNotifyIcon函数:
// 响应在托盘图标上的点击
LONG CInformationSaverDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
//wParam是响应消息的图标ID,lParam中是Windows消息
{
CMenu menu;
switch(lParam)
{
case WM_RBUTTONDOWN: //在托盘图标上单击鼠标右键
{
if (menu.LoadMenu(IDR_MENU1))
{
CMenu* pPopup = menu.GetSubMenu(0);
CPoint point;
if (IsWindowVisible()) //如果窗口没有隐藏
{
pPopup->EnableMenuItem(IDC_SHOW,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
else
pPopup->EnableMenuItem(IDC_HIDE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
GetCursorPos(&point); //获得鼠标位置
SetForegroundWindow(); //显示窗口
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this);
}
}
break;
case WM_LBUTTONDOWN:
OnShow(); //显示窗口
break;
}
return 0;
}
8.在OnInitDialog()函数中加入:
nld.cbSize=sizeof(NOTIFYICONDATA);
nld.hWnd=m_hWnd; //当前窗口将收到托盘图标发出的消息
nld.uID=IDR_MAINFRAME;
nld.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;//nld 的成员hIcon,uCallbackMessage,szTip有效
nld.uCallbackMessage=WM_NOTIFYICON;//用鼠标对托盘中的图标的操作发出消息WM_NOTIFYICON
nld.hIcon=m_hIcon; //托盘中的图标为m_hIcon,注意,这里的m_hIcon是事先加载了图标的
strcpy(nld.szTip, "我的托盘"); //鼠标放在托盘图标上时显示的文字
Shell_NotifyIcon(NIM_ADD, &nld); //添加图标到状态栏
9.为主对话框添加消息响应OnDestroy()
void CTestDlg::OnDestroy()
{
CDialog::OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &nld);
}
看到了网上的一个总结,觉得不错,就Copy过来了:
hWnd:指定产生动画窗口的句柄; dwTime:指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒; dwFags:指定动画类型。这个参数可以是一个或多个标志的组合。
dwFlags:
AW_SLIDE:使用滑动类型。缺省为滚动类型。使用AW_CENTER标志时被忽略;
AW_ACTIVATE:激活窗口。在使用了AW_HIDE标志后不能使用这个标志;
AW_BLEND:实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志;
AW_HIDE:隐藏窗口,缺省则显示窗口;
AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口;
AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;
AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;
AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。 如果: 1、窗口使用了窗口边界; 2、窗口已经可见仍要显示窗口; 3、窗口已经隐藏仍要隐藏窗口。 函数将失败。
|