|   一派掌門 二十級 | 
              【主程序文件代码】// NotifyIcon.cpp : Defines the entry point for the application.
 //
 #include "stdafx.h"
 #include "NotifyIcon.h"
 #include <CommCtrl.h>
 #include <shellapi.h>
 #include <windowsx.h>
 // 启用XP风格控件
 #pragma comment(lib, "Comctl32.lib")
 #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
 #define MAX_LOADSTRING 100
 #define MAX_STRLEN 255
 // Global Variables:
 HINSTANCE hInst;        // current instance
 TCHAR szTitle[MAX_LOADSTRING];     // The title bar text
 TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name
 NOTIFYICONDATA nid; // 系统托盘图标信息
 LPWSTR list[] = {L"None", L"Information", L"Warning", L"Error", L"User Defined", NULL};
 DWORD iconflags[] = {NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR, NIIF_USER};
 // Forward declarations of functions included in this code module:
 ATOM    MyRegisterClass(HINSTANCE hInstance);
 BOOL    InitInstance(HINSTANCE, int);
 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 _In_opt_ HINSTANCE hPrevInstance,
 _In_ LPTSTR    lpCmdLine,
 _In_ int       nCmdShow)
 {
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);
 // TODO: Place code here.
 MSG msg;
 HACCEL hAccelTable;
 // Initialize global strings
 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_NOTIFYICON, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);
 // Perform application initialization:
 if (!InitInstance (hInstance, nCmdShow))
 {
 return FALSE;
 }
 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_NOTIFYICON));
 // Main message loop:
 while (GetMessage(&msg, NULL, 0, 0))
 {
 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 }
 return (int) msg.wParam;
 }
 
 
 //
 //  FUNCTION: MyRegisterClass()
 //
 //  PURPOSE: Registers the window class.
 //
 ATOM MyRegisterClass(HINSTANCE hInstance)
 {
 WNDCLASSEX wcex;
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style   = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = WndProc;
 wcex.cbClsExtra  = 0;
 wcex.cbWndExtra  = 0;
 wcex.hInstance  = hInstance;
 wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NOTIFYICON));
 wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_NOTIFYICON);
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 return RegisterClassEx(&wcex);
 }
 //
 //   FUNCTION: InitInstance(HINSTANCE, int)
 //
 //   PURPOSE: Saves instance handle and creates main window
 //
 //   COMMENTS:
 //
 //        In this function, we save the instance handle in a global variable and
 //        create and display the main program window.
 //
 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 {
 HWND hWnd;
 hInst = hInstance; // Store instance handle in our global variable
 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 if (!hWnd)
 {
 return FALSE;
 }
 addTrayIcon(hWnd); // 添加系统托盘图标
 nCmdShow = SW_HIDE; // 无论nCmdShow的值是什么,启动程序时一律不显示窗口
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 return TRUE;
 }
 //
 //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
 //
 //  PURPOSE:  Processes messages for the main window.
 //
 //  WM_COMMAND - process the application menu
 //  WM_PAINT - Paint the main window
 //  WM_DESTROY - post a quit message and return
 //
 //
 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;
 switch (message)
 {
 case WM_COMMAND:
 wmId    = LOWORD(wParam);
 wmEvent = HIWORD(wParam);
 // Parse the menu selections:
 switch (wmId)
 {
 case ID_1_SHOW: // 当点击托盘菜单的Open命令时显示窗口
 ShowWindow(hWnd, SW_SHOW);
 break;
 case ID_1_SHOWMOUSEPOSITION: // 当点击托盘菜单的显示鼠标位置的命令时
 showCursorPosition(hWnd);
 break;
 case IDM_ABOUT:
 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
 break;
 case ID_1_EXIT: // 当点击托盘菜单的Exit命令时退出程序
 case IDM_EXIT:
 DestroyWindow(hWnd);
 break;
 case ID_1_SHOWBALLOON:
 case ID_NOTIFYICON_SHOWBALLOON:
 showBalloon();
 break;
 case ID_1_SHOWCUSTOMBALLOON:
 case ID_NOTIFYICON_SHOWCUSTOMBALLOON:
 showDlg1(hWnd);
 break;
 default:
 return DefWindowProc(hWnd, message, wParam, lParam);
 }
 break;
 case WM_SYSCOMMAND:
 wmId = LOWORD(wParam);
 switch (wmId)
 {
 case SC_MINIMIZE:
 // 最小化时隐藏窗口
 ShowWindow(hWnd, SW_HIDE);
 break;
 default:
 return DefWindowProc(hWnd, message, wParam, lParam);
 }
 case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
 // TODO: Add any drawing code here...
 EndPaint(hWnd, &ps);
 break;
 case WM_DESTROY:
 deleteTrayIcon(); // 当主窗口关闭时删除托盘图标
 PostQuitMessage(0);
 break;
 case WM_SHOWTASK:
 wmEvent = LOWORD(lParam);
 wmId = HIWORD(lParam);
 switch (wmEvent)
 {
 case WM_LBUTTONDBLCLK:
 // 双击托盘图标时显示窗口
 ShowWindow(hWnd, SW_SHOW);
 break;
 case WM_RBUTTONDOWN:
 // 右键点击托盘图标时显示菜单
 showTrayMenu(hWnd);
 break;
 }
 break;
 default:
 return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
 }
 // Message handler for about box.
 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {
 UNREFERENCED_PARAMETER(lParam);
 switch (message)
 {
 case WM_INITDIALOG:
 return (INT_PTR)TRUE;
 case WM_COMMAND:
 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
 {
 EndDialog(hDlg, LOWORD(wParam));
 return (INT_PTR)TRUE;
 }
 break;
 }
 return (INT_PTR)FALSE;
 }
 void addTrayIcon(HWND hWnd)
 {
 HINSTANCE hShellInst = GetModuleHandle(L"shell32.dll");
 nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
 nid.hWnd = hWnd;
 nid.uID = IDR_MAINFRAME;
 nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
 nid.uCallbackMessage = WM_SHOWTASK;
 LoadIconMetric(hShellInst, MAKEINTRESOURCE(4), LIM_SMALL, &nid.hIcon); // 加载shell32.dll中的文件夹图标,尺寸为16x16
 wcscpy_s(nid.szTip, L"My Icon");
 Shell_NotifyIcon(NIM_ADD, &nid);
 }
 void showBalloon()
 {
 wcscpy_s(nid.szInfo, L"This is my balloon.");
 wcscpy_s(nid.szInfoTitle, L"Balloon Title");
 nid.dwInfoFlags = NIIF_INFO; // 气球上的图标
 Shell_NotifyIcon(NIM_MODIFY, &nid);
 }
 void showCursorPosition(HWND hWnd)
 {
 POINT point;
 WCHAR str[50];
 GetCursorPos(&point);
 wsprintf(str, L"Your cursor position was (%d, %d).", point.x, point.y);
 MessageBox(hWnd, str, L"Cursor Position", MB_ICONINFORMATION);
 }
 void showDlg1(HWND hWnd)
 {
 DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dialog1);
 }
 void showTrayMenu(HWND hWnd)
 {
 POINT point;
 HMENU hMenuRoot = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
 HMENU hMenu = GetSubMenu(hMenuRoot, 0);
 GetCursorPos(&point);
 SetMenuDefaultItem(hMenu, 0, TRUE); // 设置加粗的菜单项
 SetForegroundWindow(hWnd); // 鼠标点击菜单以外的区域时,自动关闭菜单
 TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, point.x, point.y, NULL, hWnd, NULL);
 DestroyMenu(hMenuRoot);
 DestroyMenu(hMenu);
 }
 void deleteTrayIcon()
 {
 Shell_NotifyIcon(NIM_DELETE, &nid);
 }
 
 INT_PTR CALLBACK Dialog1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {
 int wmId;
 UNREFERENCED_PARAMETER(lParam);
 switch (message)
 {
 case WM_INITDIALOG:
 Dlg1_Init(hDlg);
 return (INT_PTR)TRUE;
 case WM_COMMAND:
 wmId = LOWORD(wParam);
 switch (wmId)
 {
 case IDOK:
 showCustomTrayMenu(hDlg);
 break;
 case IDCANCEL:
 EndDialog(hDlg, LOWORD(wParam));
 return (INT_PTR)TRUE;
 }
 break;
 }
 return (INT_PTR)FALSE;
 }
 void Dlg1_Init(HWND hDlg)
 {
 LPWSTR *pList = list;
 HWND combo = GetDlgItem(hDlg, IDC_COMBO1);
 while (*pList != NULL)
 {
 ComboBox_AddString(combo, *pList);
 pList++;
 }
 ComboBox_SetCurSel(combo, 0);
 }
 int Dlg1_GetIconFlagId(HWND combo)
 {
 int selection = ComboBox_GetCurSel(combo);
 WCHAR selectionStr[MAX_LOADSTRING];
 int i;
 ComboBox_GetLBText(combo, selection, selectionStr);
 for (i = 0; list[i] != NULL; i++)
 {
 if (wcscmp(list[i], selectionStr) == 0)
 return i;
 }
 return -1;
 }
 void showCustomTrayMenu(HWND hDlg)
 {
 HINSTANCE hShellInst;
 HWND edit1 = GetDlgItem(hDlg, IDC_EDIT1);
 HWND edit2 = GetDlgItem(hDlg, IDC_EDIT2);
 HWND combo = GetDlgItem(hDlg, IDC_COMBO1);
 int id = Dlg1_GetIconFlagId(combo);
 GetWindowText(edit1, nid.szInfoTitle, MAX_STRLEN);
 GetWindowText(edit2, nid.szInfo, MAX_STRLEN);
 if (wcslen(nid.szInfo) == 0) {
 MessageBox(hDlg, L"The content is empty so the balloon cannot open.", L"Error", MB_ICONERROR);
 SetFocus(edit2);
 return;
 }
 nid.dwInfoFlags = iconflags[id];
 if (nid.dwInfoFlags == NIIF_USER) {
 hShellInst = GetModuleHandle(L"shell32.dll");
 LoadIconMetric(hShellInst, MAKEINTRESOURCE(152), LIM_SMALL, &nid.hBalloonIcon);
 }
 Shell_NotifyIcon(NIM_MODIFY, &nid);
 }
 
 |