VC 任务栏 系统托盘图标

VC 任务栏 系统托盘图标
 
       很多程序运行时都会在系统托盘中显示出自己的图标,感觉很有意思,也想做一个玩一玩,正好现在学VC就到网上找了个VC的例子做法很简单,但要实现更多方便的功能还要加以修改.
现在就开始吧,我们需要做这样几个事情:
一、准备工作
      1.在你的程序主窗体定义的头文件中定义一个用户自定义消息。该消息的用处是,当我们用鼠标点击任务栏上的图标时,图标要发出的消息,消息的接收者就是当前你写定义语句的窗体。定义方法是:#define WM_ICONMESSAGE (WM_USER+100)后面没有分号, 推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
      2.声明消息处理函数。还是这个头文件的下面:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here.
//    DO NOT EDIT what you see in these blocks of generated code!
afx_msg LRESULT OnIconMessage(WPARAM wparam,LPARAM lparam);//在这里声明一个消息处理函数
//}}AFX_MSG
       3.实现OnIconMessage这个函数,这回要去同名的.CPP文件里加上这个函数就行了。
LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lparam)
{
UINT uID;
UINT uMouseMsg;
uID=(UINT)wparam;
uMouseMsg=(UINT)lparam;
if(uID==IDR_MAINFRAME){//确定是我们的图标
switch(uMouseMsg){
case WM_LBUTTONDOWN://处理左键安下事件
   AfxMessageBox("Lbuttondown");
   break;
case WM_RBUTTONDOWN://处理右键安下事件
   AfxMessageBox("Rbuttondown");
   break;
case WM_LBUTTONDBLCLK://处理左键双击事件
   AfxGetMainWnd()->SendMessage(WM_CLOSE);
   break;
default:
   break;
}
}
return 0;
}
     4.现在有了消息和处理函数我们得把他们关联起来,当消息来时让程序知道如何找到处理函数的方法,还是在这个文件的上方找到用户消息块:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_ICON_MESSAGE, OnMyMessage) //这是我加进去的注意后面没分号
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
      到这里我们以经完成了定义、接收、处理消息的准备工作接着就是如何把图标显示在任务栏中的问题了。
二、显示图标
     显示图标是通过这一步是利用系统API函数Shell_NotifyIcon()将一个图标显示在任务栏的通告区中。函数原型:
     WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATAA lpData);
在调用该函数之前,需要确定其参数的取值。其中Shell_NotifyIcon()函数的第一个参数是一个预定义的消息,可以取如下值之一:NIM_ADD、NIM_DELETE或NIM_MODIFY,分别表示添加图标、删除图标或修改图标。另一个参数为指向NOTIFYICONDATA类型的指针。其原型为:
typedef struct _NOTIFYICONDATA { 
DWORD cbSize; //为该结构所占的字节数
HWND hWnd; //为接受该图标所发出的消息的窗口的句柄
UINT uID; //为被显示图标的ID
UINT uFlags; //指明其余的几个成员(hIcon、uCallBackMessage和szTip)的值是否有效
UINT uCallbackMessage; //为一个用户自定义的消息(就是上面定义的那个赋给它)
HICON hIcon; //为将在任务栏上被显示图标的句柄
char szTip[64]; //鼠标停留在该图标上时显示的字符串
}NOTIFYICONDATA
下面就是要在窗体的OnCreate事件中填好这个结构体的内容,然后用shell_NotifyIcon这个函数显示。如下
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 NOTIFYICONDATA tnd;
 tnd.cbSize=sizeof(NOTIFYICONDATA);
 tnd.hWnd=this->m_hWnd;
 tnd.uID=IDR_MAINFRAME;
 tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
 tnd.uCallbackMessage=WM_ICON_MESSAGE;
 tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
 strcpy(tnd.szTip,"测试程序");//图标提示为"测试程序"
 Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标
}
写好后运行一下程序能看到吧?但是程序关闭时图标也在任务栏中,不能消失这样可不行,下面就是让它随主程序关闭消失的代码:
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=this->m_hWnd;
tnid.uID=IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE,&tnid);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值