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