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