📄 tlmouse.c
字号:
}
else
SendMessage (pWD->hWndToolTip, TTM_TRACKACTIVATE, FALSE, 0);
}
//----------------------------------------------------|
// Handle mouse move event
void TLMouseMove (TLWndData* pWD, WPARAM wParam, LPARAM lParam) {
POINT mpt;
int iHitSubItem;
TLTreeItem* pHit;
mpt.x = LOWORD (lParam);
mpt.y = HIWORD (lParam);
// if left button is not pressed, make sure dragging is finished
if (!(wParam & MK_LBUTTON)) {
if (pWD->bDragging) {
TLEndDrag (pWD, lParam);
pWD->bDragging = FALSE;
}
// then worry about whether we should display tooltip text
if (wParam == 0) {
pHit = TextItemSearch (pWD->rootItem, pWD->columnItem,
pWD->iFirstColumnWidth - pWD->iHorizontalPos,
mpt, &iHitSubItem);
ShowTooltipText (pWD, pHit, iHitSubItem);
}
return;
}
// user is dragging something around within window
if (pWD->bDragging && (pWD->style & TLS_INTERNALDRAG)) {
DragOverInternal (pWD, lParam);
}
// if user has previously pressed an active region
else if (pWD->clickedTreeItem) {
if (PointInActiveArea (pWD->clickedTreeItem, pWD->columnItem,
pWD->iFirstColumnWidth - pWD->iHorizontalPos, mpt))
pWD->clickedListItem->state |= TLIS_CLICKED;
else
pWD->clickedListItem->state &= ~TLIS_CLICKED;
TLInvalidateItem (pWD, pWD->clickedTreeItem);
}
// user is starting a drag operation
else if (!pWD->bDragging) {
if ((pWD->iNumberSelected > 0) && (pWD->ptButtonDown.x > 0)) {
if ((abs(pWD->ptButtonDown.x-LOWORD(lParam))>DRAGDEADZONE) ||
(abs(pWD->ptButtonDown.y-HIWORD(lParam))>DRAGDEADZONE)) {
NMHDR nmhdr;
pWD->bDragging = TRUE;
nmhdr.code = TLN_BEGINDRAG;
SendMessage (pWD->hWndParent, WM_NOTIFY, pWD->id,
(LPARAM)&nmhdr);
if (pWD->style & TLS_INTERNALDRAG) 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 = PointSearchEx (pWD->rootItem, pWD->columnItem,
pWD->iFirstColumnWidth - pWD->iHorizontalPos,
mpt, &iHitType, &iHitSubItem);
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)) {
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);
}
InvalidateRect (pWD->hWnd, &pWD->tlInval, TRUE);
break;
case TLK_ACTIVE :
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);
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)) {
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 = PointSearchEx (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 = PointSearchEx (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.hdr.code = TLN_LISTITEMCLICKED;
pWD->nmTreeList.index = iHitSubItem;
}
break;
case TLK_SELECT :
if (!pWD->firstSelectItem) pWD->firstSelectItem = pHit;
// if (!bControl && !bShift) 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -