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