📄 combobox.c
字号:
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;
}
else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -