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

📄 treeview.c

📁 minigui的开发程序
💻 C
📖 第 1 页 / 共 4 页
字号:
                    } else {                        if (c <= pData->nItemTop)                            pData->nItemTop = c - 1;                        else if (c >= pData->nItemTop + pData->nVisCount)                            pData->nItemTop = c - pData->nVisCount;                        InvalidateRect (hwnd, NULL, FALSE);                        tvSetVScrollInfo (hwnd, pData, TRUE);                    }                    break;                                    case SCANCODE_CURSORBLOCKDOWN:                    p = pData->pItemSelected;                    count = getCountFromItem (pData, p);                    rctop = rc.top;                    if (count >= pData->nVisItemCount)                        break;                    c = count + 1;                    t = getItemFromCount (pData, c);                    if (t == NULL) break;                    change_selected (hwnd, pData, t);                    if (c > pData->nItemTop && c <= pData->nItemTop + pData->nVisCount) {                        c = c - pData->nItemTop - 1;                        rc.top = rctop + c * pData->nItemHeight;                        if (pData->dwStyle & WS_BORDER)                            rc.top += TV_BORDER;                        rc.bottom = rc.top + pData->nItemHeight;                        InvalidateRect (hwnd, &rc, FALSE);                        count = count - pData->nItemTop - 1;                        rc.top = rctop + count * pData->nItemHeight;                        if (pData->dwStyle & WS_BORDER)                            rc.top += TV_BORDER;                        rc.bottom = rc.top + pData->nItemHeight;                        InvalidateRect (hwnd, &rc, FALSE);                    } else {                        if (c <= pData->nItemTop)                            pData->nItemTop = c - 1;                        else if (c >= pData->nItemTop + pData->nVisCount)                            pData->nItemTop = c - pData->nVisCount;                        InvalidateRect (hwnd, NULL, FALSE);                        tvSetVScrollInfo (hwnd, pData, TRUE);                    }                    break;                                case SCANCODE_PAGEDOWN:                    p = pData->pItemSelected;                    count = getCountFromItem (pData, p);                    c = count + pData->nVisCount;                    if (c > pData->nVisItemCount)                        c = pData->nVisItemCount;                    if (c <= pData->nItemTop)                        pData->nItemTop = c - 1;                    else if (c > pData->nItemTop + pData->nVisCount * 2)                        pData->nItemTop = c - pData->nVisCount;                    else if (c > pData->nItemTop + pData->nVisCount) {                        pData->nItemTop += pData->nVisCount;                        if (pData->nItemTop > pData->nVisItemCount - pData->nVisCount)                            pData->nItemTop = pData->nVisItemCount - pData->nVisCount;                    }                    t = getItemFromCount (pData, c);                    change_selected (hwnd, pData, t);                    InvalidateRect (hwnd, NULL, FALSE);                    tvSetVScrollInfo (hwnd, pData, TRUE);                    break;                            case SCANCODE_PAGEUP:                    p = pData->pItemSelected;                    count = getCountFromItem (pData, p);                    c = count - pData->nVisCount;                    if (c < 1)                        c = 1;                    if (c <= pData->nItemTop - pData->nVisCount)                        pData->nItemTop = c - 1;                    else if (c <= pData->nItemTop) {                        pData->nItemTop -= pData->nVisCount;                        if (pData->nItemTop < 0) pData->nItemTop = 0;                    }                    else if (c > pData->nItemTop + pData->nVisCount)                        pData->nItemTop = c - pData->nVisCount;                    t = getItemFromCount (pData, c);                    change_selected (hwnd, pData, t);                    InvalidateRect (hwnd, NULL, FALSE);                    tvSetVScrollInfo (hwnd, pData, TRUE);                    break;                            case SCANCODE_HOME:                    pData->nItemTop = 0;                    change_selected (hwnd, pData, pData->root);                    InvalidateRect (hwnd, NULL, FALSE);                    tvSetVScrollInfo (hwnd, pData, TRUE);                    break;                            case SCANCODE_END:                    pData->nItemTop = pData->nVisItemCount - pData->nVisCount;                    t = getItemFromCount (pData, pData->nVisItemCount);                    change_selected (hwnd, pData, t);                    InvalidateRect (hwnd, NULL, FALSE);                    tvSetVScrollInfo (hwnd, pData, TRUE);                    break;                            case SCANCODE_ENTER:                    NotifyParent (hwnd, pData->id, TVN_ENTER);                    break;                default:                    break;            }        }        break;                case MSG_LBUTTONDOWN:        {            int mouseX = LOSWORD(lParam);            int mouseY = HISWORD(lParam);            int right, left, count, h, c, rctop;            RECT rc;            PTVITEM p;            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            count = mouseY / pData->nItemHeight + 1;            count += pData->nItemTop;            if (count > pData->nVisItemCount)                break;            p = getItemFromCount(pData, count);            if (p == NULL)                 break;            h = pData->nItemHeight;            left = - pData->nLeft + TV_BOXGAP + p->depth * h;            if (pData->dwStyle & WS_BORDER)                left += TV_BORDER;            right = left + h + TV_BOXGAP + p->text_ext.cx;            if (pData->dwStyle & TVS_WITHICON)                right += h + TV_ICONGAP;            if (mouseX < left || mouseX > right)                break;            GetClientRect (hwnd, &rc);            rctop = rc.top;            if (mouseX <= left + h && mouseX >= left) {                if (p->child == NULL)                    break;                else {                    int count;                    CountFromItem (p, pData->pItemSelected, &count);                    if (count != 0)                        change_selected (hwnd, pData, p);                }                if (p->dwFlags & TVIF_FOLD) {                    p->dwFlags &= ~TVIF_FOLD;                    NotifyParentEx (hwnd, pData->id, TVN_UNFOLDED, (DWORD)p);                }                else {                    p->dwFlags |= TVIF_FOLD;                    NotifyParentEx (hwnd, pData->id, TVN_FOLDED, (DWORD)p);                }#if 0                p->dwFlags = (p->dwFlags & ~TVIF_FOLD) | (~p->dwFlags & TVIF_FOLD);#endif                pData->nWidth = getTVWidth (pData);                pData->nVisItemCount = getVisItemCount (pData);                rc.top = rctop + (count - pData->nItemTop - 1) * pData->nItemHeight;                if (pData->dwStyle & WS_BORDER)                    rc.top += TV_BORDER;                tvSetVScrollInfo (hwnd, pData, TRUE);                tvSetHScrollInfo (hwnd, pData, TRUE);                InvalidateRect (hwnd, &rc, FALSE);                break;            }            left = left + h;            if (mouseX <= right && mouseX >= left) {                if (p == pData->pItemSelected)                    break;                c = getCountFromItem (pData, pData->pItemSelected);                c = c - pData->nItemTop - 1;                if (c < 0)                    c = 0;                change_selected (hwnd, pData, p);                rc.top = rctop + c * pData->nItemHeight;                if (pData->dwStyle & WS_BORDER)                    rc.top += TV_BORDER;                rc.bottom = rc.top + pData->nItemHeight;                InvalidateRect (hwnd, &rc, FALSE);                rc.top = rctop + (count - pData->nItemTop - 1) * pData->nItemHeight;                if (pData->dwStyle & WS_BORDER)                    rc.top += TV_BORDER;                rc.bottom = rc.top + pData->nItemHeight;                InvalidateRect (hwnd, &rc, FALSE);            }        }        break;                case MSG_LBUTTONDBLCLK:        {            int mouseX = LOSWORD(lParam);            int mouseY = HISWORD(lParam);            int right, left, count, h;            PTVITEM p;            RECT rc;            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            count = mouseY / pData->nItemHeight + 1;            count += pData->nItemTop;            if (count > pData->nVisItemCount)                break;            p = getItemFromCount(pData, count);            if (p == NULL)                 break;            h = pData->nItemHeight;            left = - pData->nLeft + TV_BOXGAP + h + p->depth * h;            if (pData->dwStyle & WS_BORDER)                left += TV_BORDER;            right = left + TV_BOXGAP + p->text_ext.cx;            if (pData->dwStyle & TVS_WITHICON)                right += h + TV_ICONGAP;            if (p->child && mouseX <= right && mouseX >= left) {                if (p->dwFlags & TVIF_FOLD) {                    p->dwFlags &= ~TVIF_FOLD;                    NotifyParentEx (hwnd, pData->id, TVN_UNFOLDED, (DWORD)p);                }                else {                    p->dwFlags |= TVIF_FOLD;                    NotifyParentEx (hwnd, pData->id, TVN_FOLDED, (DWORD)p);                }#if 0                p->dwFlags = (p->dwFlags & ~TVIF_FOLD) | (~p->dwFlags & TVIF_FOLD);#endif                pData->nWidth = getTVWidth (pData);                pData->nVisItemCount = getVisItemCount (pData);                tvSetVScrollInfo (hwnd, pData, TRUE);                tvSetHScrollInfo (hwnd, pData, TRUE);                GetClientRect (hwnd, &rc);                rc.top += (count - pData->nItemTop - 1) * pData->nItemHeight;                if (pData->dwStyle & WS_BORDER)                    rc.top += TV_BORDER;                InvalidateRect (hwnd, &rc, FALSE);                break;            }        }        break;                case MSG_VSCROLL:        {            int newTop;            int scrollHeight = 0;            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            newTop = pData->nItemTop;            switch(wParam)            {                case SB_LINEDOWN:                    if ((pData->nItemTop + pData->nVisCount) < (pData->nVisItemCount)) {                        newTop ++;                        scrollHeight = - pData->nItemHeight;                    }                break;                                case SB_LINEUP:                    if (pData->nItemTop > 0) {                        newTop --;                        scrollHeight = pData->nItemHeight;                    }                break;                                case SB_PAGEDOWN:                    if ((pData->nItemTop + (pData->nVisCount << 1)) <= pData->nItemCount)                        newTop += pData->nVisCount;                    else                        newTop = pData->nVisItemCount - pData->nVisCount;                    scrollHeight = - (newTop - pData->nItemTop) * pData->nItemHeight;                    if (newTop < 0)                        return 0;                break;                case SB_PAGEUP:                    if (pData->nItemTop >= pData->nVisCount)                        newTop -= pData->nVisCount;                    else                        newTop = 0;                    scrollHeight = (pData->nItemTop - newTop) * pData->nItemHeight;                break;                case SB_THUMBTRACK:                    newTop = (int)lParam;                    scrollHeight = (pData->nItemTop - newTop) * pData->nItemHeight;                break;            }                        if (scrollHeight) {                pData->nItemTop = newTop;                tvSetVScrollInfo (hwnd, pData, TRUE);                UpdateWindow (hwnd, FALSE); /* SendMessage (hwnd, MSG_PAINT, 0, 0); */                return 0;            }        }        break;                case MSG_HSCROLL:        {            int newLeft;            int scrollWidth = 0;            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            newLeft = pData->nLeft;            switch(wParam)            {                case SB_LINERIGHT:                    if ((pData->nLeft + pData->nVisWidth) < (pData->nWidth)) {                        newLeft += GetSysCharWidth ();                        scrollWidth = - GetSysCharWidth ();                    }                break;                                case SB_LINELEFT:                    if (pData->nLeft > 0) {                        newLeft -= GetSysCharWidth ();                        scrollWidth = GetSysCharWidth ();                    }                break;                                case SB_PAGERIGHT:                    if ((pData->nLeft + (pData->nVisWidth << 1)) <= pData->nWidth)                        newLeft += pData->nVisWidth;                    else                        newLeft = pData->nWidth - pData->nVisWidth;                    scrollWidth = - (newLeft - pData->nLeft) * GetSysCharWidth ();                    if (newLeft < 0)                        return 0;                break;                case SB_PAGELEFT:                    if (pData->nLeft >= pData->nVisWidth)                        newLeft -= pData->nVisWidth;                    else                        newLeft = 0;                    scrollWidth = (pData->nLeft - newLeft) * GetSysCharWidth ();                break;                case SB_THUMBTRACK:                    newLeft = (int)lParam;                    scrollWidth = (pData->nLeft - newLeft) * GetSysCharWidth ();                break;            }                        if (scrollWidth) {                pData->nLeft = newLeft;                tvSetHScrollInfo (hwnd, pData, TRUE);                UpdateWindow (hwnd, FALSE); /* SendMessage (hwnd, MSG_PAINT, 0, 0); */                return 0;            }        }        break;        case MSG_SETFOCUS:            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            NotifyParent (hwnd, pData->id, TVN_SETFOCUS);            if (pData->dwStyle & TVS_FOCUS)                break;            pData->dwStyle |= TVS_FOCUS;            InvalidateRect (hwnd, NULL, FALSE);            break;        case MSG_KILLFOCUS:            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            NotifyParent (hwnd, pData->id, TVN_KILLFOCUS);            if (!(pData->dwStyle & TVS_FOCUS))                break;            pData->dwStyle &= ~TVS_FOCUS;            InvalidateRect (hwnd, NULL, FALSE);            break;                case MSG_GETDLGCODE:            return DLGC_WANTARROWS | DLGC_WANTCHARS;        case MSG_FONTCHANGED:            pData = (PTVDATA) GetWindowAdditionalData2 (hwnd);            tvRecalcWidths (hwnd, pData);            return 0;        default:            break;    }        return DefaultControlProc (hwnd, message, wParam, lParam);}#endif /* _EXT_CTRL_TREEVIEW */

⌨️ 快捷键说明

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