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

📄 listbox.c

📁 linux下的图形界面开发minigui最新源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        case MSG_GETTEXTLENGTH:        case MSG_GETTEXT:        case MSG_SETTEXT:            return -1;                    case MSG_PAINT:        {            RECT rc;                        hdc = BeginPaint (hwnd);            GetClientRect (hwnd, &rc);            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            lstOnDrawSListBoxItems (hdc, dwStyle, pData, RECTW (rc));            SetPenColor (hdc, PIXEL_lightwhite);            lstDrawFocusRect (hdc, pData, &rc);            EndPaint(hwnd,hdc);        }        return 0;            case MSG_LBUTTONDBLCLK:            if (dwStyle & LBS_NOTIFY)                NotifyParent (hwnd, pCtrl->id, LBN_DBLCLK);        break;            case MSG_LBUTTONDOWN:        {            int oldSel, mouseX, mouseY, hit;            RECT rcInv;            BOOL click_mark = FALSE;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (pData->itemCount == 0)                break;            mouseX = LOSWORD (lParam);            mouseY = HISWORD (lParam);            hit = mouseY / pData->itemHeight;            hit += pData->itemTop;                        if (hit >= pData->itemCount)                break;            oldSel = lstSelectItem (dwStyle, pData, hit);            if (dwStyle & LBS_CHECKBOX) {                if (mouseX > 0 && mouseX < LST_WIDTH_CHECKMARK) {                    click_mark = TRUE;                    if (dwStyle & LBS_NOTIFY)                        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);                    }                }            }                        GetClientRect (hwnd, &rcInv);            if ((dwStyle & LBS_NOTIFY)) {                if (!click_mark)                    NotifyParent (hwnd, pCtrl->id, LBN_CLICKED);                if (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);                SetPenColor (hdc, PIXEL_lightwhite);                lstDrawFocusRect (hdc, pData, &rcInv);                ReleaseDC (hdc);            }            pData->itemHilighted = hit;            lstSetVScrollInfo (hwnd, pData, TRUE);        }        break;            case LB_GETITEMRECT:        {            RECT rcClient, *rcItem;            int index;                        rcItem = (RECT*)lParam;            index = wParam;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (pData->itemCount == 0 || index > pData->itemCount)                return LB_ERR;            GetClientRect ( hwnd, &rcClient );            rcItem->right = rcClient.right;            rcItem->left = rcClient.left;            rcItem->top = (index-pData->itemTop)*pData->itemHeight;            rcItem->bottom = (index-pData->itemTop+1)*(pData->itemHeight);            return LB_OKAY;        }            case MSG_KEYDOWN:        {            int oldSel, newSel, newTop;            RECT rcInv;            pData = (PLISTBOXDATA)pCtrl->dwAddData2;            if (pData->itemCount == 0)                break;            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;                                case SCANCODE_ENTER:                    if (dwStyle & LBS_NOTIFY)                         NotifyParent (hwnd, pCtrl->id, LBN_ENTER);                    return 0;                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);                        SetPenColor (hdc, PIXEL_lightwhite);                        lstDrawFocusRect (hdc, pData, &rcInv);                        ReleaseDC (hdc);                                                pData->itemHilighted = newSel;                        lstGetItemsRect (pData, newSel, newSel, &rcInv);                        InvalidateRect (hwnd, &rcInv, TRUE);                    }                    else {                        hdc = GetClientDC (hwnd);                        SetPenColor (hdc, PIXEL_lightwhite);                        lstDrawFocusRect (hdc, pData, &rcInv);                        pData->itemHilighted = newSel;                        GetClientRect (hwnd, &rcInv);                        lstDrawFocusRect (hdc, pData, &rcInv);                        ReleaseDC (hdc);                    }                }                lstSetVScrollInfo (hwnd, pData, TRUE);            }        }        break;        case MSG_CHAR:        {            unsigned 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) {                    if (dwStyle & LBS_NOTIFY)                        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)) {                    int oldSel = lstSelectItem (dwStyle, pData, index);                    if ((dwStyle & LBS_NOTIFY) && (oldSel != index))                        NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE);                }                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 = MIN ((int)lParam, (pData->itemCount - pData->itemVisibles));                     scrollHeight = (pData->itemTop - newTop)*pData->itemHeight;                break;            }                        if (scrollHeight) {                pData->itemTop = newTop;                lstSetVScrollInfo (hwnd, pData, TRUE);                UpdateWindow (hwnd, 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);}#endif /* _CTRL_LISTBOX */

⌨️ 快捷键说明

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