|
|
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 : OwnCombo.c *
15: * *
16: * PURPOSE : Illustrates the use of functions and messages for *
17: * combo boxes and owner-draw control styles. *
18: * *
19: * FUNCTIONS : WinMain - Creates the app. window and *
20: * enters the message loop. *
21: * *
22: * OwnComboInit - Registers the main window class *
23: * *
24: * About - Dialog function for the About *
25: * dialog. *
26: * *
27: * OwnComboWndProc - Window function for app. It *
28: * handles the menu selections *
29: * and processes the other window *
30: * messages. *
31: * *
32: * DrawEntireItem - Handles the drawing of a list *
33: * list box or combo box item. *
34: * *
35: * HandleSelectionState - Handles the selecting/deselect- *
36: * ing of a list box or combo box *
37: * item. *
38: * *
39: * HandleFocusState - Handles the getting/losing of *
40: * the input focus by a list box *
41: * *
42: * ListBoxExample - Dialog function for the *
43: * owner-draw list box example. *
44: * *
45: * ComboBoxExample - Dialog function for the text *
46: * combo dialog. *
47: * *
48: * OwnerComboBoxExample - Dialog fubction for the drop- *
49: * down-list combobox with *
50: * ownerdraw. *
51: * *
52: ***************************************************************************/
53: #include "windows.h"
54: #include "owncombo.h"
55:
56: HANDLE hInst;
57:
58: /****************************************************************************
59: * *
60: * FUNCTION : WinMain(HANDLE, HANDLE, LPSTR, int) *
61: * *
62: * PURPOSE : Creates the app. window and enters the message loop. *
63: * *
64: ****************************************************************************/
65:
66: int APIENTRY WinMain(
67: HANDLE hInstance,
68: HANDLE hPrevInstance,
69: LPSTR lpCmdLine,
70: int nCmdShow
71: )
72: {
73:
74: HWND hWnd;
75: MSG msg;
76:
77: UNREFERENCED_PARAMETER( lpCmdLine );
78:
79: if (!hPrevInstance)
80: if (!OwnComboInit (hInstance))
81: return (0);
82:
83: hInst = hInstance;
84:
85: /* Create the app. window */
86: hWnd = CreateWindow ("owncombo",
87: "Owner-draw & Combo Box Example",
88: WS_OVERLAPPEDWINDOW,
89: CW_USEDEFAULT,
90: CW_USEDEFAULT,
91: CW_USEDEFAULT,
92: CW_USEDEFAULT,
93: (HWND) NULL,
94: NULL,
95: hInstance,
96: (LPSTR) NULL);
97:
98: if (!hWnd)
99: return (0);
100:
101: ShowWindow (hWnd, nCmdShow);
102:
103: while (GetMessage (&msg, NULL, 0, 0)){
104: TranslateMessage (&msg);
105: DispatchMessage (&msg);
106: }
107:
108: return(msg.wParam);
109: }
110:
111:
112: /****************************************************************************
113: * *
114: * FUNCTION : OwnComboInit (hInstance) *
115: * *
116: * PURPOSE : Registers the main window class. *
117: * *
118: * RETURNS : TRUE - if RegisterClass () succeeds. *
119: * FALSE - if RegisterClass () fails. *
120: * *
121: ****************************************************************************/
122: BOOL NEAR PASCAL OwnComboInit (HANDLE hInstance)
123: {
124: HANDLE hMemory;
125: PWNDCLASS pWndClass;
126: BOOL bSuccess;
127:
128: /* Allocate for and fill class structure. */
129: hMemory = LocalAlloc (LPTR, sizeof (WNDCLASS));
130: if(!hMemory){
131: MessageBox(NULL, "<OwnComboInit> Not enough memory.", NULL, MB_OK | MB_ICONHAND);
132: return(FALSE);
133: }
134:
135: pWndClass = (PWNDCLASS) LocalLock (hMemory);
136:
137: pWndClass->style = 0;
138: pWndClass->lpfnWndProc = (WNDPROC) OwnComboWndProc;
139: pWndClass->hInstance = hInstance;
140: pWndClass->hIcon = LoadIcon (hInstance, "owncombo");
141: pWndClass->hCursor = LoadCursor (NULL, IDC_ARROW);
142: pWndClass->hbrBackground = GetStockObject (WHITE_BRUSH);
143: pWndClass->lpszMenuName = (LPSTR) "OwnComboMenu",
144: pWndClass->lpszClassName = (LPSTR) "owncombo";
145:
146: bSuccess = RegisterClass (pWndClass);
147: LocalUnlock (hMemory);
148: LocalFree (hMemory);
149:
150: return (bSuccess);
151: }
152:
153: /****************************************************************************
154: * *
155: * FUNCTION : About (hDlg,message, wParam, lParam) *
156: * *
157: * PURPOSE : Dialog function for the About... dialog. *
158: * *
159: ****************************************************************************/
160: BOOL APIENTRY About (
161: HWND hDlg,
162: UINT message,
163: UINT wParam,
164: LONG lParam)
165: {
166:
167: UNREFERENCED_PARAMETER(lParam);
168: switch (message){
169: case WM_INITDIALOG:
170: return(TRUE);
171:
172: case WM_COMMAND:
173: if (LOWORD(wParam) == IDOK){
174: EndDialog (hDlg,0);
175: return(FALSE);
176: }
177: break;
178:
179: default:
180: break;
181: }
182: return(FALSE);
183: }
184:
185:
186: /****************************************************************************
187: * *
188: * FUNCTION : OwnComboWndProc(hWnd, message, wParam, lParam) *
189: * *
190: * PURPOSE : Window function for the app. It handles menu selections *
191: * and processes window WM_ messages. *
192: * *
193: ****************************************************************************/
194: LONG APIENTRY OwnComboWndProc (
195: HWND hWnd,
196: UINT message,
197: UINT wParam,
198: LONG lParam)
199: {
200: FARPROC lpProc;
201:
202: switch (message){
203: case WM_COMMAND:
204: switch (LOWORD(wParam)){
205: case IDM_EXIT:
206: DestroyWindow (hWnd);
207: break;
208:
209: case IDM_ABOUT:
210: /* Bring up the about box */
211: lpProc = MakeProcInstance ((FARPROC)About, hInst);
212: DialogBox (hInst,
213: "AboutBox",
214: hWnd,
215: lpProc);
216:
217: FreeProcInstance (lpProc);
218: break;
219:
220: case IDM_LISTBOX:
221: /* Bring up the list box example */
222: lpProc = MakeProcInstance ((FARPROC)ListBoxExample, hInst);
223: DialogBox (hInst,
224: "ListBoxDialog",
225: hWnd,
226: lpProc);
227: FreeProcInstance (lpProc);
228: break;
229:
230: case IDM_MULTILISTBOX:
231: /* Bring up the multiple selection list box example */
232: lpProc = MakeProcInstance ((FARPROC)ListBoxExample, hInst);
233: DialogBox (hInst,
234: "MultiListBoxDialog",
235: hWnd,
236: lpProc);
237: FreeProcInstance (lpProc);
238: break;
239:
240: case IDM_COMBOBOX:
241: /* Bring up the combo box example */
242: lpProc = MakeProcInstance ((FARPROC)ComboBoxExample, hInst);
243: DialogBox (hInst,
244: "ComboBoxDialog",
245: hWnd,
246: lpProc);
247: FreeProcInstance (lpProc);
248: break;
249:
250: case IDM_OWNERCOMBOBOX:
251: /* Bring up the owner-draw dropdown list box example */
252: lpProc = MakeProcInstance ((FARPROC)OwnerComboBoxExample, hInst);
253: DialogBox (hInst,
254: "OwnerComboBoxDialog",
255: hWnd,
256: lpProc);
257: FreeProcInstance (lpProc);
258: break;
259: }
260: break;
261:
262: case WM_DESTROY:
263: PostQuitMessage (0);
264: break;
265:
266: default:
267: return(DefWindowProc(hWnd, message, wParam, lParam));
268: }
269: return(0);
270: }
271:
272: /****************************************************************************
273: * *
274: * FUNCTION : HandleSelectionState(LPDRAWITEMSTRUCT, int) *
275: * *
276: * PURPOSE : Handles a change in an item selection state. If an item is *
277: * selected, a black rectangular frame is drawn around that *
278: * item; if an item is de-selected, the frame is removed. *
279: * *
280: * COMMENT : The black selection frame is slightly larger than the gray *
281: * focus frame so they won't paint over each other. *
282: * *
283: ****************************************************************************/
284: VOID APIENTRY HandleSelectionState(
285: LPDRAWITEMSTRUCT lpdis,
286: INT inflate)
287: {
288: RECT rc;
289: HBRUSH hbr;
290:
291: /* Resize rectangle to place selection frame outside of the focus
292: * frame and the item.
293: */
294: CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem);
295: InflateRect ((LPRECT)&rc, inflate, inflate);
296:
297: if (lpdis->itemState & ODS_SELECTED)
298: {
299: /* selecting item -- paint a black frame */
300: hbr = GetStockObject(BLACK_BRUSH);
301: }
302: else
303: {
304: /* de-selecting item -- remove frame */
305: hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
306: }
307: FrameRect(lpdis->hDC, (LPRECT)&rc, hbr);
308: DeleteObject (hbr);
309: }
310:
311: /****************************************************************************
312: * *
313: * FUNCTION : HandleFocusState(LPDRAWITEMSTRUCT, int) *
314: * *
315: * PURPOSE : Handle a change in item focus state. If an item gains the *
316: * input focus, a gray rectangular frame is drawn around that *
317: * item; if an item loses the input focus, the gray frame is *
318: * removed. *
319: * *
320: * COMMENT : The gray focus frame is slightly smaller than the black *
321: * selection frame so they won't paint over each other. *
322: * *
323: ****************************************************************************/
324: VOID APIENTRY HandleFocusState(
325: LPDRAWITEMSTRUCT lpdis,
326: INT inflate)
327: {
328: RECT rc;
329: HBRUSH hbr;
330:
331: /* Resize rectangle to place focus frame between the selection
332: * frame and the item.
333: */
334: CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem);
335: InflateRect ((LPRECT)&rc, inflate, inflate);
336:
337: if (lpdis->itemState & ODS_FOCUS)
338: {
339: /* gaining input focus -- paint a gray frame */
340: hbr = GetStockObject(GRAY_BRUSH);
341: }
342: else
343: {
344: /* losing input focus -- remove (paint over) frame */
345: hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
346: }
347: FrameRect(lpdis->hDC, (LPRECT)&rc, hbr);
348: DeleteObject (hbr);
349: }
350:
351: /****************************************************************************
352: * *
353: * FUNCTION : DrawEntireItem(LPDRAWITEMSTRUCT, int) *
354: * *
355: * PURPOSE : Draws an item and frames it with a selection frame and/or *
356: * a focus frame when appropriate. *
357: * *
358: ****************************************************************************/
359: VOID APIENTRY DrawEntireItem(
360: LPDRAWITEMSTRUCT lpdis,
361: INT inflate)
362: {
363: RECT rc;
364: HBRUSH hbr;
365:
366: /* Resize rectangle to leave space for frames */
367: CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem);
368: InflateRect ((LPRECT)&rc, inflate, inflate);
369:
370: /* Create a brush using the value in the item data field (this value
371: * was initialized when we added the item to the list/combo box using
372: * LB_ADDSTRING/CB_ADDSTRING) and draw the color in the list/combo box.
373: */
374: hbr = CreateSolidBrush (lpdis->itemData);
375: FillRect (lpdis->hDC, (LPRECT)&rc, hbr);
376: DeleteObject (hbr);
377:
378: /* Draw or erase appropriate frames */
379: HandleSelectionState(lpdis, inflate + 4);
380: HandleFocusState(lpdis, inflate + 2);
381: }
382:
383: /****************************************************************************
384: * *
385: * FUNCTION : ListBoxExample (hDlg, message, wParam, lParam) *
386: * *
387: * PURPOSE : Dialog function for the owner-draw list box example. *
388: * It sets up the example dialog with the owner-draw list box,*
389: * adds the colors to the list box, and handles setting the *
390: * selection and focus for the items. *
391: * *
392: ****************************************************************************/
393: BOOL APIENTRY ListBoxExample (
394: HWND hDlg,
395: UINT message,
396: UINT wParam,
397: LONG lParam)
398: {
399: LPDRAWITEMSTRUCT lpdis;
400: LPMEASUREITEMSTRUCT lpmis;
401:
402: /* Vars for WM_DRAWITEM */
403:
404: switch (message){
405: case WM_COMMAND:
406: switch (LOWORD(wParam)){
407: case IDOK:
408: EndDialog (hDlg, 0);
409: return (TRUE);
410: break;
411:
412: /* Clicking any of these buttons adds the corresponding color
413: * to the list box. The application-supplied data is the RGB
414: * value for the color to be drawn in the listbox.
415: */
416: case ID_BLACK:
417: SendMessage (GetDlgItem (hDlg, ID_LISTBOX),
418: LB_ADDSTRING,
419: 0,
420: RGB (0,0,0));
421: return(TRUE);
422: break;
423: case ID_RED:
424: SendMessage (GetDlgItem (hDlg, ID_LISTBOX),
425: LB_ADDSTRING,
426: 0,
427: RGB (255,0,0));
428: return(TRUE);
429: break;
430:
431: case ID_BLUE:
432: SendMessage (GetDlgItem (hDlg, ID_LISTBOX),
433: LB_ADDSTRING,
434: 0,
435: RGB (0,0,255));
436: return(TRUE);
437: break;
438:
439: case ID_GREEN:
440: SendMessage (GetDlgItem (hDlg, ID_LISTBOX),
441: LB_ADDSTRING,
442: 0,
443: RGB (0,255,0));
444: return(TRUE);
445: break;
446:
447: default:
448: return(FALSE);
449: break;
450: }
451:
452: case WM_DRAWITEM:
453: /* Get pointer to the DRAWITEMSTRUCT */
454: lpdis = (LPDRAWITEMSTRUCT)lParam;
455:
456: if (lpdis->itemID == -1)
457: {
458: /* We have a request to draw an item in the list box, yet there
459: * are no list box items. This is sent when the user TABS into
460: * an empty list box or an empty list box gets the focus. We
461: * have to indicate (somehow) that this owner-draw list box has
462: * the focus. We do it in response to this message. Note that
463: * lpdis->itemData field would be invalid in this instance so
464: * we can't allow it to fall into our standard routines.
465: */
466: HandleFocusState(lpdis, -5);
467: }
468: else
469: {
470: switch (lpdis->itemAction)
471: {
472: case ODA_DRAWENTIRE:
473: DrawEntireItem(lpdis, -7);
474: break;
475:
476: case ODA_SELECT:
477: HandleSelectionState(lpdis, -3);
478: break;
479:
480: case ODA_FOCUS:
481: HandleFocusState(lpdis, -5);
482: break;
483: }
484: }
485:
486: /* Return TRUE meaning that we processed this message. */
487: return(TRUE);
488: break;
489:
490: case WM_MEASUREITEM:
491: lpmis = (LPMEASUREITEMSTRUCT)lParam;
492:
493: /* All the items are the same height since the list box style is
494: * LBS_OWNERDRAWFIXED
495: */
496: lpmis->itemHeight = 30;
497: break;
498:
499: case WM_CLOSE:
500: EndDialog(hDlg, 0);
501: return(TRUE);
502: break;
503:
504: default:
505: return(FALSE);
506: }
507:
508: return(TRUE);
509: }
510:
511: /****************************************************************************
512: * *
513: * FUNCTION : ComboBoxExample(hWnd, message, wParam, lParam) *
514: * *
515: * PURPOSE : Dialog function for the text combo dialog. The push buttons*
516: * send various messages to the combo box and the edit control*
517: * when selected. They allow the user to vary data sent with *
518: * each message. *
519: * *
520: ****************************************************************************/
521: BOOL APIENTRY ComboBoxExample(
522: HWND hDlg,
523: UINT message,
524: UINT wParam,
525: LONG lParam)
526: {
527:
528: HWND hWndCombo; /* Handle to the combo box control */
529: /* in the dialog box window */
530: HWND hWndCheckBox; /* Handle to the Auto Check Box */
531: CHAR strSingleEditLine[255]; /* Single line edit control input */
532: INT wIndex, wCount;
533:
534: /* Get handles to the Combo box and the Check box */
535: hWndCombo = GetDlgItem(hDlg, ID_COMBOBOX);
536: hWndCheckBox = GetDlgItem(hDlg, ID_STEPSBOX);
537:
538: switch (message){
539: case WM_COMMAND:
540: switch (LOWORD(wParam)){
541: case IDOK:
542: EndDialog (hDlg,0);
543: return(TRUE);
544:
545: case ID_UNSLBUTTON:
546: /* Selecting this button unselects any selection in the
547: * combo box.
548: */
549: SetDlgItemText (hDlg, ID_TEXT1, "");
550: SetDlgItemText (hDlg, ID_TEXT2, "");
551: wIndex = (WORD) SendMessage( hWndCombo, CB_GETCURSEL, 0, 0L);
552: if (wIndex == CB_ERR)
553: MessageBox (hDlg, (LPSTR)"No Selection", NULL, MB_OK);
554: else
555: SendMessage (hWndCombo, CB_SETCURSEL, (WPARAM)-1, 0L);
556: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
557: break;
558:
559: case ID_NUMSELBUTTON:
560: /* An integer value is taken from the edit control and an
561: * attempt is made to select a combo box entry having this
562: * index.
563: */
564: SetDlgItemText (hDlg, ID_TEXT1, "");
565: SetDlgItemText (hDlg, ID_TEXT2, "");
566: wCount = (WORD) SendMessage (hWndCombo, CB_GETCOUNT, 0, 0L);
567: wIndex = (INT) GetDlgItemInt (hDlg, ID_SINGLEEDIT, NULL, TRUE);
568: if (wIndex >= wCount)
569: MessageBox (hDlg, (LPSTR)"Bad Selection", NULL, MB_OK);
570: else
571: SendMessage(hWndCombo, CB_SETCURSEL, wIndex, 0L);
572: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
573: break;
574:
575: case ID_TXTSELBUTTON:
576: /* A text string is taken from the edit control and an
577: * attempt is made to select a combo box entry having the
578: * string as a prefix.
579: */
580: SetDlgItemText (hDlg, ID_TEXT1, "");
581: SetDlgItemText (hDlg, ID_TEXT2, "");
582: GetDlgItemText (hDlg, ID_SINGLEEDIT,
583: (LPSTR)strSingleEditLine, 255);
584: wIndex = (WORD) SendMessage (hWndCombo,
585: CB_SELECTSTRING,
586: (WPARAM)-1,
587: (LONG)(LPSTR)strSingleEditLine);
588: if (wIndex == CB_ERR)
589: MessageBox (hDlg, (LPSTR)"Bad Selection", NULL, MB_OK);
590: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
591: break;
592:
593: case ID_FNDSELBUTTON:
594: /* Searches for the text specified in the list of combo
595: * entries and returns the index (in combo box) of the
596: * first match. The index is displayed in the "Text1"
597: * field of the dialog.
598: */
599: SetDlgItemText (hDlg, ID_TEXT1, "");
600: SetDlgItemText (hDlg, ID_TEXT2, "");
601: GetDlgItemText (hDlg,
602: ID_SINGLEEDIT,
603: (LPSTR)strSingleEditLine,
604: 255);
605: wIndex = (WORD)SendMessage (hWndCombo,
606: CB_FINDSTRING,(WPARAM)-1,
607: (LONG)(LPSTR)strSingleEditLine);
608: if (wIndex == CB_ERR)
609: MessageBox (hDlg, (LPSTR)"Bad Selection", NULL, MB_OK);
610: else
611: SetDlgItemInt (hDlg, ID_TEXT1, wIndex, FALSE);
612: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
613: break;
614:
615: case ID_CLRBUTTON:
616: /* Clears the combo box of all it's entries */
617: SetDlgItemText (hDlg, ID_TEXT1, "");
618: SetDlgItemText (hDlg, ID_TEXT2, "");
619: wCount = (WORD) SendMessage (hWndCombo, CB_GETCOUNT, 0, 0L);
620: if (!wCount)
621: MessageBox (hDlg, (LPSTR)"Already clear", NULL, MB_OK);
622: else{
623: SetDlgItemInt (hDlg, ID_TEXT1, wCount, TRUE);
624: SetDlgItemText (hDlg, ID_TEXT2, "Items cleared");
625: SendMessage (hWndCombo,CB_RESETCONTENT, 0, 0L);
626: }
627: SetFocus (GetDlgItem (hDlg,ID_SINGLEEDIT));
628: break;
629:
630: case ID_ADDBUTTON:
631: /* Takes the string specified in the edit control and
632: * adds it to the combo box.
633: */
634: SetDlgItemText (hDlg, ID_TEXT1, "");
635: SetDlgItemText (hDlg, ID_TEXT2, "");
636: GetDlgItemText (hDlg, ID_SINGLEEDIT, strSingleEditLine, 255);
637: SendMessage (hWndCombo,
638: CB_ADDSTRING,
639: 0,
640: (LONG)(LPSTR) strSingleEditLine);
641: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
642: break;
643:
644: case ID_DELETEBUTTON:
645: /* Delete the currently selected item from the combo box. */
646: SetDlgItemText (hDlg, ID_TEXT1, "");
647: SetDlgItemText (hDlg, ID_TEXT2, "");
648: wIndex = (WORD) SendMessage (hWndCombo, CB_GETCURSEL, 0, 0L);
649: if (SendMessage (hWndCombo, CB_DELETESTRING, wIndex, 0L) == CB_ERR)
650: MessageBox (hDlg, (LPSTR)"No Selection", NULL, MB_OK);
651: else{
652: SetDlgItemText (hDlg, ID_TEXT1, "deleted index #");
653: SetDlgItemInt (hDlg, ID_TEXT2, wIndex, TRUE);
654: }
655: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
656: break;
657:
658: case ID_CBDIRBUTTON:
659: /* Appends a directory listing of the current directory
660: * to the combo box entries.
661: */
662: SetDlgItemText (hDlg, ID_TEXT1, "");
663: SetDlgItemText (hDlg, ID_TEXT2, "");
664: wIndex = (WORD)SendMessage (hWndCombo,
665: CB_DIR,
666: 0x10|0x4000,
667: (LONG)(LPSTR)"*.*");
668: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
669: break;
670:
671:
672: case ID_CPYBUTTON:
673: /* Copies the currently selected item in the combo box to
674: * the edit control.
675: */
676: SetDlgItemText (hDlg, ID_TEXT1, "");
677: SetDlgItemText (hDlg, ID_TEXT2, "");
678: wIndex = (WORD) SendMessage (hWndCombo, CB_GETCURSEL, 0, 0L);
679: if (wIndex == CB_ERR)
680: MessageBox(hDlg, (LPSTR)"No Selection", NULL, MB_OK);
681: else{
682: wCount = SendMessage (hWndCombo, CB_GETLBTEXTLEN, wIndex, 0L);
683: SendMessage (hWndCombo,
684: CB_GETLBTEXT,
685: wIndex,
686: (LONG)(LPSTR)strSingleEditLine);
687: SetDlgItemText(hDlg, ID_SINGLEEDIT,
688: (LPSTR)strSingleEditLine);
689: SetDlgItemText(hDlg, ID_TEXT1, "copied index #");
690: SetDlgItemInt(hDlg, ID_TEXT2, wIndex, TRUE);
691: }
692: SetFocus (GetDlgItem (hDlg, ID_SINGLEEDIT));
693: break;
694:
695: /* When the combo notification box is checked, a message box
696: * is flashed showing what notification codes the combo box is
697: * returning to the app. in response to the messages sent by
698: * the buttons.
699: */
700: case ID_COMBOBOX:
701: if (SendMessage (hWndCheckBox, BM_GETCHECK, 0, 0L)){
702: switch (HIWORD(lParam)){
703: case (WORD)CBN_ERRSPACE:
704: MessageBox (hDlg, (LPSTR)"CB Out of Space",
705: "CB MSG", MB_OK);
706: break;
707:
708: case CBN_SELCHANGE:
709: MessageBox (hDlg, (LPSTR)"CB Sel Change",
710: "CB MSG", MB_OK);
711: break;
712:
713: case CBN_DBLCLK:
714: MessageBox(hDlg, (LPSTR)"CB Double Click",
715: "CB MSG", MB_OK);
716: break;
717:
718: case CBN_SETFOCUS:
719: SetDlgItemText(hDlg, ID_TEXT1, "CB SetFocus");
720: break;
721:
722: case CBN_KILLFOCUS:
723: SetDlgItemText(hDlg, ID_TEXT1, "CB KillFocus");
724: break;
725: }
726: }
727: break;
728:
729: default:
730: return(FALSE);
731: }
732: break;
733:
734: case WM_CLOSE:
735: EndDialog(hDlg, 0);
736: return(TRUE);
737: break;
738:
739: default:
740: return(FALSE);
741: }
742: return(TRUE);
743: }
744:
745:
746: /****************************************************************************
747: * *
748: * FUNCTION : OwnerComboBoxExample(hWnd, message, wParam, lParam) *
749: * *
750: * PURPOSE : Dialog function for the dropdown list combo box with *
751: * owner-draw. *
752: * *
753: ****************************************************************************/
754: BOOL APIENTRY OwnerComboBoxExample (
755: HWND hDlg,
756: UINT message,
757: UINT wParam,
758: LONG lParam)
759: {
760: LPDRAWITEMSTRUCT lpdis;
761: LPMEASUREITEMSTRUCT lpmis;
762:
763: switch (message){
764: case WM_COMMAND:
765: switch (LOWORD(wParam)){
766: case IDOK:
767: EndDialog (hDlg, 0);
768: return(TRUE);
769: break;
770:
771: /* Clicking any of these buttons adds the corresponding color
772: * to the combo box. The application-supplied data is the RGB
773: * value for the color to be drawn in the listbox.
774: */
775: case ID_BLACK:
776: SendMessage (GetDlgItem(hDlg, ID_LISTBOX),
777: CB_ADDSTRING,
778: 0,
779: RGB (0,0,0));
780: return(TRUE);
781: break;
782:
783: case ID_RED:
784: SendMessage (GetDlgItem (hDlg, ID_LISTBOX),
785: CB_ADDSTRING,
786: 0,
787: RGB (255,0,0));
788: return(TRUE);
789: break;
790:
791: case ID_BLUE:
792: SendMessage (GetDlgItem(hDlg, ID_LISTBOX),
793: CB_ADDSTRING,
794: 0,
795: RGB (0,0,255));
796: return(TRUE);
797: break;
798:
799: case ID_GREEN:
800: SendMessage (GetDlgItem(hDlg, ID_LISTBOX),
801: CB_ADDSTRING,
802: 0,
803: RGB (0,255,0));
804: return(TRUE);
805: break;
806:
807: default:
808: return(TRUE);
809: break;
810: }
811:
812: case WM_DRAWITEM:
813: /* Get pointer to the DRAWITEMSTRUCT */
814: lpdis = (LPDRAWITEMSTRUCT)lParam;
815:
816: if (lpdis->itemID == -1){
817: /* We have a request to draw an item in the combo box, yet there
818: * are no combo box items. This is sent when the user TABS into
819: * an empty combo box or an empty combo box gets the focus. We
820: * have to indicate (somehow) that this owner-draw combo box has
821: * the focus. We do it in response to this message. Note that
822: * lpdis->itemData field would be invalid in this instance so
823: * we can't allow it to fall into our standard routines.
824: */
825: HandleFocusState(lpdis, -2);
826: }
827: else
828: {
829: switch (lpdis->itemAction)
830: {
831: case ODA_DRAWENTIRE:
832: DrawEntireItem(lpdis, -4);
833: break;
834:
835: case ODA_SELECT:
836: HandleSelectionState(lpdis, 0);
837: break;
838:
839: case ODA_FOCUS:
840: HandleFocusState(lpdis, -2);
841: break;
842: }
843: }
844:
845: /* Return TRUE meaning that we processed this message. */
846: return(TRUE);
847: break;
848:
849: case WM_MEASUREITEM:
850: lpmis = (LPMEASUREITEMSTRUCT)lParam;
851:
852: /* All the items are the same height since the combo box is
853: * CBS_OWNERDRAWFIXED
854: */
855: if (lpmis->itemID == -1){
856: /* If -1 for item, then we are setting the height of the
857: * always visible static item part of the dropdown combo box.
858: */
859: lpmis->itemHeight = 25;
860: return(TRUE);
861: }
862: lpmis->itemHeight = 30;
863: break;
864:
865: case WM_CLOSE:
866: EndDialog(hDlg, 0);
867: return(TRUE);
868: break;
869:
870: default:
871: return(FALSE);
872: }
873: return(TRUE);
874: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.