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

📄 tlmouse.c

📁 可以实现对邮件的加密解密以及签名
💻 C
📖 第 1 页 / 共 4 页
字号:
						SetCapture (pWD->hWnd);
				}
			}
		}
	}
}


//	_______________________________________________
//
//  Handle mouse move event

void 
TLEndDrag (
		TLWndData*	pWD, 
		LPARAM		lParam) 
{
	POINT	mpt;

	if (!pWD->bDragging) 
		return;

	ReleaseCapture ();
	SetCursor (pWD->hCursorNormal);

	if (!(pWD->style & TLS_INTERNALDRAG)) 
		return;

	TLDeDragOverTree (pWD, pWD->rootItem, NULL);

	mpt.x = LOWORD (lParam);
	mpt.y = HIWORD (lParam);

	if (PtInRect (&(pWD->tlInval), mpt)) 
		pWD->nmTreeList.index = 1;
	else 
		pWD->nmTreeList.index = 0;

	pWD->nmTreeList.itemNew.hItem = NULL;
	pWD->nmTreeList.itemOld.hItem = NULL;
	pWD->nmTreeList.hdr.code = TLN_DROP;
	SendMessage (pWD->hWndParent, 
			WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList));
}


//	_______________________________________________
//
//  Handle left mouse button down event

void 
TLLeftButtonDown (
		TLWndData*	pWD, 
		WPARAM		wParam, 
		LPARAM		lParam) 
{
	int i, iHitType, iHitSubItem;
	TLTreeItem* pHit;
	TLColumnItem* pci;
	TLListItem* pli;
	POINT mpt;
	BOOL bControl, bShift;

	mpt.x = LOWORD (lParam);
	mpt.y = HIWORD (lParam);

	if (pWD->style & TLS_SINGLESELECT) 
	{
		bControl = FALSE;
		bShift = FALSE;
	}
	else 
	{
		if (wParam & MK_CONTROL) 
			bControl = TRUE;
		else 
			bControl = FALSE;

		if (GetKeyState (VK_SHIFT) & 0x8000) 
			bShift = TRUE;
		else 
			bShift = FALSE;
	}

	pWD->nmTreeList.hdr.code = 0;
	pWD->nmTreeList.itemNew.hItem = NULL;
	pWD->nmTreeList.itemNew.state = 0;
	pWD->nmTreeList.itemOld.hItem = NULL;

	pHit = sPointSearchEx (pWD, pWD->rootItem, pWD->columnItem,
		  pWD->iFirstColumnWidth - pWD->iHorizontalPos,
		  mpt, &iHitType, &iHitSubItem);

	if (pWD->style & TLS_DRAGSELECTION) 
	{
		if (mpt.x < (DRAGSELECTINDENT - pWD->iHorizontalPos))
		{
			TLDeselectTree (pWD, pWD->rootItem, NULL);
			pWD->bSelectDragging = TRUE;
		}
	}

	switch (iHitType) {
	case TLK_NONE :
		if (bControl || bShift) 
			return;

		TLDeselectTree (pWD, pWD->rootItem, NULL);
		pWD->firstSelectItem = NULL;
		pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
		if (pWD->focusItem) 
		{
			pHit = pWD->focusItem;
			pWD->focusItem = NULL;
			TLInvalidateItem (pWD, pHit);
		}
		break;

	case TLK_BUTTON :
		if (pHit->state & TLIS_EXPANDED) 
		{
			pHit->state &= ~TLIS_EXPANDED;
			if (TLDeselectTree (pWD, pHit->childItem, NULL) ||
				(pWD->focusItem == NULL) ||
				!(pWD->focusItem->state & TLIS_SELECTED)) 
			{
				TLDeselectTree (pWD, pWD->rootItem, NULL);
				pWD->iNumberSelected = 1;
				pHit->state |= TLIS_SELECTED | TLIS_FOCUSED;
				pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
				pWD->nmTreeList.itemNew.state = pHit->state;
				pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
				pWD->focusItem = pHit;
			}
		}
		else 
		{
			pHit->state |= TLIS_EXPANDED;
			if (bControl) 
				TLExpandTree (pHit->childItem);
			TLExpandAutoScroll (pWD, pHit);

			if ((pWD->focusItem == NULL) ||
				!(pWD->focusItem->state & TLIS_SELECTED))
			{
				TLDeselectTree (pWD, pWD->rootItem, NULL);
				pWD->iNumberSelected = 1;
				pHit->state |= TLIS_SELECTED | TLIS_FOCUSED;
				pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
				pWD->nmTreeList.itemNew.state = pHit->state;
				pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
				pWD->focusItem = pHit;
			}
		}
		InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
		break;

	case TLK_ACTIVE :
		if (iHitSubItem == 0)
		{
			pWD->clickedTreeItem = pHit;
			pWD->clickedListItem = NULL;
			TLInvalidateItem (pWD, pHit);
		}
		else
		{
			pci = pWD->columnItem;
			for (i=1; i<iHitSubItem; i++)
				pci = pci->nextItem;

			if (pci->iDataFmt == TLCFMT_IMAGE) 
			{
				pWD->clickedTreeItem = pHit;
				pli = pHit->listItem;
				for (i=1; i<iHitSubItem; i++) 
					pli = pli->nextItem;
				pli->state |= TLIS_CLICKED;
				pWD->clickedListItem = pli;
				TLInvalidateItem (pWD, pHit);
			}
		}
		// fall through to select item

	case TLK_SELECT :
		SendMessage (pWD->hWndToolTip, TTM_TRACKACTIVATE, FALSE, 0);
		if (!pWD->firstSelectItem) 
			pWD->firstSelectItem = pHit;
		if (!bShift) 
			pWD->firstSelectItem = pHit;

		if ((pHit->parentItem == pWD->firstSelectItem->parentItem) ||
			((pWD->style & TLS_PROMISCUOUS) && !bShift)) 
		{
			if (bShift) 
			{
				TLDeselectTree (pWD, pWD->rootItem, NULL);
				pWD->iNumberSelected = 0;
				TLSelectRange (pWD, pWD->rootItem, pHit, NULL);
				pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
				pWD->nmTreeList.itemNew.state = pHit->state;
				pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
			}
			else 
			{
				if (pWD->bSelectDragging && bControl)
				{
					TLSelectChildren (pWD, NULL);
					pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
					pWD->nmTreeList.itemNew.state = pHit->state;
					pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
				}
				else if (!(pHit->state & TLIS_SELECTED)) 
				{
					if (!bControl) 
					{
						if (!bControl && !bShift) 
						{
							TLDeselectTree (pWD, pWD->rootItem, pHit);
							pWD->iNumberSelected = 0;
						}
						pHit->state |= TLIS_SELECTED;
						(pWD->iNumberSelected)++;
						if (TLSelectAutoScroll (pWD, pHit))
							InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
						pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
						pWD->nmTreeList.itemNew.state = pHit->state;
						pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
					}
				}
			}

			if (pWD->focusItem != pHit) 
			{
				if (pWD->focusItem) 
				{
					pWD->focusItem->state &= ~TLIS_FOCUSED;
					pWD->nmTreeList.itemOld.hItem = (HTLITEM)pWD->focusItem;
					pWD->nmTreeList.itemOld.state = pWD->focusItem->state;
					TLInvalidateItem (pWD, pWD->focusItem);
				}
				pHit->state |= TLIS_FOCUSED;
				pWD->focusItem = pHit;
			}
			TLInvalidateItem (pWD, pHit);
		}
		break;
	}

	if (pWD->nmTreeList.hdr.code) 
	{
		pWD->nmTreeList.flags |= TLC_BYMOUSE;

		if (pWD->iNumberSelected > 1) 
			pWD->nmTreeList.flags |= TLC_MULTIPLE;

		pWD->nmTreeList.ptDrag = mpt;
		SendMessage (pWD->hWndParent, 
				WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList));
	}
}


//	_______________________________________________
//
//  Handle drag scrolling timer event

VOID 
TLDragScroll (
		TLWndData* pWD) 
{
	POINT		pt;

	pWD->uDragScrollState = 0;

	if ((pWD->bDragging && (pWD->style & TLS_INTERNALDRAG)) ||
		(pWD->bSelectDragging))
	{
		GetCursorPos (&pt);
		ScreenToClient (pWD->hWnd, &pt);
		TLMouseMove (pWD, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
	}
}


//	_______________________________________________
//
//  Handle left mouse button down event

BOOL 
TLDragOver (
		TLWndData*	pWD,
		LPARAM		lParam) 
{
	int			iHitType, iHitSubItem, irow;
	TLTreeItem* pHit;
	POINT		mpt;
	BOOL		bRet;

	BOOL	bShift = FALSE;

	mpt.x = LOWORD (lParam);
	mpt.y = HIWORD (lParam);

	pWD->nmTreeList.hdr.code = 0;
	pWD->nmTreeList.itemNew.hItem = NULL;
	pWD->nmTreeList.itemNew.state = 0;
	pWD->nmTreeList.itemOld.hItem = NULL;

	pHit = sPointSearchEx (pWD, pWD->rootItem, pWD->columnItem,
		  pWD->iFirstColumnWidth - pWD->iHorizontalPos,
		  mpt, &iHitType, &iHitSubItem);

	switch (iHitType) {
	case TLK_NONE :
		pWD->uDragScrollState = 0;
		TLDeselectTree (pWD, pWD->rootItem, NULL);
		pWD->firstSelectItem = NULL;
		if (pWD->focusItem) 
		{
			pHit = pWD->focusItem;
			pWD->focusItem = NULL;
		}
		pWD->nmTreeList.itemNew.hItem = NULL;
		pWD->nmTreeList.itemNew.state = 0;
		pWD->nmTreeList.hdr.code = TLN_DRAGGEDOVER;
		bRet = FALSE;
		break;

	default :
		if (pWD->uDragScrollState == 0) 
		{
			irow = 0;
			TLGetRow (pWD->rootItem, pHit, &irow);
			if (irow == pWD->iFirstRow) 
			{
				pWD->iFirstRow--;
				if (pWD->iFirstRow < 0)
					pWD->iFirstRow = 0;
				else 
				{
					SetTimer (pWD->hWnd, 
							DRAGSCROLLTIMERID, DRAGSCROLLTIME, NULL);
					pWD->uDragScrollState = DRAGSCROLL_DOWN;
					pWD->nmTreeList.itemNew.hItem = NULL;
					pWD->nmTreeList.itemNew.state = 0;
					pWD->nmTreeList.hdr.code = TLN_AUTOSCROLLED;
					bRet = FALSE;
					break;
				}
			}

			if (irow == (pWD->iFirstRow + pWD->iMaxRows)) 
			{
				pWD->iFirstRow++;
				SetTimer (pWD->hWnd, 
						DRAGSCROLLTIMERID, DRAGSCROLLTIME, NULL);
				pWD->uDragScrollState = DRAGSCROLL_UP;
				pWD->nmTreeList.itemNew.hItem = NULL;
				pWD->nmTreeList.itemNew.state = 0;
				pWD->nmTreeList.hdr.code = TLN_AUTOSCROLLED;
				bRet = FALSE;
				break;
			}
		}
		pWD->firstSelectItem = pHit;

		if (!(pHit->state & TLIS_SELECTED)) 
		{
			TLDeselectTree (pWD, pWD->rootItem, pHit);
			pWD->iNumberSelected = 0;
			pHit->state |= TLIS_SELECTED;
			(pWD->iNumberSelected)++;
			pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
			pWD->nmTreeList.itemNew.state = pHit->state;
			pWD->nmTreeList.hdr.code = TLN_DRAGGEDOVER;
		}

		if (pWD->focusItem != pHit) 
		{
			if (pWD->focusItem) 
			{
				pWD->focusItem->state &= ~TLIS_FOCUSED;
				pWD->nmTreeList.itemOld.hItem = (HTLITEM)pWD->focusItem;
				pWD->nmTreeList.itemOld.state = pWD->focusItem->state;
			}
		}
		bRet = TRUE;
		break;
	}

	if (pWD->nmTreeList.hdr.code) 
	{
		pWD->nmTreeList.flags |= TLC_BYMOUSE;
		pWD->nmTreeList.ptDrag = mpt;
		SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
						(LPARAM)&(pWD->nmTreeList));
	}

	return bRet;
}


//	_______________________________________________
//
//  Handle left mouse button up event

void 
TLLeftButtonUp (
		TLWndData*	pWD, 
		WPARAM		wParam, 
		LPARAM		lParam) 
{
	int iHitType, iHitSubItem;
	TLTreeItem* pHit;
	POINT mpt;
	BOOL bControl, bShift;

	mpt.x = LOWORD (lParam);
	mpt.y = HIWORD (lParam);

	if (pWD->style & TLS_SINGLESELECT) 
	{
		bControl = FALSE;
		bShift = FALSE;
	}
	else
	{
		if (wParam & MK_CONTROL) 
			bControl = TRUE;
		else 
			bControl = FALSE;

		if (GetKeyState (VK_SHIFT) & 0x8000)
			bShift = TRUE;
		else 
			bShift = FALSE;
	}

	pWD->nmTreeList.hdr.code = 0;
	pWD->nmTreeList.itemNew.hItem = NULL;
	pWD->nmTreeList.itemNew.state = 0;
	pWD->nmTreeList.itemOld.hItem = NULL;

	pHit = sPointSearchEx (pWD, pWD->rootItem, pWD->columnItem,
			pWD->iFirstColumnWidth - pWD->iHorizontalPos,
			mpt, &iHitType, &iHitSubItem);

	switch (iHitType) {
	case TLK_NONE :
		break;

	case TLK_BUTTON :
		break;

	case TLK_ACTIVE :
		if (pHit == pWD->clickedTreeItem) 
		{
			pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
			pWD->nmTreeList.itemNew.state = pHit->state;
			pWD->nmTreeList.index = iHitSubItem;

			if (iHitSubItem == 0)
			{
				pWD->nmTreeList.hdr.code = TLN_TREEITEMCLICKED;
				pWD->clickedTreeItem = NULL;
			}
			else
				pWD->nmTreeList.hdr.code = TLN_LISTITEMCLICKED;
		}
		break;

	case TLK_SELECT :
		if (!pWD->firstSelectItem) 
			pWD->firstSelectItem = pHit;
		if (!bShift) 
			pWD->firstSelectItem = pHit;
		if ((pHit->parentItem == pWD->firstSelectItem->parentItem) ||
			((pWD->style & TLS_PROMISCUOUS) && !bShift)) 
		{
			if (!bShift)
			{
				if (pHit->state & TLIS_SELECTED) 
				{
					if (bControl) 
					{
						pHit->state &= ~TLIS_SELECTED;
						(pWD->iNumberSelected)--;
						TLInvalidateItem (pWD, pHit);
						pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
						pWD->nmTreeList.itemNew.state = pHit->state;
						pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
					}
					else 
					{
						TLDeselectTree (pWD, pWD->rootItem, pHit);
						pHit->state |= TLIS_SELECTED;
						pWD->iNumberSelected = 1;
						if (TLSelectAutoScroll (pWD, pHit))
							InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
						pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
						pWD->nmTreeList.itemNew.state = pHit->state;
						pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
					}
				}
				else 
				{
					if (bControl) 
					{
						pHit->state |= TLIS_SELECTED;
						(pWD->iNumberSelected)++;
						TLInvalidateItem (pWD, pHit);
						if (TLSelectAutoScroll (pWD, pHit))
							InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
						pWD->nmTreeList.itemNew.hItem = (HTLITEM)pHit;
						pWD->nmTreeList.itemNew.state = pHit->state;
						pWD->nmTreeList.hdr.code = TLN_SELCHANGED;
					}
				}
			}

			if (bShift || bControl)
			{
				if (pWD->focusItem != pHit) 
				{
					if (pWD->focusItem) 
					{
						pWD->focusItem->state &= ~TLIS_FOCUSED;
						pWD->nmTreeList.itemOld.hItem =
								(HTLITEM)pWD->focusItem;
						pWD->nmTreeList.itemOld.state =
								pWD->focusItem->state;
						TLInvalidateItem (pWD, pWD->focusItem);
					}
					pHit->state |= TLIS_FOCUSED;
					pWD->focusItem = pHit;
					TLInvalidateItem (pWD, pHit);
				}
			}
		}
		break;
	}

	if (pWD->clickedTreeItem) 
	{
		if (pWD->clickedListItem)
			pWD->clickedListItem->state &= ~TLIS_CLICKED;
		TLInvalidateItem (pWD, pWD->clickedTreeItem);
		pWD->clickedTreeItem = NULL;
	}

	if (pWD->nmTreeList.hdr.code)
	{
		pWD->nmTreeList.flags |= TLC_BYMOUSE;
		if (pWD->iNumberSelected > 1) 
			pWD->nmTreeList.flags |= TLC_MULTIPLE;

⌨️ 快捷键说明

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