一派护法 十九级 |
【主程序文件代码】 // 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); }
|