|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: /*************************************************************************** ! 13: * * ! 14: * PROGRAM : Menu.c * ! 15: * * ! 16: * PURPOSE : To give a demonstration of the use of popup menus, user * ! 17: * defined menus and menu functions. * ! 18: * * ! 19: * FUNCTIONS : WinMain() - Calls the initialization function * ! 20: * and enters the message loop. * ! 21: * * ! 22: * MenuInit() - Registers the app. window class. * ! 23: * * ! 24: * About() - Dialog function for the About.. * ! 25: * dialog. * ! 26: * * ! 27: * ShrinkBitmap() - Shrinks a 64x64 bitmap to a size * ! 28: * useable for a user-defined menu * ! 29: * checkmark. * ! 30: * * ! 31: * HandleCreate() - Creates a new menu and appends it * ! 32: * to the main menu * ! 33: * * ! 34: * HandlePaint() - Handles repainting the app's client* ! 35: * area * ! 36: * * ! 37: * HandleChangeColors()- Changes the state of the "colors" * ! 38: * menu item. * ! 39: * * ! 40: * HandleDrawItem() - Redraws the menu items in the * ! 41: * "colors" menu * ! 42: * * ! 43: * HandlePopupMenu() - handles display of the "floating" * ! 44: * popup. * ! 45: * * ! 46: * MenuWndProc() - Window function for the app. * ! 47: * * ! 48: * * ! 49: ***************************************************************************/ ! 50: #include "windows.h" ! 51: #include "menu.h" ! 52: ! 53: ! 54: HANDLE hInst; ! 55: HMENU hBigMenu; ! 56: HBITMAP hbmCheckOn; ! 57: HBITMAP hbmCheckOff; ! 58: ! 59: /**************************************************************************** ! 60: * * ! 61: * FUNCTION : WinMain(HANDLE, HANDLE, LPSTR, int) * ! 62: * * ! 63: * PURPOSE : Creates the main app. window, calls an initialization * ! 64: * function and enters the message loop. * ! 65: * * ! 66: ****************************************************************************/ ! 67: int APIENTRY WinMain( ! 68: HANDLE hInstance, ! 69: HANDLE hPrevInstance, ! 70: LPSTR lpCmdLine, ! 71: int nCmdShow ! 72: ) ! 73: { ! 74: ! 75: HWND hWnd; ! 76: MSG msg; /* message */ ! 77: ! 78: UNREFERENCED_PARAMETER( lpCmdLine ); ! 79: ! 80: /* Register main window class if this is the first instance of the app. */ ! 81: if (!hPrevInstance) ! 82: if (!MenuInit (hInstance)) ! 83: return 0; ! 84: ! 85: hInst = hInstance; ! 86: ! 87: /* Create the app. window */ ! 88: hWnd = CreateWindow ("menu", ! 89: "Menu Example", ! 90: WS_OVERLAPPEDWINDOW, ! 91: CW_USEDEFAULT, ! 92: CW_USEDEFAULT, ! 93: CW_USEDEFAULT, ! 94: CW_USEDEFAULT, ! 95: (HWND) NULL, ! 96: NULL, ! 97: hInstance, ! 98: (LPSTR) NULL); ! 99: ! 100: if (!hWnd) ! 101: return 0; ! 102: ! 103: ShowWindow (hWnd, nCmdShow); ! 104: UpdateWindow (hWnd); ! 105: ! 106: while (GetMessage (&msg, NULL, 0, 0)){ ! 107: /* Since we have no accelerators, no need to call ! 108: * TranslateAccelerator here. ! 109: */ ! 110: TranslateMessage (&msg); ! 111: DispatchMessage (&msg); ! 112: } ! 113: return(msg.wParam); ! 114: } ! 115: ! 116: ! 117: /**************************************************************************** ! 118: * * ! 119: * FUNCTION : MenuInit (hInstance) * ! 120: * * ! 121: * PURPOSE : Registers the main window class. * ! 122: * * ! 123: * RETURNS : TRUE - if RegisterClass() went off ok * ! 124: * FALSE - otherwise. * ! 125: * * ! 126: ****************************************************************************/ ! 127: BOOL NEAR PASCAL MenuInit (HANDLE hInstance) ! 128: { ! 129: HANDLE hMemory; ! 130: PWNDCLASS pWndClass; ! 131: BOOL bSuccess; ! 132: ! 133: /* Initialize the menu window class */ ! 134: hMemory = LocalAlloc(LPTR, sizeof(WNDCLASS)); ! 135: if(!hMemory){ ! 136: MessageBox(NULL, "<MenuInit> Not enough memory.", NULL, MB_OK | MB_ICONHAND); ! 137: return(FALSE); ! 138: } ! 139: ! 140: pWndClass = (PWNDCLASS) LocalLock(hMemory); ! 141: ! 142: pWndClass->style = 0; ! 143: pWndClass->lpfnWndProc = (WNDPROC) MenuWndProc; ! 144: pWndClass->hInstance = hInstance; ! 145: pWndClass->hIcon = LoadIcon (hInstance, "menu"); ! 146: pWndClass->hCursor = LoadCursor (NULL, IDC_ARROW); ! 147: pWndClass->hbrBackground = GetStockObject (WHITE_BRUSH); ! 148: pWndClass->lpszMenuName = (LPSTR) "MenuMenu", ! 149: pWndClass->lpszClassName = (LPSTR) "menu"; ! 150: ! 151: bSuccess = RegisterClass (pWndClass); ! 152: LocalUnlock (hMemory); ! 153: LocalFree (hMemory); ! 154: ! 155: return bSuccess; ! 156: } ! 157: ! 158: ! 159: /**************************************************************************** ! 160: * * ! 161: * FUNCTION : About (hDlg, message, wParam, lParam) * ! 162: * * ! 163: * PURPOSE : Dialog function for the About menu... dialog. * ! 164: * * ! 165: ****************************************************************************/ ! 166: BOOL APIENTRY About( ! 167: HWND hDlg, ! 168: UINT message, ! 169: UINT wParam, ! 170: LONG lParam) ! 171: ! 172: { ! 173: switch (message){ ! 174: case WM_INITDIALOG: ! 175: return(TRUE); ! 176: ! 177: case WM_COMMAND: ! 178: // LOWORD added for portability ! 179: if (LOWORD(wParam) == IDOK){ ! 180: EndDialog(hDlg,0); ! 181: return(TRUE); ! 182: } ! 183: break; ! 184: } ! 185: return(FALSE); ! 186: UNREFERENCED_PARAMETER(lParam); ! 187: } ! 188: ! 189: ! 190: /**************************************************************************** ! 191: * * ! 192: * FUNCTION : ShrinkBitmap(hwnd, hbm) * ! 193: * * ! 194: * PURPOSE : This function shrinks a 64x64 bitmap into a bitmap useable * ! 195: * for the user-defined checkmark for menu items. This can be * ! 196: * easily generalized to shrink bitmaps of any size. * ! 197: * * ! 198: * RETURNS : HBITMAP - A handle to the new bitmap. * ! 199: * * ! 200: ****************************************************************************/ ! 201: HBITMAP APIENTRY ShrinkBitmap ( ! 202: HWND hwnd, ! 203: HBITMAP hbm) ! 204: { ! 205: HDC hdc; ! 206: HDC hmemorydcNew; ! 207: HDC hmemorydcOld; ! 208: LONG checkMarkSize; ! 209: HBITMAP hCheckBitmap; ! 210: HBITMAP hOldBitmapSave; ! 211: HBITMAP hNewBitmapSave; ! 212: ! 213: hdc = GetDC (hwnd); ! 214: ! 215: /* Create DCs for the source (old) and target (new) bitmaps */ ! 216: hmemorydcNew = CreateCompatibleDC (hdc); ! 217: hmemorydcOld = CreateCompatibleDC (hdc); ! 218: ! 219: /* Determine the dimensions of the default menu checkmark and ! 220: * create a target bitmap of the same dimensions ! 221: */ ! 222: checkMarkSize = GetMenuCheckMarkDimensions (); ! 223: hCheckBitmap = CreateCompatibleBitmap (hdc, ! 224: LOWORD (checkMarkSize), ! 225: HIWORD (checkMarkSize)); ! 226: ! 227: /* Select the source bitmap and the target bitmap into their ! 228: * respective DCs. ! 229: */ ! 230: hOldBitmapSave = SelectObject (hmemorydcNew, hCheckBitmap); ! 231: hNewBitmapSave = SelectObject (hmemorydcOld, hbm); ! 232: ! 233: /* Shrink the source bitmap into the target DC */ ! 234: StretchBlt (hmemorydcNew, ! 235: 0, ! 236: 0, ! 237: LOWORD(checkMarkSize), ! 238: HIWORD(checkMarkSize), ! 239: hmemorydcOld, ! 240: 0, ! 241: 0, ! 242: 64, ! 243: 64, ! 244: SRCCOPY); ! 245: ! 246: /* De-select the bitmaps and clean up .. */ ! 247: SelectObject (hmemorydcNew, hOldBitmapSave); ! 248: SelectObject (hmemorydcOld, hNewBitmapSave); ! 249: DeleteDC (hmemorydcNew); ! 250: DeleteDC (hmemorydcOld); ! 251: ReleaseDC (hwnd, hdc); ! 252: ! 253: /* .. and return a handle to the target bitmap */ ! 254: return hCheckBitmap; ! 255: } ! 256: ! 257: ! 258: /**************************************************************************** ! 259: * * ! 260: * FUNCTION : HandleCreate ( hwnd ) * ! 261: * * ! 262: * PURPOSE : Creates a new (empty) menu and appends to it the "State" * ! 263: * menu items. It sets up the user-defined checkmarks for the * ! 264: * menu. It then inserts this menu into the main menu bar. * ! 265: * * ! 266: ****************************************************************************/ ! 267: VOID APIENTRY HandleCreate (HWND hwnd) ! 268: { ! 269: HMENU hMenu; ! 270: HMENU hWndMenu; ! 271: ! 272: /* Create a new menu into the menubar on the fly */ ! 273: hMenu = CreateMenu (); ! 274: if (!hMenu) ! 275: return; ! 276: ! 277: /* Append the state menu items to it */ ! 278: AppendMenu (hMenu, MF_STRING, IDM_STATE1, "South Dakota"); ! 279: AppendMenu (hMenu, MF_STRING, IDM_STATE2, "Washington"); ! 280: AppendMenu (hMenu, MF_STRING, IDM_STATE3, "California"); ! 281: if (!AppendMenu (hMenu, MF_STRING, IDM_STATE4, "Oregon")){ ! 282: /* It is unlikely the other appends will fail and this will succeed. ! 283: * So just check this one. And if it fails, Destroy the menu for ! 284: * good measure and return. ! 285: */ ! 286: DestroyMenu(hMenu); ! 287: return; ! 288: } ! 289: hbmCheckOn = ShrinkBitmap (hwnd, LoadBitmap (hInst, "checkon")); ! 290: hbmCheckOff = ShrinkBitmap (hwnd, LoadBitmap (hInst, "checkoff")); ! 291: ! 292: /* Set up the user-defined check marks */ ! 293: SetMenuItemBitmaps (hMenu, 0, MF_BYPOSITION, hbmCheckOff, hbmCheckOn); ! 294: SetMenuItemBitmaps (hMenu, 1, MF_BYPOSITION, hbmCheckOff, hbmCheckOn); ! 295: SetMenuItemBitmaps (hMenu, 2, MF_BYPOSITION, hbmCheckOff, hbmCheckOn); ! 296: SetMenuItemBitmaps (hMenu, 3, MF_BYPOSITION, hbmCheckOff, hbmCheckOn); ! 297: ! 298: /* Now insert the menu into the main menu bar. */ ! 299: hWndMenu = GetMenu (hwnd); ! 300: InsertMenu (hWndMenu, 2, MF_POPUP|MF_BYPOSITION, (DWORD)hMenu, "States"); ! 301: ! 302: return; ! 303: } ! 304: ! 305: /**************************************************************************** ! 306: * * ! 307: * FUNCTION : HandlePaint ( hwnd ) * ! 308: * * ! 309: * PURPOSE : Handles the repainting of the main app's client area. * ! 310: * * ! 311: ****************************************************************************/ ! 312: VOID APIENTRY HandlePaint (HWND hwnd) ! 313: { ! 314: HDC hdc; ! 315: PAINTSTRUCT ps; ! 316: RECT rc; ! 317: ! 318: hdc = BeginPaint (hwnd, (LPPAINTSTRUCT)&ps); ! 319: ! 320: /* Center the text in the client area */ ! 321: GetClientRect (hwnd, (LPRECT)&rc); ! 322: DrawText (hdc, ! 323: "Down click in the window for a popup menu", ! 324: 41, ! 325: (LPRECT)&rc, ! 326: DT_CENTER | DT_WORDBREAK); ! 327: EndPaint(hwnd, (LPPAINTSTRUCT)&ps); ! 328: } ! 329: ! 330: ! 331: /**************************************************************************** ! 332: * * ! 333: * FUNCTION : HandleChangeColors (hwnd) * ! 334: * * ! 335: * PURPOSE : Toggles the state of the Owner Draw item in the Colors * ! 336: * menu. If it is on, the "Black", "Blue", "Red", and "Green" * ! 337: * individual menu text items are modified so that they will * ! 338: * contain bands of color. Otherwise, the colors are replaced * ! 339: * by the text. * ! 340: * * ! 341: ****************************************************************************/ ! 342: VOID APIENTRY HandleChangeColors(HWND hwnd) ! 343: { ! 344: HMENU hMenu; ! 345: BOOL fOwnerDraw; ! 346: ! 347: /* Get a handle to the Colors menu. This is at position 1. */ ! 348: hMenu = GetSubMenu (GetMenu (hwnd), IDCOLORS_POS); ! 349: ! 350: /* Get the current state of the item */ ! 351: fOwnerDraw = GetMenuState ( hMenu, ! 352: IDM_COLOROWNERDR, MF_BYCOMMAND) & MF_CHECKED; ! 353: ! 354: /* Toggle the state of the item. */ ! 355: CheckMenuItem ( hMenu, ! 356: IDM_COLOROWNERDR, ! 357: MF_BYCOMMAND | (fOwnerDraw ? MF_UNCHECKED : MF_CHECKED)); ! 358: ! 359: if (!fOwnerDraw){ ! 360: /* Change the items to owner-draw items. Pass the RGB value for the ! 361: * color as the application-supplied data. This makes it easier for ! 362: * us to draw the items. ! 363: */ ! 364: ModifyMenu(hMenu, ! 365: IDM_BLACK, ! 366: MF_OWNERDRAW | MF_BYCOMMAND, ! 367: IDM_BLACK, ! 368: (LPSTR)RGB (0,0,0)); ! 369: ! 370: ModifyMenu(hMenu, ! 371: IDM_BLUE, ! 372: MF_OWNERDRAW | MF_BYCOMMAND, ! 373: IDM_BLUE, ! 374: (LPSTR)RGB (0,0,255)); ! 375: ! 376: ModifyMenu(hMenu, ! 377: IDM_RED, ! 378: MF_OWNERDRAW | MF_BYCOMMAND, ! 379: IDM_RED, ! 380: (LPSTR)RGB (255,0,0)); ! 381: ! 382: ModifyMenu(hMenu, ! 383: IDM_GREEN, ! 384: MF_OWNERDRAW | MF_BYCOMMAND, ! 385: IDM_GREEN, ! 386: (LPSTR)RGB (0,255,0)); ! 387: } ! 388: else { ! 389: /* Change the items to normal text items. */ ! 390: ModifyMenu(hMenu, IDM_BLACK, MF_BYCOMMAND, IDM_BLACK, "Black"); ! 391: ! 392: ModifyMenu(hMenu, IDM_BLUE, MF_BYCOMMAND, IDM_BLUE, "Blue"); ! 393: ! 394: ModifyMenu(hMenu, IDM_RED, MF_BYCOMMAND, IDM_RED, "Red"); ! 395: ! 396: ModifyMenu(hMenu, IDM_GREEN, MF_BYCOMMAND, IDM_GREEN, "Green"); ! 397: } ! 398: } ! 399: ! 400: ! 401: /**************************************************************************** ! 402: * * ! 403: * FUNCTION : HandleDrawItem ( hwnd, lpdis) * ! 404: * * ! 405: * PURPOSE : Called in response to a WM_DRAWITEM message, i.e. when the * ! 406: * colors menu is being modified to an owner-draw menu, or * ! 407: * one of the items is selected. It sizes the checkmark bitmap* ! 408: * to fit next to a color band and draws the color bands and * ! 409: * the checkmark on the popup menu. * ! 410: * * ! 411: ****************************************************************************/ ! 412: VOID APIENTRY HandleDrawItem( ! 413: HWND hwnd, ! 414: LPDRAWITEMSTRUCT lpdis) ! 415: ! 416: { ! 417: HDC hdcBitmap; ! 418: HBITMAP hbmSave; ! 419: HBRUSH hbr; ! 420: RECT rc; ! 421: LONG checkMarkSize; ! 422: DWORD textColorSave; ! 423: DWORD bkColorSave; ! 424: ! 425: /* Get the size of the checkmark so we can leave room for it since we ! 426: * want to be able to check the selected color. ! 427: */ ! 428: checkMarkSize = GetMenuCheckMarkDimensions (); ! 429: ! 430: if (lpdis->itemAction == ODA_SELECT || ! 431: lpdis->itemAction == ODA_DRAWENTIRE){ ! 432: ! 433: CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem); ! 434: InflateRect ((LPRECT)&rc, (-2 - LOWORD(checkMarkSize)), -2); ! 435: ! 436: if (lpdis->itemState & ODS_SELECTED) ! 437: { ! 438: /* Item has been selected -- hilite with a gray frame */ ! 439: hbr = GetStockObject (GRAY_BRUSH); ! 440: FrameRect (lpdis->hDC, (LPRECT)&rc, hbr); ! 441: } ! 442: else if (lpdis->itemAction == ODA_SELECT) ! 443: { ! 444: /* Item has been de-selected -- remove gray frame */ ! 445: hbr = CreateSolidBrush (GetSysColor (COLOR_MENU)); ! 446: FrameRect (lpdis->hDC, (LPRECT)&rc, hbr); ! 447: DeleteObject (hbr); ! 448: } ! 449: } ! 450: ! 451: if (lpdis->itemAction == ODA_DRAWENTIRE){ ! 452: ! 453: /* Paint the color item in the color requested. */ ! 454: hbr = CreateSolidBrush (lpdis->itemData); ! 455: CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem); ! 456: InflateRect ((LPRECT)&rc, -10-LOWORD(checkMarkSize), -10); ! 457: FillRect (lpdis->hDC, (LPRECT)&rc, hbr); ! 458: DeleteObject (hbr); ! 459: ! 460: if (lpdis->itemState & ODS_CHECKED){ ! 461: /* Draw the check mark if the item is checked. */ ! 462: hdcBitmap = CreateCompatibleDC (lpdis->hDC); ! 463: hbmSave = SelectObject (hdcBitmap, hbmCheckOn); ! 464: ! 465: textColorSave = SetTextColor (lpdis->hDC, 0x00000000L); ! 466: bkColorSave = SetBkColor (lpdis->hDC, 0x00FFFFFFL); ! 467: ! 468: /* Use Magic bitblt op so that monochrome bitmaps preserve ! 469: background and foreground colors. */ ! 470: BitBlt (lpdis->hDC, ! 471: lpdis->rcItem.left, ! 472: lpdis->rcItem.top+ ! 473: (MEASUREITEMHEIGHT - HIWORD (checkMarkSize)) / 2, ! 474: LOWORD (checkMarkSize), ! 475: HIWORD (checkMarkSize), ! 476: hdcBitmap, ! 477: 0, ! 478: 0, ! 479: ROP_PSDPxax); ! 480: ! 481: /* Restore colors and bitmap and clean up */ ! 482: SetTextColor (lpdis->hDC, textColorSave); ! 483: SetBkColor (lpdis->hDC, bkColorSave); ! 484: SelectObject (hdcBitmap, hbmSave); ! 485: DeleteDC (hdcBitmap); ! 486: ! 487: } ! 488: } ! 489: UNREFERENCED_PARAMETER(hwnd); ! 490: } ! 491: ! 492: /**************************************************************************** ! 493: * * ! 494: * FUNCTION : HandlePopupMenu (hwnd, point) * ! 495: * * ! 496: * PURPOSE : Handles the display of the "floating" popup that appears * * ! 497: * on a mouse click in the app's client area. * ! 498: * * ! 499: ****************************************************************************/ ! 500: VOID APIENTRY HandlePopupMenu ( ! 501: HWND hwnd, ! 502: POINT point) ! 503: ! 504: { ! 505: HMENU hMenu; ! 506: HMENU hMenuTrackPopup; ! 507: ! 508: /* Get the menu for the popup from the resource file. */ ! 509: hMenu = LoadMenu (hInst, "PopupMenu"); ! 510: if (!hMenu) ! 511: return; ! 512: ! 513: /* Get the first menu in it which we will use for the call to ! 514: * TrackPopup(). This could also have been created on the fly using ! 515: * CreatePopupMenu and then we could have used InsertMenu() or ! 516: * AppendMenu. ! 517: */ ! 518: hMenuTrackPopup = GetSubMenu (hMenu, 0); ! 519: ! 520: /* Convert the mouse point to screen coordinates since that is what ! 521: * TrackPopup expects. ! 522: */ ! 523: ClientToScreen (hwnd, (LPPOINT)&point); ! 524: ! 525: /* Draw and track the "floating" popup */ ! 526: TrackPopupMenu (hMenuTrackPopup, 0, point.x, point.y, 0, hwnd, NULL); ! 527: ! 528: /* Destroy the menu since were are done with it. */ ! 529: DestroyMenu (hMenu); ! 530: } ! 531: ! 532: /**************************************************************************** ! 533: * * ! 534: * FUNCTION : MenuWndProc (hWnd, message, wParam, lParam) * ! 535: * * ! 536: * PURPOSE : Window function for the main app. window. Processes all the* ! 537: * menu selections and oter messages. * ! 538: * * ! 539: ****************************************************************************/ ! 540: LONG APIENTRY MenuWndProc ( ! 541: HWND hWnd, ! 542: UINT message, ! 543: UINT wParam, ! 544: LONG lParam) ! 545: ! 546: { ! 547: FARPROC lpProc; ! 548: HMENU hMenu; ! 549: RECT rc; ! 550: POINT pt; ! 551: ! 552: ! 553: switch (message){ ! 554: case WM_SYSCOMMAND: ! 555: /* Show the About ... dialog */ ! 556: if (wParam == ID_ABOUT){ ! 557: lpProc = MakeProcInstance ((FARPROC)About, hInst); ! 558: DialogBox (hInst, ! 559: "AboutBox", ! 560: hWnd, ! 561: lpProc); ! 562: ! 563: FreeProcInstance (lpProc); ! 564: break; ! 565: } ! 566: else ! 567: return DefWindowProc (hWnd, message, wParam, lParam); ! 568: ! 569: case WM_COMMAND: ! 570: // LOWORD added for portability ! 571: switch (LOWORD(wParam)){ ! 572: case IDM_EXIT: ! 573: DestroyWindow (hWnd); ! 574: break; ! 575: ! 576: case IDM_ABOUT: ! 577: /* Bring up the About.. dialog box */ ! 578: lpProc = MakeProcInstance ((FARPROC)About, hInst); ! 579: DialogBox (hInst, ! 580: "AboutBox", ! 581: hWnd, ! 582: lpProc); ! 583: ! 584: FreeProcInstance (lpProc); ! 585: break; ! 586: ! 587: case IDM_COLOROWNERDR: ! 588: /* Change colors in color menu depending on state of this ! 589: menu item. */ ! 590: HandleChangeColors (hWnd); ! 591: break; ! 592: ! 593: case IDM_STATE1: ! 594: case IDM_STATE2: ! 595: case IDM_STATE3: ! 596: case IDM_STATE4: ! 597: /* Get a handle to the states menu... */ ! 598: hMenu = GetSubMenu (GetMenu (hWnd), IDSTATES_POS); ! 599: ! 600: /* Uncheck all the items. */ ! 601: CheckMenuItem (hMenu, IDM_STATE1, ! 602: MF_BYCOMMAND | MF_UNCHECKED); ! 603: CheckMenuItem (hMenu, IDM_STATE2, ! 604: MF_BYCOMMAND | MF_UNCHECKED); ! 605: CheckMenuItem (hMenu, IDM_STATE3, ! 606: MF_BYCOMMAND | MF_UNCHECKED); ! 607: CheckMenuItem (hMenu, IDM_STATE4, ! 608: MF_BYCOMMAND | MF_UNCHECKED); ! 609: ! 610: /* ...and just check the selected one.*/ ! 611: CheckMenuItem (hMenu, (WORD)wParam, ! 612: MF_BYCOMMAND | MF_CHECKED); ! 613: break; ! 614: ! 615: case IDM_BLACK: ! 616: case IDM_RED: ! 617: case IDM_BLUE: ! 618: case IDM_GREEN: ! 619: /* Get a handle to the Colors menu. */ ! 620: hMenu = GetSubMenu (GetMenu (hWnd),IDCOLORS_POS); ! 621: ! 622: /* Uncheck all the items. */ ! 623: CheckMenuItem (hMenu, IDM_BLACK, ! 624: MF_BYCOMMAND | MF_UNCHECKED); ! 625: CheckMenuItem (hMenu, IDM_RED, ! 626: MF_BYCOMMAND | MF_UNCHECKED); ! 627: CheckMenuItem (hMenu, IDM_BLUE, ! 628: MF_BYCOMMAND | MF_UNCHECKED); ! 629: CheckMenuItem (hMenu, IDM_GREEN, ! 630: MF_BYCOMMAND | MF_UNCHECKED); ! 631: ! 632: /* ...and just check the selected one.*/ ! 633: CheckMenuItem (hMenu, (WORD)wParam, ! 634: MF_BYCOMMAND | MF_CHECKED); ! 635: break; ! 636: ! 637: case IDM_FONT: ! 638: /* Messages sent to us from TrackPopupMenu when ! 639: * items are selected from the "floating" popups ! 640: */ ! 641: MessageBox (hWnd, ! 642: "A font was selected", ! 643: "Popup Menu Alert", ! 644: MB_APPLMODAL|MB_OK); ! 645: break; ! 646: ! 647: case IDM_SIZE: ! 648: MessageBox (hWnd, ! 649: "A size was selected", ! 650: "Popup Menu Alert", ! 651: MB_APPLMODAL|MB_OK); ! 652: break; ! 653: ! 654: case IDM_STYLE: ! 655: MessageBox (hWnd, ! 656: "A style was selected", ! 657: "Popup Menu Alert", ! 658: MB_APPLMODAL|MB_OK); ! 659: break; ! 660: } ! 661: break; ! 662: ! 663: case WM_SIZE: ! 664: if (lParam){ ! 665: /* If window is being sized to a non zero value... ! 666: * invalidate it's client area. ! 667: */ ! 668: InvalidateRect (hWnd, NULL, TRUE); ! 669: } ! 670: break; ! 671: ! 672: case WM_PAINT: ! 673: HandlePaint (hWnd); ! 674: break; ! 675: ! 676: case WM_MEASUREITEM: ! 677: /* Use the same width for all items. We could examine the item id ! 678: and use different widths/heights for each item. */ ! 679: ((LPMEASUREITEMSTRUCT)lParam)->itemWidth = MEASUREITEMWIDTH; ! 680: ((LPMEASUREITEMSTRUCT)lParam)->itemHeight = MEASUREITEMHEIGHT; ! 681: return TRUE; ! 682: ! 683: case WM_DRAWITEM: ! 684: /* Redraw the "colors" menu in normal/ownerdrawmode */ ! 685: HandleDrawItem (hWnd,(LPDRAWITEMSTRUCT)lParam); ! 686: return TRUE; ! 687: break; ! 688: ! 689: case WM_CREATE: ! 690: /* Create the menu */ ! 691: HandleCreate (hWnd); ! 692: break; ! 693: ! 694: case WM_DESTROY: ! 695: /* Delete the on/off bitmaps so that they don't waste memory. */ ! 696: DeleteObject (hbmCheckOn); ! 697: DeleteObject (hbmCheckOff); ! 698: ! 699: PostQuitMessage (0); ! 700: break; ! 701: ! 702: case WM_LBUTTONDOWN: ! 703: /* Draw the "floating" popup in the app's client area */ ! 704: GetClientRect (hWnd, (LPRECT)&rc); ! 705: ! 706: // Temporary porting macro ! 707: LONG2POINT(lParam, pt); ! 708: if (PtInRect ((LPRECT)&rc, pt)) ! 709: HandlePopupMenu (hWnd, pt); ! 710: break; ! 711: ! 712: default: ! 713: return DefWindowProc(hWnd, message, wParam, lParam); ! 714: } ! 715: return(0); ! 716: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.