像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 );
}*/