📄 combobox.c
字号:
pData->ListBoxRect.right = rect.right; pData->ListBoxRect.top = rect.top - list_height; pData->ListBoxRect.bottom = rect.top; } pData->EditControl = CreateWindow (CTRL_SLEDIT, edit_text, edit_style, IDC_CEDIT, edit_box.left, edit_box.top, RECTW(edit_box), RECTH(edit_box), hwnd, 0); if ((dwStyle & CBS_TYPEMASK) == CBS_AUTOSPIN) { WNDPROC old_edit_proc = SetWindowCallbackProc (pData->EditControl, AutoSpinEditBoxProc); SetWindowAdditionalData (pData->EditControl, (DWORD)old_edit_proc); pData->str_format = strdup ("%d"); } if (list_height >= 0) { pData->ListBoxControl = CreateWindowEx (CTRL_LISTBOX, "listbox", list_style, ((dwStyle & CBS_TYPEMASK) != CBS_SIMPLE) ? WS_EX_CTRLASMAINWIN : WS_EX_NONE, IDC_CLISTBOX, pData->ListBoxRect.left, pData->ListBoxRect.top, width, list_height, hwnd, 0); } else { pData->ListBoxControl = 0; } break; } case MSG_DESTROY: DestroyAllControls (hwnd); free (pData->str_format); free (pData); return 0; case MSG_SIZECHANGING: { const RECT* rcExpect = (const RECT*)wParam; RECT* rcResult = (RECT*)lParam; if ((dwStyle & CBS_TYPEMASK) == CBS_SIMPLE) { int height = GetSysFontHeight (SYSLOGFONT_CONTROL) + MARGIN_EDIT_TOP + MARGIN_EDIT_BOTTOM + (WIDTH_EDIT_BORDER<<1); rcResult->left = rcExpect->left; rcResult->top = rcExpect->top; rcResult->right = rcExpect->right; rcResult->bottom = rcExpect->top + height; rcResult->bottom += (pData->ListBoxRect.bottom - pData->ListBoxRect.top + INTER_EDIT_LISTBOX*2); return 0; } break; } case MSG_CHILDHIDDEN: { int reason = wParam; int x = LOSWORD(lParam); int y = HISWORD(lParam); 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->IncSpinBox, 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); BOOL inc = FALSE; if (PtInRect (&pData->IncSpinBox, x, y)) inc = TRUE; else if (PtInRect (&pData->DecSpinBox, x, y)) inc = FALSE; else break; switch (dwStyle & CBS_TYPEMASK) { case CBS_SPINLIST: case CBS_AUTOSPIN: SetCapture (hwnd); SendMessage (hwnd, CB_SPIN, inc, 0); SetAutoRepeatMessage (hwnd, CB_FASTSPIN, inc, 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_DESKTOP, 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); buffer = ALLOCATE_LOCAL (len + 1); //buffer = FixStrAlloc (len + 1); SendMessage (pData->ListBoxControl, LB_GETTEXT, sel, (LPARAM)buffer); SendMessage (pData->EditControl, MSG_SETTEXT, 0, (LPARAM)buffer); DEALLOCATE_LOCAL(buffer); //FreeFixStr (buffer); } 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); ComboBoxDrawSpinButton (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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -