⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 combobox.c

📁 有了操作系统、TCP/IP协议栈、文件系统
💻 C
📖 第 1 页 / 共 3 页
字号:
                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 + -