#include windows.h
#include shellapi.h
#include tchar.h
#include "resource.h"
#define SYSTRAY_ICON_UID 1001
#define WM_SYSTRAYNOTIFY WM_USER + 1
/* Global variables */
NOTIFYICONDATA NotifyIconData;
HICON IconHandle;
/* Global function declaration */
BOOL CALLBACK MainDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
/* Function definition */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
IconHandle = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) MainDialogProc);
return 0;
}
BOOL CALLBACK MainDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case WM_INITDIALOG:
/* Filling in NOTIFYICONDATA */
memset(&NotifyIconData, 0, sizeof(NOTIFYICONDATA));
NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
NotifyIconData.hWnd = hDlg;
NotifyIconData.uID = SYSTRAY_ICON_UID;
NotifyIconData.hIcon = IconHandle;
NotifyIconData.uFlags = NIF_MESSAGE NIF_ICON NIF_TIP;
NotifyIconData.uCallbackMessage = WM_SYSTRAYNOTIFY;
_tcscpy(NotifyIconData.szTip, _T("Windows API - SysTray Icon Tutorial"));
return TRUE;
case WM_SYSTRAYNOTIFY:
NotifyIconData.hWnd = hDlg;
NotifyIconData.uID = SYSTRAY_ICON_UID;
Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
ShowWindow(hDlg, SW_SHOW);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case WM_DESTROY: EndDialog(hDlg, 0);
return TRUE;
case ID_SYSTRAY:
/* Call Shell_NotifyIcon to submit SysTray message */
Shell_NotifyIcon(NIM_ADD, &NotifyIconData);
/* Hide the main window */
ShowWindow(hDlg, SW_HIDE);
break;
}
}
return FALSE;
}
你必須要加入#include windows.h和#include shellapi.h,tchar.h是為了宣告_tcscpy和_T,若不使用_tcscpy和
_T話,則可以省略。
該程式是一Dialog-based應用程序,於WinMain內呼叫程式資源中的IDD_DIALOG1作為主程式版面,在初始化對話盒
時(i.e. 發出WM_INITDIALOG訊息),我們填上NOTIFYICONDATA內的資料,最重要的資料包括
hWnd:指定該SysTray圖示的主屬視窗程式uID:若一程式有多個SysTray圖示時,用來分辨多個圖示
hIcon:圖示的Handle,用來繪製圖示
uCallbackMessage:當滑鼠經過SysTray圖示時所發出的訊息
圖示的Handle可由LoadIcon( )函數獲取,詳情請參閱
http://itzone.hk/article/article.php?aid=200406210255103136
及
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons/iconreference/iconfunctions/loadicon.asp
而uCallbackMessage則是使用者定義的訊息代碼,在該程式中為:
#define WM_SYSTRAYNOTIFY WM_USER + 1其中WM_USER(即0x0400)及以後的數字,均為使用者定義訊息代
碼。
當NOTIFYICONDATA 內所有資料都填好後,便可以方進Shell_NotifyIcon(DWORD msg, NOTIFYICONDATA*
nid)裡,其中「msg」的值若是「NIM_ADD」的話,則表示你想把圖示新增至SysTray中;若為「NIM_DELETE」的
話,表示你想在 SysTray中,移除屬於該程式的圖示。
呼叫Shell_NotifyIcon( )時並不會把原本的視窗隱藏,你需要自行呼叫ShowWindow( )來隱藏或還原程式視窗。
沒有留言:
張貼留言