#include <windows.h> #define IDM_NEW 0 #define IDM_OPEN 1 #define IDM_SAVE 2 #define IDM_SAVEAS 3 #define IDM_PRINT 4 #define IDM_EXIT 5 #define IDM_UNDO 10 #define IDM_CUT 11 #define IDM_COPY 12 #define IDM_PASTE 13 #define IDM_DEL 14 #define IDM_WHITE 20 #define IDM_LTGRAY 21 #define IDM_GRAY 22 #define IDM_BLACK 23 #define IDM_START 30 #define IDM_STOP 31 #define IDM_HELP 40 #define IDM_ABOUT 41 static char szAppName[] = "WinMenu" ; HWND hwnd ; HMENU hMenu,hMenuPopup; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //int AskConfirmation (HWND) ; int main () { //HWND hwnd ; MSG msg ; WNDCLASSEX wndclass ; wndclass.cbSize = sizeof (wndclass) ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = NULL;//hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; RegisterClassEx (&wndclass) ; hMenu = CreateMenu (); hMenuPopup = CreateMenu (); AppendMenu (hMenuPopup, MF_STRING, IDM_NEW, "&New"); AppendMenu (hMenuPopup, MF_STRING, IDM_OPEN, "&Open..."); AppendMenu (hMenuPopup, MF_STRING, IDM_SAVE, "&Save"); AppendMenu (hMenuPopup, MF_STRING, IDM_SAVEAS, "Save &As..."); AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu (hMenuPopup, MF_STRING, IDM_PRINT, "&Print..."); AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu (hMenuPopup, MF_STRING, IDM_EXIT, "E&xit"); AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&File"); hMenuPopup = CreateMenu (); AppendMenu (hMenuPopup, MF_STRING, IDM_UNDO, "&Undo"); AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu (hMenuPopup, MF_STRING, IDM_CUT, "Cu&t"); AppendMenu (hMenuPopup, MF_STRING, IDM_COPY, "&Copy"); AppendMenu (hMenuPopup, MF_STRING, IDM_PASTE, "&Paste"); AppendMenu (hMenuPopup, MF_STRING, IDM_DEL, "De&lete"); AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Edit"); hMenuPopup = CreateMenu (); AppendMenu (hMenuPopup, MF_STRING | MF_CHECKED, IDM_WHITE, "&White"); AppendMenu (hMenuPopup, MF_STRING, IDM_LTGRAY, "&Lt Gray"); AppendMenu (hMenuPopup, MF_STRING, IDM_GRAY, "&Gray"); AppendMenu (hMenuPopup, MF_STRING, IDM_BLACK, "&Black"); AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Background"); hMenuPopup = CreateMenu (); AppendMenu (hMenuPopup, MF_STRING, IDM_START, "&Start"); AppendMenu (hMenuPopup, MF_STRING | MF_GRAYED, IDM_STOP, "S&top"); AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Timer"); hMenuPopup = CreateMenu (); AppendMenu (hMenuPopup, MF_STRING, IDM_HELP, "&Help..."); AppendMenu (hMenuPopup, MF_STRING, IDM_ABOUT, "&About WinMenu..."); AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Help"); hwnd = CreateWindowEx (WS_EX_LEFT, szAppName, // window class name "The WinMenu Program", // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle hMenu, // window menu handle //hInstance, // program instance handle NULL, NULL) ; // creation parameters ShowWindow (hwnd, SW_SHOW) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } int AskConfirmation (HWND hwnd) { return MessageBox (hwnd, "Really want to close PopPad2?", szAppName, MB_YESNO | MB_ICONQUESTION) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static int iColorID[4] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, BLACK_BRUSH } ; static int iSelection = IDM_WHITE ; switch (iMsg) { case WM_COMMAND : switch (LOWORD (wParam)) { case IDM_NEW : case IDM_OPEN : case IDM_SAVE : case IDM_SAVEAS : case IDM_PRINT : MessageBeep (0) ; return 0; case IDM_EXIT : SendMessage (hwnd, WM_CLOSE, 0, 0); return 0; case IDM_UNDO : case IDM_CUT : case IDM_COPY : case IDM_PASTE : case IDM_DEL : MessageBeep (0) ; return 0; case IDM_WHITE : // Note: Logic below assumes case IDM_LTGRAY : // that IDM_WHITE through IDM_BLACK case IDM_GRAY : // are consecutive numbers in case IDM_BLACK : // the order shown here. CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ; iSelection = LOWORD (wParam) ; CheckMenuItem (hMenu, iSelection, MF_CHECKED) ; SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject (iColorID[LOWORD (wParam) - IDM_WHITE])) ; InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case IDM_START : if (SetTimer (hwnd, 1, 1000, NULL)) { EnableMenuItem (hMenu, IDM_START, MF_GRAYED) ; EnableMenuItem (hMenu, IDM_STOP, MF_ENABLED) ; } return 0 ; case IDM_STOP : KillTimer (hwnd, 1) ; EnableMenuItem (hMenu, IDM_START, MF_ENABLED) ; EnableMenuItem (hMenu, IDM_STOP, MF_GRAYED) ; return 0 ; case IDM_HELP : MessageBox (hwnd, "Help not yet implemented!", szAppName, MB_ICONEXCLAMATION | MB_OK) ; return 0 ; case IDM_ABOUT : MessageBox (hwnd, "Menu Demonstration Program.", szAppName, MB_ICONINFORMATION | MB_OK) ; return 0 ; } break ; case WM_TIMER : MessageBeep (0) ; return 0 ; case WM_CLOSE : if (IDYES == AskConfirmation (hwnd)) DestroyWindow (hwnd) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }