像qq一样变换图标在写代码之前,我先介绍一个函数。 以下摘至msdn2002 Shell_NotifyIcon 函数 -------------------------------------------------------------------------------- 发送一个消息到任务兰的状态区 语法 BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA lpdata ); 参数
dwMessage 传入的DWORD参数制定将要发生的动作。可以是以下几个值 NIM_ADD 添加图标到状态区. NOTIFYICONDATA结构的hWnd和uId指出那个将对那个图标进行操作。 NIM_DELETE 删除图标。 NIM_MODIFY 修改图标 NIM_SETFOCUS 5.0版本可以使用,这个版本在WINDOWS2000上可以找到,NT,98/95都是旧版本。 Returns focus to the taskbar notification area(设置焦点到任务栏消息区). 如果任务栏显示了一个菜单,但是用户想使用 ESC 取消他, 使用 NIM_SETFOCUS 参数可以返回到消息区。
NIM_SETVERSION 5.0版本 指出任务栏的行为与版本一致,版本的参数在NOTIFYICONDATA结构中可以找到。
lpdata 传入参数,NOTIFYICONDATA结构的地址.
NOTIFYICONDATA 结构 -------------------------------------------------------------------------------- 包含系统处理任务栏状态区的消息。 语法 typedef struct _NOTIFYICONDATA { DWORD cbSize;//结构大小 HWND hWnd;//接受任务栏消息的窗口 UINT uID;//应用程序定义的图标ID,当有多个图标时这个ID不代表某一个必须重新定义一个(参见代码) 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;
uFlags
NIF_ICON uIcon有效 NIF_MESSAGE uCallbackMessage 有效 NIF_TIP szTip有效 NIF_STATE dwStateMask有效 NIF_INFO 使用气泡提示代替标准提示 szInfo, uTimeout, szInfoTitle, dwInfoFlags有效 NIF_GUID 保留
uCallbackMessage 应用程序定义的消息,系统用它来处理任务栏状态区的消息。 hIcon 人物栏状态区图标,版本不一样显示图标的颜色位数不一样。 szTip 字符串提示。版本不一样字符串长度不一样。5.0是128个char。4.0是64。
dwState 图标状态5.0版本 NIS_HIDDEN 隐藏 NIS_SHAREDICON 显示 dwStateMask 5.0 指定将要修改的状态。比如使用NIS_HIDDEN来隐藏图标。 szInfo 5.0版本用于气泡提示最长255个char。 uTimeout 毫秒延时值。 uVersion 指定版本值 szInfoTitle 气泡提示的标题63各字符。 dwInfoFlags 5.0版本. Flags 添加图标给气泡提示。 可以是以下值 NIIF_ERROR An error icon. NIIF_INFO An information icon. NIIF_NONE No icon. NIIF_WARNING A warning icon. NIIF_ICON_MASK Version 6.0. Reserved. NIIF_NOSOUND Version 6.0. Do not play the associated sound. Applies only to balloon ToolTips. guidItem 6.0版本,保留。
以下介绍代码 vc6 win32 首先要保证project setting/link library中设置shell32.lib
//stdafx.中加入 #include <shellapi.h>
#define NORMAL 1 #define RUN 2 #define ID_TIMER 1
#define UWM_NOTIFYICON WM_USER+1
//trayicon.cpp // TrayIcon.cpp : Defines the entry point for the application. //
#include "stdafx.h" #include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
HINSTANCE hinst; HICON hicon[2]; UINT uStatus=NORMAL;//程序运行状态 NORMAL图标不变化 RUN图标变化 int iIcon=0;//指示但前使用的图标
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //declare varibale static TCHAR szAppName[]=TEXT("托盘图标"); TCHAR szCaption[]=TEXT("托盘图标使用例子"); HWND hwnd; MSG msg; WNDCLASS wndclass;
hinst=hInstance;
hicon[0]=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); hicon[1]=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));
wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WndProc;//窗口过程地址 wndclass.cbClsExtra=0;//指定额外分配给wndclass的字节 wndclass.cbWndExtra=0;//指定额外的字节分配给wnd实例 wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); wndclass.lpszClassName=szAppName; wndclass.lpszMenuName=NULL;
if(!RegisterClass(&wndclass)) { //ErrorMessageBox(); return 0; }
//默认的窗口风格且主窗口不可见不再任务栏 hwnd=CreateWindowEx(WS_EX_TOOLWINDOW,szAppName,szCaption,WS_OVERLAPPEDWINDOW|WS_POPUP,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOW); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA); tnd.hWnd=hwnd; strcpy(tnd.szTip,TEXT("托盘示例")); tnd.uCallbackMessage=UWM_NOTIFYICON; tnd.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; tnd.uID=IDI_ICON;//前面有定义,注意不是图标IDI_ICON1或者IDI_ICON2
switch(message) { //TIMER事件中使图标变化 case WM_TIMER: if(iIcon==0) iIcon++; else iIcon--; tnd.hIcon=hicon[iIcon]; Shell_NotifyIcon(NIM_MODIFY,&tnd); return 0 ; case WM_COMMAND: switch (LOWORD (wParam)) { //退出程序 case IDM_APP_EXIT: SendMessage (hwnd, WM_CLOSE, 0, 0) ; return 0; //启动TIMER case IDM_RUN: if (SetTimer (hwnd, ID_TIMER, 500, NULL)) uStatus=RUN; return 0; //停止TIMER case IDM_STOP: KillTimer (hwnd, ID_TIMER) ; iIcon=0; tnd.hIcon=hicon[iIcon]; Shell_NotifyIcon(NIM_MODIFY,&tnd); uStatus=NORMAL; return 0 ; } return 0; //自定义事件处理鼠标在TRAYICON上的点击 case UWM_NOTIFYICON: //如果是鼠标右击 if((UINT) lParam==WM_RBUTTONDOWN) { //如果是IDI_ICON if((UINT)wParam==IDI_ICON) {
POINT pt; HMENU hmenu,hsubmenu;
hmenu=LoadMenu(hinst,MAKEINTRESOURCE(IDR_MENU1)); hsubmenu=GetSubMenu(hmenu, 0); //取得光标当前位置 GetCursorPos(&pt); SetForegroundWindow(hwnd); if(uStatus==NORMAL) { EnableMenuItem (hmenu, IDM_STOP, MF_GRAYED) ; EnableMenuItem (hmenu, IDM_RUN, MF_ENABLED) ; } else { EnableMenuItem (hmenu, IDM_RUN, MF_GRAYED) ; EnableMenuItem (hmenu, IDM_STOP, MF_ENABLED) ; } //弹出菜单 TrackPopupMenu(hsubmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); DestroyMenu(hmenu); } } return 0; //窗体产生时在托盘区显示图标 case WM_CREATE: tnd.hIcon=hicon[0]; Shell_NotifyIcon(NIM_ADD,&tnd); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return 0; //退出使删除图标 case WM_CLOSE: Shell_NotifyIcon(NIM_DELETE,&tnd); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); } /* void ErrorMessageBox() { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf ); }*/
代码下载
我的主页 
|