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

📄 tlmisc.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				}
				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 + -