吵吵   2011-06-14  阅读:2,679

添加一个托盘图标是很有必要的,如果要实现程序的隐藏和唤醒的话。
令一方面添加了托盘图标的程序比较方便用户进行退出等操作,而且有时候我们可以添加一些信息,让用户移动到图标上时候显示。最后还可以搞个简单点的动画方案,如qq登陆时候左看看右看看。
要实现这些我们先看一个结构:
NOTIFYICONDATA
官方定义为

typedef struct _NOTIFYICONDATA
{   
DWORD cbSize;   
HWND hWnd;   
UINT uID;   
UINT uFlags;   
UINT uCallbackMessage;   
HICON hIcon;   
TCHAR szTip[64];   
DWORD dwState;   
DWORD dwStateMask;   
TCHAR szInfo[256];   
union {   UINT uTimeout;   UINT uVersion;   };   
TCHAR szInfoTitle[64];   
DWORD dwInfoFlags;   
GUID guidItem;   
} NOTIFYICONDATA, *PNOTIFYICONDATA;

看着头晕,还是从我的一个程序中的实例入手
先在xxDlg.h中定义结构
NOTIFYICONDATA tnd;
我们一般定义为整个类都能用到的,这样子就可以在改动时候只改动某个参数就ok了。
在BOOL CGangwangDlg::OnInitDialog()中开始使用:

tnd.cbSize=sizeof(NOTIFYICONDATA); //结构体得大小
tnd.hWnd=this->m_hWnd; //句柄,我们用窗口句柄就ok了
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE |NIF_ICON |NIF_TIP; //支持消息,图标,还有鼠标移动上去提示
tnd.uCallbackMessage=WM_LIBEN; //当点击或者其他操作是发送给程序的消息
tnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); //图标先载入我们的程序图标www.chaochaoblog.com
strcpy(tnd.szTip,"吵吵登陆器v3.0"); //提醒的文字
Shell_NotifyIcon(NIM_ADD,&tnd);//都设置完了后添加到托盘中去,记住这个函数哦

我们先看消息映射
在头文件中定义消息
#define WM_LIBEN (WM_USER + 101)
在该类的proteced中添加消息映射
afx_msg void OnLIBEN(WPARAM wParam, LPARAM lParam);
然后回到cpp中再次关联消息和函数

ON_MESSAGE(WM_LIBEN, OnLIBEN)
之后就添加消息响应函数了

void CGangwangDlg::OnLIBEN(WPARAM wParam, LPARAM lParam)
{
if(lParam==WM_RBUTTONDOWN || lParam==WM_RBUTTONUP)//右键按下消息
{
CMenu popMenu; //这里你可以做你自己的事情了,我是弹出一个菜单
popMenu.CreatePopupMenu();
//注意每个 都需要一个消息对应 用oncommand来映射
popMenu.AppendMenu(MF_STRING,IDM_MENU_HIDESHOWWINDOW,strShowHide);
popMenu.AppendMenu(MF_STRING,IDM_MENU_CHANGEBACK,"更换皮肤");
popMenu.AppendMenu(MF_STRING,IDM_MENU_EXITUSER,"退出账号");
popMenu.AppendMenu(MF_STRING,IDM_MENU_EXIT, "退出");

SetForegroundWindow();
CPoint point;
GetCursorPos(&point);
::TrackPopupMenu(popMenu.m_hMenu,TPM_LEFTALIGN,point.x,point.y,0,::AfxGetApp()->GetMainWnd()->m_hWnd,NULL);

popMenu.DestroyMenu();

}
}

搞完了消息映射我们再看看动画怎么做。
其实也很简单,搞几个ico先加载到资源里面去,然后用一个time去更换图标就好了
看看我的代码

void CGangwangDlg::ChangeIcon()
{
if(nIconID==IDI_ICON1)
{
nIconID=IDI_ICON2;
}
else if(nIconID==IDI_ICON2)
{
nIconID=IDI_ICON4;
}
else if(nIconID==IDI_ICON3)
{
nIconID=IDI_ICON1;
}
else
{
nIconID=IDI_ICON3;
}
tnd.hIcon=tnd.hIcon=AfxGetApp()->LoadIcon(nIconID);

Shell_NotifyIcon(NIM_MODIFY,&tnd);//将tnd结构更改应用到托盘中去
}

我这个只用到了三个ico然后在timer消息中调用就好了!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注