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

📄 listbox.c

📁 在ecos 下mingui 的移植开发
💻 C
📖 第 1 页 / 共 3 页
字号:
            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->dwAddData2;            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->dwAddData2;            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->dwAddData2;            plbi = lstGetItem (pData, (int)lParam);            if (plbi) {                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->dwAddData2;            return pData->itemHeight;        break;            case LB_SETITEMHEIGHT:            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            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);            }        return 0;        case MSG_SETFOCUS:        {            RECT rc;                       pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (pData->dwFlags & LBF_FOCUS)                break;                            pData->dwFlags |= LBF_FOCUS;            GetClientRect (hwnd, &rc);            hdc = GetClientDC (hwnd);            lstDrawFocusRect (hdc, pData, &rc);            ReleaseDC (hdc);            NotifyParent (hwnd, pCtrl->id, LBN_SETFOCUS);        }        return 0;                case MSG_KILLFOCUS:        {            RECT rc;                        GetClientRect (hwnd, &rc);            pData = (PLISTBOXDATA)pCtrl->dwAddData2;                        hdc = GetClientDC (hwnd);            lstDrawFocusRect (hdc, pData, &rc);            ReleaseDC (hdc);            pData->dwFlags &= ~LBF_FOCUS;            NotifyParent (hwnd, pCtrl->id, LBN_KILLFOCUS);        }        return 0;        case MSG_GETDLGCODE:            return DLGC_WANTARROWS | DLGC_WANTCHARS;        break;        case MSG_GETTEXTLENGTH:        case MSG_GETTEXT:        case MSG_SETTEXT:            return -1;                    case MSG_SETFONT:        break;                case MSG_GETFONT:        break;                case MSG_PAINT:        {            RECT rc;                        hdc = BeginPaint (hwnd);            GetClientRect (hwnd, &rc);            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            lstOnDrawSListBoxItems (hdc, dwStyle, pData, RECTW (rc));            lstDrawFocusRect (hdc, pData, &rc);            EndPaint(hwnd,hdc);        }        break;            case MSG_LBUTTONDBLCLK:            if (dwStyle & LBS_NOTIFY)                NotifyParent (hwnd, pCtrl->id, LBN_DBLCLK);        break;            case MSG_LBUTTONDOWN:        {            int oldSel, mouseX, mouseY, hit;            RECT rcInv;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (pData->itemCount == 0)                break;            mouseX = LOWORD (lParam);            mouseY = HIWORD (lParam);            hit = mouseY / pData->itemHeight;            hit += pData->itemTop;                        if (hit >= pData->itemCount)                break;            GetClientRect (hwnd, &rcInv);            oldSel = lstSelectItem (dwStyle, pData, hit);            if ((dwStyle & LBS_NOTIFY) && (oldSel != hit))                NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE);            if (oldSel >= 0) {                if (oldSel >= pData->itemTop                         && (oldSel <= pData->itemTop + pData->itemVisibles)) {                    lstGetItemsRect (pData, oldSel, oldSel, &rcInv);                    InvalidateRect (hwnd, &rcInv, TRUE);                }            }            lstGetItemsRect (pData, hit, hit, &rcInv);            InvalidateRect (hwnd, &rcInv, TRUE);            if (pData->itemHilighted != hit) {                hdc = GetClientDC (hwnd);                lstDrawFocusRect (hdc, pData, &rcInv);                ReleaseDC (hdc);            }            pData->itemHilighted = hit;            if (dwStyle & LBS_CHECKBOX) {                if (mouseX > 0 && mouseX < LST_WIDTH_CHECKMARK) {                    NotifyParent (hwnd, pCtrl->id, LBN_CLICKCHECKMARK);                                        if (dwStyle & LBS_AUTOCHECK) {                        PLISTBOXITEM plbi;                        plbi = lstGetItem (pData, hit);                        switch (plbi->dwFlags & LBIF_CHECKMARKMASK) {                        case LBIF_CHECKED:                            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;                            break;                        default:                            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;                            plbi->dwFlags |= LBIF_CHECKED;                            break;                        }                                        lstInvalidateItem (hwnd, pData, hit, TRUE);                    }                }            }                        lstSetVScrollInfo (hwnd, pData, TRUE);        }        break;            case MSG_LBUTTONUP:        break;            case MSG_MOUSEMOVE:        break;        case MSG_KEYDOWN:        {            int oldSel, newSel, newTop;            RECT rcInv;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            newTop = pData->itemTop;            newSel = pData->itemHilighted;            switch (LOWORD (wParam))            {                case SCANCODE_HOME:                    newSel = 0;                    newTop = 0;                break;                                case SCANCODE_END:                    newSel = pData->itemCount - 1;                    if (pData->itemCount > pData->itemVisibles)                        newTop = pData->itemCount - pData->itemVisibles;                    else                        newTop = 0;                break;                                case SCANCODE_CURSORBLOCKDOWN:                    newSel ++;                    if (newSel >= pData->itemCount)                        return 0;                    if (newSel > ITEM_BOTTOM (pData))                        newTop ++;                break;                                case SCANCODE_CURSORBLOCKUP:                    newSel --;                    if (newSel < 0)                        return 0;                    if (newSel < pData->itemTop)                        newTop --;                break;                                case SCANCODE_PAGEDOWN:                    newSel += pData->itemVisibles;                    if (newSel >= pData->itemCount)                        newSel = pData->itemCount - 1;                                            if (pData->itemCount - newSel >= pData->itemVisibles)                        newTop = newSel;                    else                        newTop = max (pData->itemCount-pData->itemVisibles, 0);                break;                case SCANCODE_PAGEUP:                    newSel -= pData->itemVisibles;                    if (newSel < 0)                        newSel = 0;                                            newTop -= pData->itemVisibles;                    if (newTop < 0)                        newTop = 0;                break;                                default:                return 0;            }            GetClientRect (hwnd, &rcInv);            if (pData->itemHilighted != newSel) {                if (pData->itemTop != newTop) {                    pData->itemTop = newTop;                    pData->itemHilighted = newSel;                    if (!(dwStyle & LBS_MULTIPLESEL)) {                        oldSel = lstSelectItem (dwStyle, pData, newSel);                        if ((dwStyle & LBS_NOTIFY) && (oldSel != newSel))                            NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE);                    }                    InvalidateRect (hwnd, NULL, TRUE);                }                else {                    if (!(dwStyle & LBS_MULTIPLESEL)) {                        oldSel = lstSelectItem (dwStyle, pData, newSel);                        if ((dwStyle & LBS_NOTIFY) && (oldSel != newSel))                            NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE);                        if (oldSel >= 0) {                            if (oldSel >= pData->itemTop                                     && oldSel <= (ITEM_BOTTOM (pData) + 1)) {                                lstGetItemsRect (pData, oldSel, oldSel, &rcInv);                                InvalidateRect (hwnd, &rcInv, TRUE);                            }                        }                                                if (newSel < newTop) {                            pData->itemHilighted = newSel;                            break;                        }                                                    lstGetItemsRect (pData, pData->itemHilighted,                                                pData->itemHilighted, &rcInv);                        hdc = GetClientDC (hwnd);                        lstDrawFocusRect (hdc, pData, &rcInv);                        ReleaseDC (hdc);                                                pData->itemHilighted = newSel;                        lstGetItemsRect (pData, newSel, newSel, &rcInv);                        InvalidateRect (hwnd, &rcInv, TRUE);                    }                    else {                        hdc = GetClientDC (hwnd);                        lstDrawFocusRect (hdc, pData, &rcInv);                        pData->itemHilighted = newSel;                        GetClientRect (hwnd, &rcInv);                        lstDrawFocusRect (hdc, pData, &rcInv);                        ReleaseDC (hdc);                    }                }                lstSetVScrollInfo (hwnd, pData, TRUE);            }        }        break;        case MSG_CHAR:        {            char head [2];            int index;            int newTop;                        if (HIBYTE (wParam))                break;                       head [0] = LOBYTE (wParam);            head [1] = '\0';            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (head[0] == ' ') {                if (dwStyle & LBS_MULTIPLESEL) {                    RECT rcInv;                                        GetClientRect (hwnd, &rcInv);                    lstSelectItem (dwStyle, pData, pData->itemHilighted);                    lstGetItemsRect (pData,                             pData->itemHilighted,                             pData->itemHilighted,                            &rcInv);                    InvalidateRect (hwnd, &rcInv, TRUE);                }                else if (dwStyle & LBS_CHECKBOX) {                    NotifyParent (hwnd, pCtrl->id, LBN_CLICKCHECKMARK);                                        if (dwStyle & LBS_AUTOCHECK) {                        PLISTBOXITEM plbi;                        plbi = lstGetItem (pData, pData->itemHilighted);                        switch (plbi->dwFlags & LBIF_CHECKMARKMASK) {                        case LBIF_CHECKED:                            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;                            break;                        default:                            plbi->dwFlags &= ~LBIF_CHECKMARKMASK;                            plbi->dwFlags |= LBIF_CHECKED;                            break;                        }                                        lstInvalidateItem (hwnd, pData,                                 pData->itemHilighted, TRUE);                    }                }                break;            }            index = lstFindItem (pData, pData->itemHilighted + 1, head, FALSE);            if (index < 0) {                index = lstFindItem (pData, 0, head, FALSE);            }            if (index >= 0) {                if (pData->itemCount - index >= pData->itemVisibles)                    newTop = index;                else                    newTop = max (pData->itemCount - pData->itemVisibles, 0);                pData->itemTop = newTop;                pData->itemHilighted = index;                if (!(dwStyle & LBS_MULTIPLESEL))                    lstSelectItem (dwStyle, pData, index);                InvalidateRect (hwnd, NULL, TRUE);                lstSetVScrollInfo (hwnd, pData, TRUE);            }        }        break;            case MSG_VSCROLL:        {            int newTop;            int scrollHeight = 0;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            newTop = pData->itemTop;            switch(wParam)            {                case SB_LINEDOWN:                    if (ITEM_BOTTOM (pData) < (pData->itemCount - 1)) {                        newTop ++;                        scrollHeight = -pData->itemHeight;                    }                break;                                case SB_LINEUP:                    if (pData->itemTop > 0) {                        newTop --;                        scrollHeight = pData->itemHeight;                    }                break;                                case SB_PAGEDOWN:                    if ((pData->itemTop + (pData->itemVisibles << 1)) <=                            pData->itemCount)                        newTop += pData->itemVisibles;                    else                        newTop = pData->itemCount - pData->itemVisibles;                    if (newTop < 0)                        return 0;                    scrollHeight = -(newTop - pData->itemTop)                                    *pData->itemHeight;                break;                case SB_PAGEUP:                    if (pData->itemTop >= pData->itemVisibles)                        newTop -= pData->itemVisibles;                    else                        newTop = 0;                    scrollHeight = (pData->itemTop - newTop)*pData->itemHeight;                break;                case SB_THUMBTRACK:                    newTop = (int)lParam;                    scrollHeight = (pData->itemTop - newTop)*pData->itemHeight;                break;            }                        if (scrollHeight) {                pData->itemTop = newTop;                ScrollWindow (hwnd, 0, scrollHeight, NULL, NULL);                SendMessage (hwnd, MSG_PAINT, 0, 0);                lstSetVScrollInfo (hwnd, pData, TRUE);                return 0;            }        }        break;        case MSG_HSCROLL:            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            switch (wParam)            {                case SB_LINERIGHT:                break;                                case SB_LINELEFT:                break;                                case SB_PAGELEFT:                break;                                case SB_PAGERIGHT:                break;            }        break;    }        return DefaultControlProc (hwnd, message, wParam, lParam);}

⌨️ 快捷键说明

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