|
|
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.