📄 combobox.c
字号:
if (reason == RCTM_CLICK) ScreenToClient (hwnd, &x, &y); if (IS_SET (pData, CSF_HASDROPPED)) CLEAR_STATE (pData, CSF_HASDROPPED); if (((dwStyle & CBS_TYPEMASK) > CBS_AUTOSPIN) && PtInRect (&pData->ButtonRect, x, y)) SET_STATE (pData, CSF_HASDROPPED); break; } case MSG_SETFOCUS: if (dwStyle & CBS_AUTOFOCUS) SetFocusChild (pData->EditControl); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_SETFOCUS); break; case MSG_KILLFOCUS: if (((dwStyle & CBS_TYPEMASK) == CBS_DROPDOWNLIST) && IS_SET (pData, CSF_HASDROPPED)) { ShowWindow (pData->ListBoxControl, SW_HIDE); CLEAR_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_CLOSEUP); } if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_KILLFOCUS); break; case MSG_LBUTTONDOWN: { int x = LOSWORD(lParam); int y = HISWORD(lParam); if (PtInRect (&pData->ButtonRect, x, y)) { BOOL down_button = FALSE; if (y > ((pData->ButtonRect.bottom + pData->ButtonRect.top) >> 1)) { down_button = TRUE; } switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: case CBS_AUTOSPIN: SetCapture (hwnd); SendMessage (hwnd, CB_SPIN, down_button, 0); SetAutoRepeatMessage (hwnd, CB_FASTSPIN, down_button, 0); break; case CBS_DROPDOWNLIST: if (IS_SET (pData, CSF_HASDROPPED)) { ShowWindow (pData->ListBoxControl, SW_HIDE); CLEAR_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_CLOSEUP); } else { ShowWindow (pData->ListBoxControl, SW_SHOW); SET_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_DROPDOWN); } break; } } break; } case MSG_LBUTTONUP: { switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: case CBS_AUTOSPIN: SetAutoRepeatMessage (hwnd, 0, 0, 0); ReleaseCapture (); break; } } case MSG_KEYDOWN: { switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: case CBS_AUTOSPIN: switch (LOWORD(wParam)) { case SCANCODE_CURSORBLOCKUP: case SCANCODE_CURSORBLOCKDOWN: SendMessage (hwnd, CB_SPIN, (LOWORD(wParam) == SCANCODE_CURSORBLOCKDOWN), 0); break; case SCANCODE_PAGEUP: case SCANCODE_PAGEDOWN: SendMessage (hwnd, CB_FASTSPIN, (LOWORD(wParam) == SCANCODE_PAGEDOWN), 0); break; } break; case CBS_DROPDOWNLIST: switch (LOWORD(wParam)) { case SCANCODE_ESCAPE: if (IS_SET (pData, CSF_HASDROPPED)) { ShowWindow (pData->ListBoxControl, SW_HIDE); CLEAR_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) { NotifyParent (hwnd, pCtrl->id, CBN_SELENDCANCEL); NotifyParent (hwnd, pCtrl->id, CBN_CLOSEUP); } SetFocusChild (pData->EditControl); } break; case SCANCODE_ENTER: if (IS_SET (pData, CSF_HASDROPPED)) { ShowWindow (pData->ListBoxControl, SW_HIDE); CLEAR_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) { NotifyParent (hwnd, pCtrl->id, CBN_SELENDOK); NotifyParent (hwnd, pCtrl->id, CBN_CLOSEUP); } SetFocusChild (pData->EditControl); } break; case SCANCODE_CURSORBLOCKUP: case SCANCODE_PAGEUP: case SCANCODE_CURSORBLOCKDOWN: case SCANCODE_PAGEDOWN: if (!IS_SET (pData, CSF_HASDROPPED)) { ShowWindow (pData->ListBoxControl, SW_SHOW); SetFocusChild (pData->ListBoxControl); SET_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_DROPDOWN); } break; } break; } } case MSG_COMMAND: { int len; char *buffer; int sel; int id = LOWORD(wParam); int code = HIWORD(wParam); switch (id) { case IDC_CLISTBOX: { if ((dwStyle & CBS_TYPEMASK) == CBS_DROPDOWNLIST && (code == LBN_CLICKED || code == LBN_KILLFOCUS)) { ShowWindow (pData->ListBoxControl, SW_HIDE); CLEAR_STATE (pData, CSF_HASDROPPED); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_CLOSEUP); break; } if (code == LBN_DBLCLK && (dwStyle & CBS_NOTIFY)) { NotifyParent (hwnd, pCtrl->id, CBN_DBLCLK); break; } if (code != LBN_SELCHANGE) break; if ((sel = SendMessage (pData->ListBoxControl, LB_GETCURSEL, 0, 0)) >= 0) { len = SendMessage (pData->ListBoxControl, LB_GETTEXTLEN, sel, 0);#ifdef HAVE_ALLOCA buffer = alloca (len + 1);#else buffer = FixStrAlloc (len + 1);#endif SendMessage (pData->ListBoxControl, LB_GETTEXT, sel, (LPARAM)buffer); SendMessage (pData->EditControl, MSG_SETTEXT, 0, (LPARAM)buffer);#ifndef HAVE_ALLOCA FreeFixStr (buffer);#endif } if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_SELCHANGE); break; } case IDC_CEDIT: if (code == EN_DBLCLK && dwStyle & CBS_NOTIFY) { NotifyParent (hwnd, pCtrl->id, CBN_DBLCLK); } else if (code == EN_CHANGE) { if (pData->ListBoxControl) { char str [21]; GetWindowText (pData->EditControl, str, LEN_SPINVALUE); if (str [0] != '\0') { if ((sel = SendMessage (pData->ListBoxControl, LB_FINDSTRING, 0, (LPARAM)str)) >= 0) SendMessage (pData->ListBoxControl, LB_SETCURSEL, sel, 0); } } if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_EDITCHANGE); } break; } break; } case MSG_GETDLGCODE: return DLGC_WANTARROWS | DLGC_WANTENTER; case MSG_FONTCHANGED: SetWindowFont (pData->EditControl, GetWindowFont (hwnd)); if (pData->ListBoxControl) SetWindowFont (pData->ListBoxControl, GetWindowFont (hwnd)); return 0; case MSG_PAINT: { HDC hdc; hdc = BeginPaint (hwnd); ComboBoxDownButton (hwnd, hdc); EndPaint (hwnd, hdc); return 0; } case CB_GETCHILDREN: { HWND* wnd_edit = (HWND*)wParam; HWND* wnd_listbox = (HWND*)lParam; *wnd_edit = pData->EditControl; *wnd_listbox = pData->ListBoxControl; return 0; } /* when click the up/down button, spin the value of SIMPLE and AUTOSPIN combobox */ case CB_SPIN: switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: if (wParam) SendMessage (pData->ListBoxControl, MSG_KEYDOWN, SCANCODE_CURSORBLOCKDOWN, 0); else SendMessage (pData->ListBoxControl, MSG_KEYDOWN, SCANCODE_CURSORBLOCKUP, 0); break; case CBS_AUTOSPIN: { char buffer [LEN_SPINVALUE+1]; int cur_value, new_value; GetWindowText (pData->EditControl, buffer, LEN_SPINVALUE);#if 0 cur_value = new_value = strtol (buffer, NULL, 0);#else sscanf (buffer, pData->str_format, &cur_value); new_value = cur_value;#endif if (wParam) { new_value -= pData->spin_pace; } else { new_value += pData->spin_pace; } if (dwStyle & CBS_AUTOLOOP) { if (new_value > pData->spin_max) new_value = pData->spin_min; else if (new_value < pData->spin_min) new_value = pData->spin_max; } else { if (new_value > pData->spin_max) new_value = pData->spin_max; else if (new_value < pData->spin_min) new_value = pData->spin_min; } if (new_value != cur_value) { snprintf (buffer, LEN_SPINVALUE, pData->str_format, new_value); SetWindowText (pData->EditControl, buffer); if (dwStyle & CBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, CBN_EDITCHANGE); } break; } } break; case CB_FASTSPIN: switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: if (wParam)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -