(一)菜单和加速键 #include <windows.h> #include "Resource.h" TCHAR szBuffer[128]; TCHAR szClassName[] = TEXT("Menu Example"); TCHAR szCaptionMain[] = TEXT("Menu"); TCHAR szCaption[] = TEXT("菜单选择"); TCHAR szMenuHelp[] = TEXT("帮助主题(&H)"); TCHAR szMenuAbout[] = TEXT("关于本程序(&A)..."); TCHAR szFormat[] = TEXT("您选择了菜单命令: %08x"); HWND hMainWnd; HMENU hMenu; HMENU hSubMenu; HACCEL hAccelerator; VOID DisplayMenuItem(DWORD dwCommandID) { wsprintf(szBuffer, szFormat, dwCommandID); MessageBox(hMainWnd, szBuffer, szCaption, MB_OK); } VOID Quit() { DestroyWindow(hMainWnd); PostQuitMessage(0); } LRESULT CALLBACK ProcWinMain(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { POINT stPt; HMENU hSysMenu; switch(uMsg) { case WM_CREATE: hSubMenu = GetSubMenu(hMenu, 1); hSysMenu = GetSystemMenu(hWnd, FALSE); AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hSysMenu, 0, IDM_HELP, szMenuHelp); AppendMenu(hSysMenu, 0, IDM_ABOUT, szMenuAbout); return 0; case WM_COMMAND: DisplayMenuItem(wParam); switch(LOWORD(wParam)) { case IDM_EXIT: Quit(); return 0; case IDM_TOOLBAR: case IDM_TOOLBARTEXT: case IDM_INPUTBAR: case IDM_STATUSBAR: if(MF_CHECKED == GetMenuState(hMenu, (UINT)wParam, MF_BYCOMMAND)) { CheckMenuItem(hMenu, (UINT)wParam, MF_UNCHECKED); } else { CheckMenuItem(hMenu, (UINT)wParam, MF_CHECKED); } return 0; case IDM_BIG: case IDM_SMALL: case IDM_LIST: case IDM_DETAIL: CheckMenuRadioItem(hMenu, IDM_BIG, IDM_DETAIL, LOWORD(wParam), MF_BYCOMMAND); return 0; } break; case WM_SYSCOMMAND: switch(LOWORD(wParam)) { case IDM_HELP: case IDM_ABOUT: DisplayMenuItem(wParam); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } break; case WM_RBUTTONDOWN: GetCursorPos(&stPt); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, stPt.x, stPt.y, 0, hMainWnd, NULL); return 0; case WM_CLOSE: Quit(); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { WNDCLASSEX stWndCls; MSG stMsg; RtlZeroMemory(&stWndCls, sizeof(stWndCls)); stWndCls.hCursor = LoadCursor(NULL, IDC_ARROW); stWndCls.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); stWndCls.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); stWndCls.cbWndExtra = 0; stWndCls.cbClsExtra = 0; stWndCls.hInstance = hInstance; stWndCls.cbSize = sizeof(WNDCLASSEX); stWndCls.style = CS_HREDRAW | CS_VREDRAW; stWndCls.lpfnWndProc = ProcWinMain; stWndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); stWndCls.lpszClassName = szClassName; stWndCls.lpszMenuName = NULL; RegisterClassEx(&stWndCls); hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDM_MAIN)); hAccelerator = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDA_ACCELERATOR)); hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, szCaptionMain, WS_OVERLAPPEDWINDOW, 100, 100, 600, 400, NULL, hMenu, hInstance, NULL); ShowWindow(hMainWnd, SW_SHOWNORMAL); UpdateWindow(hMainWnd); while(GetMessage(&stMsg, NULL, 0, 0)) { if(0 == TranslateAccelerator(hMainWnd, hAccelerator, &stMsg)) { TranslateMessage(&stMsg); DispatchMessage(&stMsg); } } return stMsg.wParam; }