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

📄 tlmisc.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 2 页
字号:
					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_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 = sUpItem (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, NULL);
				}
				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, NULL);
					}
					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) 
			{
				while (p->nextItem) 
					p = p->nextItem;

				if ((p->childItem) && (p->state & TLIS_EXPANDED))
					p = p->childItem;
			}

			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, NULL);
					}

					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

static BOOL 
sIterateSelected (
		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)
			sIterateSelected (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 (sIterateSelected (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 + -