📄 tlmisc.c
字号:
}
pWD->focusItem->state |= TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
if (TLSelectAutoScroll (pWD, pWD->focusItem))
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
}
break;
case VK_PRIOR :
iCurrentRow = 0;
TLGetRow (pWD->rootItem, pWD->focusItem, &iCurrentRow);
if (iCurrentRow == pWD->iFirstRow)
iFinalRow = iCurrentRow - pWD->iMaxRows +1;
else
iFinalRow = pWD->iFirstRow;
if (iFinalRow < 0) iFinalRow = 0;
p = pWD->focusItem;
while (iCurrentRow > iFinalRow) {
p = UpItem (p, bShift);
iCurrentRow--;
}
if (p != pWD->focusItem) {
pWD->focusItem->state &= ~TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
pWD->focusItem = p;
if (bShift) {
TLDeselectTree (pWD, pWD->rootItem, NULL);
if (!pWD->firstSelectItem) pWD->firstSelectItem = p;
pWD->iNumberSelected = 0;
TLSelectRange (pWD, pWD->rootItem, p);
}
else if (!bControl) {
TLDeselectTree (pWD, pWD->rootItem, NULL);
if (!pWD->firstSelectItem) pWD->firstSelectItem = p;
if (!bShift) pWD->firstSelectItem = p;
pWD->iNumberSelected = 1;
pWD->focusItem->state |= TLIS_SELECTED;
pWD->nmTreeList.flags |= TLC_BYKEYBOARD;
}
pWD->focusItem->state |= TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
if (TLSelectAutoScroll (pWD, pWD->focusItem))
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
}
break;
case VK_HOME :
p = pWD->rootItem;
if (p != pWD->focusItem) {
pWD->focusItem->state &= ~TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
pWD->focusItem = p;
if (!bControl) {
TLDeselectTree (pWD, pWD->rootItem, NULL);
if (!pWD->firstSelectItem) pWD->firstSelectItem = p;
if (!bShift) {
pWD->iNumberSelected = 1;
pWD->firstSelectItem = p;
}
else {
pWD->iNumberSelected = 0;
TLSelectRange (pWD, pWD->rootItem, p);
}
pWD->focusItem->state |= TLIS_SELECTED;
pWD->nmTreeList.flags |= TLC_BYKEYBOARD;
}
pWD->focusItem->state |= TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
if (TLSelectAutoScroll (pWD, pWD->focusItem))
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
}
break;
case VK_END :
p = pWD->rootItem;
while (p->nextItem) p = p->nextItem;
if (p != pWD->focusItem) {
pWD->focusItem->state &= ~TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
pWD->focusItem = p;
if (!bControl) {
TLDeselectTree (pWD, pWD->rootItem, NULL);
if (!pWD->firstSelectItem) pWD->firstSelectItem = p;
if (!bShift) {
pWD->iNumberSelected = 1;
pWD->firstSelectItem = p;
}
else {
pWD->iNumberSelected = 0;
TLSelectRange (pWD, pWD->rootItem, p);
}
pWD->focusItem->state |= TLIS_SELECTED;
pWD->nmTreeList.flags |= TLC_BYKEYBOARD;
}
pWD->focusItem->state |= TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
if (TLSelectAutoScroll (pWD, pWD->focusItem))
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
}
break;
case VK_SPACE :
if (bControl) {
p = pWD->focusItem;
if (pWD->focusItem->state & TLIS_SELECTED) {
pWD->focusItem->state &= ~TLIS_SELECTED;
pWD->iNumberSelected--;
}
else {
pWD->focusItem->state |= TLIS_SELECTED;
pWD->iNumberSelected++;
}
pWD->nmTreeList.flags |= TLC_BYKEYBOARD;
TLInvalidateItem (pWD, pWD->focusItem);
}
break;
}
}
if (pWD->nmTreeList.flags) {
if (pWD->iNumberSelected > 1) pWD->nmTreeList.flags |= TLC_MULTIPLE;
pWD->nmTreeList.itemOld.hItem = NULL;
if (pWD->iNumberSelected > 0) {
pWD->nmTreeList.itemNew.hItem = (HTLITEM)p;
pWD->nmTreeList.itemNew.state = p->state;
}
else {
pWD->nmTreeList.itemNew.hItem = NULL;
pWD->nmTreeList.itemNew.state = 0;
}
pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
(LPARAM)&(pWD->nmTreeList));
return TRUE;
}
else {
pWD->nmKeyDown.hdr.code = TLN_KEYDOWN;
pWD->nmKeyDown.wVKey = ch;
pWD->nmKeyDown.flags = lP;
SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
(LPARAM)&(pWD->nmKeyDown));
return FALSE;
}
}
//----------------------------------------------------|
// Process selected objects by calling callback function
BOOL IterateSelected (TLTreeItem* pStart, LPARAM lParam) {
TL_TREEITEM tli;
TLTreeItem* p;
FARPROC lpfnCallback;
lpfnCallback = *(FARPROC*)lParam;
if (!pStart) return FALSE;
p = pStart;
while (p->nextItem) p = p->nextItem;
while (p) {
if (p->state & TLIS_EXPANDED)
IterateSelected (p->childItem, lParam);
if (p->state & TLIS_SELECTED) {
tli.hItem = (HTLITEM)p;
tli.pszText = p->pszText;
tli.iImage = p->iImage;
tli.lParam = p->lParam;
p = p->prevItem;
if (!(lpfnCallback)(&tli, lParam)) return FALSE;
}
else p = p->prevItem;
}
return TRUE;
}
BOOL TLIterateSelected (TLWndData* pWD, LPARAM lParam) {
return (IterateSelected (pWD->rootItem, lParam));
}
//----------------------------------------------------|
// Scroll to keyboard-selected key
//
// c = character just typed by user
// bStillTyping = TRUE => this character is part of a previous
// string of characters => append to end.
BOOL TLSelectByKeyboard (TLWndData* pWD, LONG c, BOOL bStillTyping) {
INT i;
TLTreeItem* p;
TLTreeItem* pfirst;
// return if non-printable character
if (!isprint (c)) return FALSE;
// escape key deselects selection and clears buffer
if (c == VK_ESCAPE) {
pWD->pTypeBufPtr = &(pWD->szTypeBuf[0]);
pWD->iNumCharInTypeBuf = 0;
if (pWD->focusItem) {
pWD->focusItem->state &= ~TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
TLDeselectTree (pWD, pWD->rootItem, NULL);
}
pWD->focusItem = NULL;
pWD->firstSelectItem = NULL;
pWD->iNumberSelected = 0;
pWD->nmTreeList.flags = TLC_BYKEYBOARD;
pWD->nmTreeList.itemOld.hItem = NULL;
pWD->nmTreeList.itemNew.hItem = NULL;
pWD->nmTreeList.itemNew.state = 0;
pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
(LPARAM)&(pWD->nmTreeList));
return FALSE;
}
// convert to lower case
(CHAR)c = tolower ((CHAR)c);
// get starting point for traversing linked list
if (pWD->focusItem) {
p = pWD->focusItem;
while (p->parentItem) p = p->parentItem;
}
else p = pWD->rootItem;
if (!p) return FALSE;
pfirst = p;
// if only one char in buffer and incoming is same character
// then step to next item which begins with this character
if ((pWD->iNumCharInTypeBuf == 1) &&
(pWD->szTypeBuf[0] == (CHAR)c))
{
if (p->nextItem) p = p->nextItem;
else p = pWD->rootItem;
while (tolower (p->pszText[0]) != pWD->szTypeBuf[0]) {
if (p->nextItem) p = p->nextItem;
else p = pWD->rootItem;
if (p == pfirst) break;
}
}
// otherwise do standard matching
else {
if (!bStillTyping) {
pWD->iNumCharInTypeBuf = 0;
pWD->pTypeBufPtr = &(pWD->szTypeBuf[0]);
}
if (pWD->iNumCharInTypeBuf < TYPEBUFFERSIZE-1) {
*(pWD->pTypeBufPtr) = (CHAR)c;
(pWD->pTypeBufPtr)++;
*(pWD->pTypeBufPtr) = '\0';
pWD->iNumCharInTypeBuf++;
if (p->nextItem) p = p->nextItem;
i = lstrlen (pWD->szTypeBuf);
while (strnicmp (p->pszText, pWD->szTypeBuf, i) != 0) {
if (p->nextItem) p = p->nextItem;
else p = pWD->rootItem;
if (p == pfirst) break;
}
}
}
// if we have selected new item then handle selection/deselection and
// notify parent of selection change
if (p != pfirst) {
if (pWD->focusItem) {
pWD->focusItem->state &= ~TLIS_FOCUSED;
TLInvalidateItem (pWD, pWD->focusItem);
TLDeselectTree (pWD, pWD->rootItem, NULL);
}
pWD->focusItem = p;
pWD->iNumberSelected = 1;
pWD->firstSelectItem = p;
pWD->focusItem->state |= TLIS_FOCUSED | TLIS_SELECTED;
TLInvalidateItem (pWD, pWD->focusItem);
if (TLSelectAutoScroll (pWD, pWD->focusItem))
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
pWD->nmTreeList.flags = TLC_BYKEYBOARD;
pWD->nmTreeList.itemOld.hItem = NULL;
pWD->nmTreeList.itemNew.hItem = (HTLITEM)p;
pWD->nmTreeList.itemNew.state = p->state;
pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
(LPARAM)&(pWD->nmTreeList));
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -