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

📄 listbox.c

📁 TN-kernel内核针对LPC系列ARM7处理器和S3C44B0X重新定制好的源代码包。内含Nano-X GUI。
💻 C
📖 第 1 页 / 共 4 页
字号:
            else if (newTop > pData->itemCount - pData->itemVisibles)
                newTop = pData->itemCount - pData->itemVisibles;

            if (pData->itemTop != newTop) {
                pData->itemTop = newTop;

                if (pData->itemHilighted < pData->itemTop)
                    pData->itemHilighted = pData->itemTop;
                if (pData->itemHilighted > ITEM_BOTTOM (pData))
                    pData->itemHilighted = ITEM_BOTTOM (pData);

                lstSetVScrollInfo (hwnd, pData, TRUE);

                InvalidateRect (hwnd, NULL, TRUE);
            }
        }
        break;

        case LB_SETCURSEL:
        case LB_SETCARETINDEX:
        {
            int new = (int)wParam;
            int old, newTop;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (new < 0 || new > pData->itemCount - 1)
                return LB_ERR;

            old = pData->itemHilighted;
            if (new >= 0 && new != old) {
                if (pData->itemCount - new >= pData->itemVisibles)
                    newTop = new;
                else
                    newTop = max (pData->itemCount - pData->itemVisibles, 0);

                pData->itemTop = newTop;
                pData->itemHilighted = new;
                lstSetVScrollInfo (hwnd, pData, TRUE);
            }

            if (!(dwStyle & LBS_MULTIPLESEL))
                lstSelectItem (dwStyle, pData, new);
            InvalidateRect (hwnd, NULL, TRUE);

            return old;
        }
        break;

        case LB_GETCOUNT:
            pData = (PLISTBOXDATA)pCtrl->userdata;
            return pData->itemCount;
        break;

        case LB_GETCURSEL:
        {
            PLISTBOXITEM plbi;
            int index = 0;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (dwStyle & LBS_MULTIPLESEL)
                return pData->itemHilighted;

            plbi = pData->head;
            while (plbi) {
                if (plbi->dwFlags & LBIF_SELECTED)
                    return index;

                index ++;
                plbi = plbi->next;
           }

           return LB_ERR;
        }
        break;

        case LB_GETSELCOUNT:
        {
            int nSel;
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;

            nSel = 0;
            plbi = pData->head;
            while (plbi) {
                if (plbi->dwFlags & LBIF_SELECTED)
                    nSel ++;
                plbi = plbi->next;
            }

            return nSel;
        }
        break;

        case LB_GETTOPINDEX:
            pData = (PLISTBOXDATA)pCtrl->userdata;
            return pData->itemTop;
        break;

        case LB_GETCARETINDEX:
            pData = (PLISTBOXDATA)pCtrl->userdata;
            return pData->itemHilighted;
        break;

        case LB_GETTEXTLEN:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = lstGetItem (pData, (int)wParam);
            if (plbi)
                return strlen (plbi->key);
            else
                return LB_ERR;
        }
        break;

        case LB_GETTEXT:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = lstGetItem (pData, (int)wParam);
            if (plbi)
                strcpy ((char*)lParam, plbi->key);
            else
                return LB_ERR;
        }
        break;

        case LB_SETTEXT:
        {
            PLISTBOXITEM plbi;
            char* newStr;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = lstGetItem (pData, (int)wParam);
            if (plbi) {
                newStr = FixStrAlloc (strlen ((char*)lParam));
                if (newStr) {
                    FreeFixStr (plbi->key);
                    plbi->key = newStr;
                    strcpy (plbi->key, (char*)lParam);
                    lstInvalidateItem (hwnd, pData, (int)wParam, TRUE);
                }
                else
                    return LB_ERR;
            }
            else
                return LB_ERR;
        }
        break;

        case LB_GETITEMDATA:
        {
            PLISTBOXITEM plbi;
            PLISTBOXITEMINFO plbii;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) {
                return plbi->dwData;
            }

            plbii = (PLISTBOXITEMINFO)lParam;
            if (!plbii)
                return LB_ERR;

            if (plbi->dwFlags & LBIF_CHECKED)
                plbii->cmFlag = CMFLAG_CHECKED;
            else if (plbi->dwFlags & LBIF_PARTCHECKED)
                plbii->cmFlag = CMFLAG_PARTCHECKED;
            else
                plbii->cmFlag = CMFLAG_BLANK;
            plbii->hIcon = (HICON)plbi->dwData;

            return LB_OKAY;
        }
        break;

        case LB_SETITEMDATA:
        {
            PLISTBOXITEM plbi;
            PLISTBOXITEMINFO plbii;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) {
                plbi->dwData = (DWORD)lParam;
                return LB_OKAY;
            }

            plbii = (PLISTBOXITEMINFO)lParam;
            if (!plbii)
                return LB_ERR;

            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;
            switch (plbii->cmFlag) {
                case CMFLAG_CHECKED:
                    plbi->dwFlags |= LBIF_CHECKED;
                break;
                case CMFLAG_PARTCHECKED:
                    plbi->dwFlags |= LBIF_PARTCHECKED;
                break;
            }

            if (dwStyle & LBS_USEICON)
                plbi->dwData = (DWORD)plbii->hIcon;
            else
                plbi->dwData = 0;

            lstInvalidateItem (hwnd, pData, (int)wParam, TRUE);

            return LB_OKAY;
        }
        break;

        case LB_GETITEMADDDATA:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            return plbi->dwAddData;
        }
        break;

        case LB_SETITEMADDDATA:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            plbi->dwAddData = (DWORD)lParam;

            return LB_OKAY;
        }
        break;

        case LB_GETCHECKMARK:
        {
            PLISTBOXITEM plbi;

            if (!(dwStyle & LBS_CHECKBOX))
                return LB_ERR;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            if (plbi->dwFlags & LBIF_CHECKED)
                return CMFLAG_CHECKED;

            if (plbi->dwFlags & LBIF_PARTCHECKED)
                return CMFLAG_PARTCHECKED;

            return CMFLAG_BLANK;
        }
        break;

        case LB_SETCHECKMARK:
        {
            PLISTBOXITEM plbi;

            if (!(dwStyle & LBS_CHECKBOX))
                return LB_ERR;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (!(plbi = lstGetItem (pData, (int)wParam)))
                return LB_ERR;

            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;
            switch (lParam) {
                case CMFLAG_CHECKED:
                    plbi->dwFlags |= LBIF_CHECKED;
                break;
                case CMFLAG_PARTCHECKED:
                    plbi->dwFlags |= LBIF_PARTCHECKED;
                break;
            }

            lstInvalidateItem (hwnd, pData, (int)wParam, TRUE);

            return LB_OKAY;
        }
        break;

        case LB_GETSELITEMS:
        {
            int  nItem;
            int  nSel = 0;
            int  index = 0;
            int* pInt;
            PLISTBOXITEM plbi;

            nItem = (int)wParam;
            pInt  = (int*)lParam;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = pData->head;
            while (plbi) {

                if (plbi->dwFlags & LBIF_SELECTED) {
                    if (pInt) {
                        if (nSel < nItem)
                            *(pInt + nSel) = index;
                        else
                            return nItem;
                    }
                    nSel ++;
                }

                plbi = plbi->next;
                index ++;
            }

            return nSel;
        }
        break;

        case LB_GETSEL:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = lstGetItem (pData, (int)wParam);
            if (plbi)
                return plbi->dwFlags & LBIF_SELECTED;
            else
                return LB_ERR;
        }
        break;

        case LB_SETSEL:
        {
            PLISTBOXITEM plbi;

            pData = (PLISTBOXDATA)pCtrl->userdata;
            plbi = lstGetItem (pData, (int)lParam);
            if (plbi) {
                pData->dwFlags &= ~LBF_NOTHINGSELECTED;
                if (wParam == -1)
                    plbi->dwFlags ^= LBIF_SELECTED;
                else if (wParam == 0)
                    plbi->dwFlags &= ~LBIF_SELECTED;
                else
                    plbi->dwFlags |= LBIF_SELECTED;

                lstInvalidateItem (hwnd, pData, (int)lParam, FALSE);
            }
            else
                return LB_ERR;
        }
        break;

        case LB_GETITEMHEIGHT:
            pData = (PLISTBOXDATA)pCtrl->userdata;
            return pData->itemHeight;
        break;

        case LB_SETITEMHEIGHT:
            pData = (PLISTBOXDATA)pCtrl->userdata;
            if (pData->itemHeight != LOWORD (lParam)) {
                RECT rcClient;

                pData->itemHeight = LOWORD (lParam);
                GetClientRect (hwnd, &rcClient);
                lstCalcParams (&rcClient, pData);

                lstSetVScrollInfo (hwnd, pData, TRUE);
                InvalidateRect (hwnd, NULL, TRUE);
            }
        break;

        case WM_SETFOCUS:
        {
            pData = (PLISTBOXDATA)pCtrl->userdata;

            if (pData->dwFlags & LBF_FOCUS)
                break;

            pData->dwFlags |= LBF_FOCUS;
            InvalidateRect(hwnd, NULL, TRUE);

            NotifyParent (hwnd, pCtrl->id, LBN_SETFOCUS);
        }
        break;

        case WM_KILLFOCUS:
        {
            pData = (PLISTBOXDATA)pCtrl->userdata;

            pData->dwFlags &= ~LBF_FOCUS;
            InvalidateRect(hwnd, NULL, TRUE);

            NotifyParent (hwnd, pCtrl->id, LBN_KILLFOCUS);
        }
        break;

        case WM_GETDLGCODE:
            return DLGC_WANTARROWS | DLGC_WANTCHARS;

        case WM_GETTEXTLENGTH:
        case WM_GETTEXT:
        case WM_SETTEXT:
            return -1;
#if 0
        case WM_SETFONT:
        break;

        case WM_GETFONT:
        break;
#endif
        case WM_NCCALCSIZE:
        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -