📄 categorybar.cpp
字号:
int index, ht = HitTestEx(point, index);
if (ht != htFolder && iLastFolderHighlighted >= 0) HighlightFolder(-1);
if (ht != htItem && iLastItemHighlighted >= 0) HighlightItem(-1);
if (ht == htFolder)
{
HighlightFolder(index);
// SetTimer(1,100,NULL);
}
else if (ht == htItem)
{
HighlightItem(index);
// SetTimer(1,100,NULL);
}
CWnd::OnMouseMove(nFlags, point);
}
int CCategoryBar::HitTestEx(const CPoint & point, int &index)
{
if (bUpArrow && rcUpArrow.PtInRect(point)) return htUpScroll;
if (bDownArrow && rcDownArrow.PtInRect(point)) return htDownScroll;
int max = arFolder.GetSize(), t;
CRect rc;
for (t = 0; t < max; t++)
{
GetFolderRect(t, rc);
if (rc.PtInRect(point))
{
index = t;
return htFolder;
}
}
GetInsideRect(rc);
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
max = pbf->GetItemCount();
for (t = iFirstItem; t < max; t++)
{
CRect itemRc;
if (!IsSmallIconView())
{
GetIconRect(iSelFolder, t, itemRc);
if (itemRc.PtInRect(point))
{
index = t;
return htItem;
}
else if (itemRc.top > rc.bottom) break;
GetLabelRect(iSelFolder, t, itemRc);
itemRc.top -= yLargeIconLabelOffset;
if (itemRc.PtInRect(point))
{
index = t;
return htItem;
}
else if (itemRc.top > rc.bottom) break;
}
else
{
GetItemRect(iSelFolder, t, itemRc);
if (itemRc.PtInRect(point))
{
index = t;
return htItem;
}
else if (itemRc.top > rc.bottom) break;
}
}
return htNothing;
}
void CCategoryBar::HighlightFolder(const int index)
{
CWnd * pf = GetFocus();
if (pf != NULL && pf != this && IsChild(pf)) return;
if (iLastFolderHighlighted == index) return;
if (iLastFolderHighlighted >= 0)
{
CRect rc;
if (GetFolderRect(iLastFolderHighlighted, rc))
{
CClientDC dc(this);
CPen pn(PS_SOLID, 1, crBackGroundColor1);//crShadowBorder);
CPen * op = dc.SelectObject(&pn);
dc.MoveTo(rc.left, rc.bottom-1);
dc.LineTo(rc.right-1, rc.bottom-1);
dc.LineTo(rc.right-1, rc.top);
CPen pn1(PS_SOLID, 1, cr3dFace);
dc.SelectObject(&pn1);
dc.MoveTo(rc.left+1, rc.bottom-2);
dc.LineTo(rc.right-2, rc.bottom-2);
dc.LineTo(rc.right-2, rc.top+1);
dc.SelectObject(op);
// fix potential resource leak - KStowell - 10-21-99
pn.DeleteObject();
}
}
iLastFolderHighlighted = index;
if (iLastFolderHighlighted >= 0)
{
CRect rc;
if (GetFolderRect(iLastFolderHighlighted, rc))
{
CClientDC dc(this);
CPen pn(PS_SOLID, 1, crDkShadowBorder);
CPen * op = dc.SelectObject(&pn);
dc.MoveTo(rc.left, rc.bottom-1);
dc.LineTo(rc.right-1, rc.bottom-1);
dc.LineTo(rc.right-1, rc.top);
CPen pn1(PS_SOLID, 1, crBackGroundColor1);
dc.SelectObject(&pn1);
dc.MoveTo(rc.left+1, rc.bottom-2);
dc.LineTo(rc.right-2, rc.bottom-2);
dc.LineTo(rc.right-2, rc.top+1);
dc.SelectObject(op);
// fix potential resource leak - KStowell - 10-21-99
pn.DeleteObject();
}
}
}
void CCategoryBar::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (GetFocus() != this) SetFocus();
int index, ht = HitTestEx(point, index);
iLastDragItemDrawType = -1;
CRect inRc;
GetInsideRect(inRc);
if (ht == htFolder)
{
bool bHigh = true;
CRect rc;
GetFolderRect(index, rc);
if (::GetCapture() == NULL)
{
SetCapture();
ASSERT(this == GetCapture());
CClientDC dc(this);
DrawFolder(&dc, index, rc, true);
AfxLockTempMaps();
for (;;)
{
MSG msg;
VERIFY(::GetMessage(&msg, NULL, 0, 0));
if (CWnd::GetCapture() != this) break;
switch (msg.message)
{
case WM_MOUSEMOVE:
{
CPoint pt(msg.lParam);
int idx, ht1 = HitTestEx(pt, idx);
if (ht1 == htFolder && idx == index)
{
if (!bHigh)
{
DrawFolder(&dc, index, rc, true);
bHigh = true;
}
}
else
{
if (bHigh)
{
DrawFolder(&dc, index, rc, false);
bHigh = false;
}
}
}
break;
case WM_LBUTTONUP:
{
if (bHigh)
{
DrawFolder(&dc, index, rc, false);
bHigh = false;
}
CPoint pt(msg.lParam);
int idx, ht1 = HitTestEx(pt, idx);
if (ht1 == htFolder && idx != iSelFolder)
SetSelFolder(idx);
}
goto ExitLoop2;
case WM_KEYDOWN:
if (msg.wParam != VK_ESCAPE)
break;
default:
DispatchMessage(&msg);
break;
}
}
ExitLoop2:
ReleaseCapture();
AfxUnlockTempMaps(FALSE);
}
if (bHigh) InvalidateRect(rc, false);
}
else iLastSelectedFolder = -1;
if (ht == htItem)
{
iLastDragItemDraw = -1;
bool bHigh = true, bDragging = false;
CRect rc;
GetItemRect(iSelFolder, index, rc);
HCURSOR hCur = GetCursor();
if (::GetCapture() == NULL)
{
SetCapture();
ASSERT(this == GetCapture());
CClientDC dc(this);
HighlightItem(index, true);
AfxLockTempMaps();
for (;;)
{
MSG msg;
VERIFY(::GetMessage(&msg, NULL, 0, 0));
if (CWnd::GetCapture() != this) break;
switch (msg.message)
{
case WM_MOUSEMOVE:
{
CPoint pt(msg.lParam);
int idx, ht1 = HitTestEx(pt, idx);
if (bDragging)
{
if (ht1 == htItem)
DrawDragArrow(&dc, index, idx);
else
{
CRect rcItem;
GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
DrawDragArrow(&dc, index, GetItemCount());
else
DrawDragArrow(&dc, index, -1);
}
}
else
{
if (ht1 == htItem && idx == index)
{
if (!bHigh)
{
HighlightItem(index, true);
bHigh = true;
bPressedHighlight = true;
}
}
else
{
if (ht1 == htItem)
{
if (bHigh)
{
HighlightItem(index, false);
bHigh = false;
bPressedHighlight = false;
}
}
else
{
if (dwFlags&fDragItems)
{
HighlightItem(index, true);
bHigh = true;
bDragging = true;
bPressedHighlight = true;
}
}
}
}
}
break;
case WM_SETCURSOR:
SetCursor(hCur);
break;
case WM_LBUTTONUP:
{
if (bHigh)
{
HighlightItem(-1);
bHigh = false;
}
CPoint pt(msg.lParam);
int idx, ht1 = HitTestEx(pt, idx);
if (!bDragging)
{
if (ht1 == htItem && idx == index)
{
if (iSelAnimTiming > 0 && index != iLastSel && iLastSel >= 0)
{
DrawAnimItem(0, 0, iLastSel);
}
if (dwFlags&fSelHighlight && iLastSel >= 0)
{
CRect rc;
GetIconRect(iSelFolder, iLastSel, rc);
rc.InflateRect(1,1);
InvalidateRect(rc);
}
iLastSel = index;
if (dwFlags&fSelHighlight && iLastSel >= 0)
{
CRect rc;
GetIconRect(iSelFolder, iLastSel, rc);
rc.InflateRect(1,1);
InvalidateRect(rc);
}
GetOwner()->SendMessage(WM_CATEGORY_NOTIFY, NM_OB_ITEMCLICK, idx);
}
}
else
{
if (ht1 == htItem)
{
if (idx != index)
{
CATEGORY_INFO ob;
ob.iDragFrom = iSelFolder;
ob.iDragTo = index;
// if (GetOwner()->SendMessage(WM_CATEGORY_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
// {
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
pbf->arItems.RemoveAt(index);
if (idx > index) idx --;
pbf->arItems.InsertAt(idx, piFrom);
// }
GetOwner()->SendMessage(WM_CATEGORY_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob);
}
}
else
{
CRect rcItem;
GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
{
CATEGORY_INFO ob;
ob.iDragFrom = iSelFolder;
ob.iDragTo = index;
if (GetOwner()->SendMessage(WM_CATEGORY_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
{
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
pbf->arItems.RemoveAt(index);
pbf->arItems.Add((void *) piFrom);
}
}
}
}
}
goto ExitLoop4;
default:
DispatchMessage(&msg);
break;
}
}
ExitLoop4:
ReleaseCapture();
AfxUnlockTempMaps(FALSE);
if (bDragging)
{
Invalidate();
}
}
bPressedHighlight = false;
if (bHigh) InvalidateRect(rc, false);
}
else iLastItemHighlighted = -1;
if (ht == htDownScroll)
{
bLooping = true;
bool bHigh = true;
if (::GetCapture() == NULL)
{
SetCapture();
ASSERT(this == GetCapture());
CClientDC dc(this);
dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
// SetTimer(2,300,NULL);
AfxLockTempMaps();
for (;;)
{
MSG msg;
VERIFY(::GetMessage(&msg, NULL, 0, 0));
if (CWnd::GetCapture() != this) break;
switch (msg.message)
{
case WM_MOUSEMOVE:
{
CPoint pt(msg.lParam);
if (rcDownArrow.PtInRect(pt))
{
if (bHigh == false)
{
dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
bHigh = true;
bDownArrow = true;
bDownPressed = true;
}
}
else
{
if (bHigh == true)
{
dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
bHigh = false;
bDownArrow = false;
bDownPressed = false;
}
}
}
break;
case WM_LBUTTONUP:
{
if (bHigh)
{
dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
bHigh = false;
}
bDownArrow = false;
CPoint pt(msg.lParam);
if (rcDownArrow.PtInRect(pt))
{
CRect itrc;
GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
CRect crc;
GetInsideRect(crc);
if (itrc.bottom > crc.bottom)
{
iFirstItem ++;
InvalidateRect(crc, true);
}
}
}
goto ExitLoop3;
case WM_TIMER:
{
if (msg.wParam == 2)
{
if (bHigh)
{
CPoint pt(msg.pt);
ScreenToClient(&pt);
if (rcDownArrow.PtInRect(pt))
{
bDownPressed = true;
CRect itrc;
GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
CRect crc;
GetInsideRect(crc);
if (itrc.bottom > crc.bottom)
{
iFirstItem ++;
InvalidateRect(crc, true);
}
else goto ExitLoop3;
}
else bDownPressed = false;
}
}
break;
}
case WM_KEYDOWN:
if (msg.wParam != VK_ESCAPE)
break;
default:
DispatchMessage(&msg);
break;
}
}
ExitLoop3:
KillTimer(2);
ReleaseCapture();
AfxUnlockTempMaps(FALSE);
bLooping = false;
bDownPressed = false;
bDownArrow = false;
CRect crc;
GetInsideRect(crc);
InvalidateRect(crc, true);
}
}
if (ht == htUpScroll)
{
bLooping = true;
bool bHigh = true;
if (::GetCapture() == NULL)
{
SetCapture();
ASSERT(this == GetCapture());
CClientDC dc(this);
dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
// SetTimer(2,300,NULL);
AfxLockTempMaps();
for (;;)
{
MSG msg;
VERIFY(::GetMessage(&msg, NULL, 0, 0));
if (CWnd::GetCapture() != this) break;
switch (msg.message)
{
case WM_MOUSEMOVE:
{
CPoint pt(msg.lParam);
if (rcUpArrow.PtInRect(pt))
{
if (bHigh == false)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -