📄 treeview.c
字号:
} 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 + -