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); |