作者:bluecrest 時間:2001-09-30 09:50 出處:互聯(lián)網(wǎng) 責(zé)編:chinaitpower
摘要:像qq一樣變換圖標(biāo)
像qq一樣變換圖標(biāo)
作者:高歌
在寫代碼之前,我先介紹一個函數(shù)。
以下摘至msdn2002
Shell_NotifyIcon 函數(shù)
--------------------------------------------------------------------------------
發(fā)送一個消息到任務(wù)蘭的狀態(tài)區(qū)
語法
BOOL Shell_NotifyIcon( DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
參數(shù)
dwMessage
傳入的DWORD參數(shù)制定將要發(fā)生的動作??梢允且韵聨讉€值
NIM_ADD
添加圖標(biāo)到狀態(tài)區(qū). NOTIFYICONDATA結(jié)構(gòu)的hWnd和uId指出那個將對那個圖標(biāo)進(jìn)行操作。
NIM_DELETE
刪除圖標(biāo)。
NIM_MODIFY
修改圖標(biāo)
NIM_SETFOCUS
5.0版本可以使用,這個版本在WINDOWS2000上可以找到,NT,98/95都是舊版本。
Returns focus to the taskbar notification area(設(shè)置焦點到任務(wù)欄消息區(qū)).
如果任務(wù)欄顯示了一個菜單,但是用戶想使用 ESC 取消他, 使用 NIM_SETFOCUS 參數(shù)可以返回到消息區(qū)。
NIM_SETVERSION
5.0版本 指出任務(wù)欄的行為與版本一致,版本的參數(shù)在NOTIFYICONDATA結(jié)構(gòu)中可以找到。
lpdata
傳入?yún)?shù),NOTIFYICONDATA結(jié)構(gòu)的地址.
NOTIFYICONDATA 結(jié)構(gòu)
--------------------------------------------------------------------------------
包含
系統(tǒng)處理任務(wù)欄狀態(tài)區(qū)的消息。
語法
typedef struct _NOTIFYICONDATA {
DWORD cbSize;//結(jié)構(gòu)大小
HWND hWnd;//接受任務(wù)欄消息的窗口
UINT uID;//應(yīng)用
程序定義的圖標(biāo)ID,當(dāng)有多個圖標(biāo)時這個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 使用氣泡提示代替標(biāo)準(zhǔn)提示 szInfo, uTimeout, szInfoTitle, dwInfoFlags有效
NIF_GUID 保留
uCallbackMessage
應(yīng)用
程序定義的消息,
系統(tǒng)用它來處理任務(wù)欄狀態(tài)區(qū)的消息。
hIcon
人物欄狀態(tài)區(qū)圖標(biāo),版本不一樣顯示圖標(biāo)的顏色位數(shù)不一樣。
szTip
字符串提示。版本不一樣
字符串長度不一樣。5.0是128個char。4.0是64。
dwState
圖標(biāo)狀態(tài)5.0版本
NIS_HIDDEN
隱藏
NIS_SHAREDICON
顯示
dwStateMask
5.0 指定將要修改的狀態(tài)。比如使用NIS_HIDDEN來隱藏圖標(biāo)。
szInfo
5.0版本用于氣泡提示最長255個char。
uTimeout
毫秒延時值。
uVersion
指定版本值
szInfoTitle
氣泡提示的標(biāo)題63各
字符。
dwInfoFlags
5.0版本. Flags 添加圖標(biāo)給氣泡提示。
可以是以下值
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中設(shè)置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;//
程序運行狀態(tài) NORMAL圖標(biāo)不變化 RUN圖標(biāo)變化
int iIcon=0;//指示但前使用的圖標(biāo)
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//declare varibale
static TCHAR szAppName[]=TEXT("托盤圖標(biāo)");
TCHAR szCaption[]=TEXT("托盤圖標(biāo)使用例子");
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的字節(jié)
wndclass.cbWndExtra=0;//指定額外的字節(jié)分配給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;
}
//默認(rèn)的窗口風(fēng)格且主窗口不可見不再任務(wù)欄
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;//前面有定義,注意不是圖標(biāo)IDI_ICON1或者IDI_ICON2
switch(message)
{
//TIMER事件中使圖標(biāo)變化
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;
//自定義事件處理鼠標(biāo)在TRAYICON上的點擊
case UWM_NOTIFYICON:
//如果是鼠標(biāo)右擊
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);
//取得光標(biāo)當(dāng)前位置
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;
//窗體產(chǎn)生時在托盤區(qū)顯示圖標(biāo)
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;
//退出使刪除圖標(biāo)
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 );
}*/