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