首先建立一个win32项目后,点击资源视图,右键项目名-添加-资源,选中Menu,新建 之后就可以添加菜单选项了 这是制作的菜单的效果 添加好资源后,就可以编写代码了,记得包好”resource.h”
# include<windows.h> # include"resource.h" # define ID_TIMER 1 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT("MenuDemo"); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int iCmdShow ) { WNDCLASS wndclass; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = szAppName; wndclass.lpszMenuName = (LPCWSTR)IDR_MENU1;//IDR_MENU1是生成的菜单资 //源的句柄 wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass))//注册窗口类 { MessageBox(NULL, TEXT("Program requires windows NT!"), szAppName, MB_ICONERROR); return 0; } HWND hwnd; hwnd = CreateWindow(szAppName, TEXT("Menu Demonstrator"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static int idColor[5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH };//注意resource.h里5种颜色的宏要连续 static int iSelection = IDM_BKGND_GRAY; HMENU hMenu; switch (uMsg) { case WM_COMMAND: hMenu = GetMenu(hwnd); switch (LOWORD(wParam))//wParam的低位字对应菜单ID { case IDM_FILE_NEW: case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0);//只是为了演示,所以只是发出蜂鸣声 return 0; case IDM_APP_EXIT: SendMessage(hwnd, WM_CLOSE, 0, 0); return 0; case IDM_EDIT_UNDO: case IDM_EDIT_CUT: case IDM_EDIT_COPY: case IDM_EDIT_PASTE: case IDM_EDIT_CLEAR: MessageBeep(0); return 0; case IDM_BKGND_WHITE: //Note: Logic below case IDM_BKGND_LTGRAY: //assumes that IDM_WHITE case IDM_BKGND_GRAY: //through IDM_BLACK are case IDM_BKGND_DKGRAY: //consecutive(adj. 连贯的;连续不断的) numbers in case IDM_BKGND_BLACK: //the order shown here CheckMenuItem(hMenu, iSelection, MF_UNCHECKED); iSelection = LOWORD(wParam); CheckMenuItem(hMenu, iSelection, MF_CHECKED); SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (idColor[LOWORD(wParam) - IDM_BKGND_WHITE])); InvalidateRect(hwnd, NULL, TRUE); return 0; case IDM_TIMER_START: if (SetTimer(hwnd, ID_TIMER, 1000, NULL)) { EnableMenuItem(hMenu, IDM_TIMER_START, MF_GRAYED); EnableMenuItem(hMenu, IDM_TIMER_STOP, MF_ENABLED); } return 0; case IDM_TIMER_STOP: KillTimer(hwnd, ID_TIMER); EnableMenuItem(hMenu, IDM_TIMER_START, MF_ENABLED); EnableMenuItem(hMenu, IDM_TIMER_STOP, MF_GRAYED); return 0; case IDM_APP_HELP: MessageBox(hwnd, TEXT("Help not yet implemented(实施;执行adj.应用的)!"), szAppName, MB_ICONEXCLAMATION | MB_OK); return 0; case IDM_APP_ABOUT: MessageBox(hwnd, TEXT("Menu Demonstration Program\n") TEXT("(c)Charles Petzold,1998"), szAppName, MB_ICONINFORMATION | MB_OK); return 0; } break; case WM_TIMER: MessageBeep(0); return 0; case WM_CLOSE: PostQuitMessage(0); //DestroyWindow(hwnd); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }