📄 categorybar.cpp
字号:
dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
bHigh = true;
bUpArrow = true;
bUpPressed = true;
}
}
else
{
if (bHigh == true)
{
dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
bHigh = false;
bUpArrow = false;
bUpPressed = false;
}
}
}
break;
case WM_LBUTTONUP:
{
if (bHigh)
{
dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
bHigh = false;
}
bUpArrow = false;
CPoint pt(msg.lParam);
if (rcUpArrow.PtInRect(pt))
{
if (iFirstItem > 0 )
{
iFirstItem --;
CRect crc;
GetInsideRect(crc);
InvalidateRect(crc, true);
}
}
}
goto ExitLoop;
case WM_TIMER:
{
if (msg.wParam == 2)
{
if (bHigh)
{
CPoint pt(msg.pt);
ScreenToClient(&pt);
if (rcUpArrow.PtInRect(pt))
{
bUpPressed = true;
if (iFirstItem > 0)
{
iFirstItem --;
CRect crc;
GetInsideRect(crc);
InvalidateRect(crc, true);
}
else goto ExitLoop;
}
else bUpPressed = false;
}
}
break;
}
case WM_KEYDOWN:
if (msg.wParam != VK_ESCAPE) break;
default:
DispatchMessage(&msg);
break;
}
}
ExitLoop:
KillTimer(2);
ReleaseCapture();
AfxUnlockTempMaps(FALSE);
bLooping = false;
bUpPressed = false;
bUpArrow = false;
CRect crc;
GetInsideRect(crc);
InvalidateRect(crc, true);
}
}
CWnd::OnLButtonDown(nFlags, point);
}
int CCategoryBar::InsertItem(const int folder, const int index, LPCTSTR text, const int image, const DWORD exData)
{
ASSERT(folder >= 0 && folder < GetFolderCount());
CBarFolder* pbf = (CBarFolder*) arFolder.GetAt(folder);
return pbf->InsertItem(index, text, image, exData);
}
int CCategoryBar::GetItemCount() const
{
ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
return pbf->GetItemCount();
}
void CCategoryBar::SetSelFolder(const int index)
{
ASSERT(index >= 0 && index < GetFolderCount());
// if (index == iSelFolder) return;
CWnd * pc = GetFolderChild();
if (pc) pc->ShowWindow(SW_HIDE);
if (index != iSelFolder)
{
if (dwFlags&fAnimation && lAnimationTickCount >= 0) AnimateFolderScroll(iSelFolder, index);
}
iSelFolder = index;
iFirstItem = 0;
iLastSel = -1;
pc = GetFolderChild();
if (pc)
{
CRect rc;
GetInsideRect(rc);
pc->MoveWindow(rc);
pc->ShowWindow(SW_SHOW);
}
GetOwner()->SendMessage(WM_CATEGORY_NOTIFY, NM_FOLDERCHANGE, (LPARAM) iSelFolder);
Invalidate();
}
int CCategoryBar::GetFolderCount() const
{
return arFolder.GetSize();
}
int CCategoryBar::GetSelFolder() const
{
return iSelFolder;
}
void CCategoryBar::RemoveFolder(const int index)
{
ASSERT(index >= 0 && index < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
delete pbf;
arFolder.RemoveAt(index);
if (iSelFolder >= index) iSelFolder = index - 1;
if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;
Invalidate();
}
int CCategoryBar::CBarFolder::InsertItem(int index, LPCTSTR text, const int image, const DWORD exData)
{
if (index < 0 || index > GetItemCount()) index = GetItemCount();
int c = GetItemCount();
CBarItem* pbf = new CBarItem(text, image, exData);
ASSERT(pbf);
if( index < GetItemCount())
{
arItems.InsertAt(index, (void *) pbf);
}
else
{
arItems.Add((void *) pbf);
}
c = GetItemCount();
return index;
}
int CCategoryBar::GetCountPerPage() const
{
return 0;
}
CImageList * CCategoryBar::SetImageList(CImageList * pImageList, int nImageList)
{
CImageList * o = NULL;
if (nImageList == fSmallIcon)
{
o = pSmallImageList;
pSmallImageList = pImageList;
}
else if (nImageList == fLargeIcon)
{
o = pLargeImageList;
pLargeImageList = pImageList;
}
return o;
}
//CImageList * CCategoryBar::GetImageList(CImageList* /*pImageList*/, int nImageList)
CImageList * CCategoryBar::GetImageList(int nImageList)
{
if (nImageList == fSmallIcon) return pSmallImageList;
else if (nImageList == fLargeIcon) return pLargeImageList;
return NULL;
}
CImageList * CCategoryBar::SetFolderImageList(const int folder, CImageList * pImageList, int nImageList)
{
ASSERT(folder >= 0 && folder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(folder);
CImageList * o = NULL;
if (nImageList == fSmallIcon)
{
o = pbf->pSmallImageList;
pbf->pSmallImageList = pImageList;
}
else if (nImageList == fLargeIcon)
{
o = pbf->pLargeImageList;
pbf->pLargeImageList = pImageList;
}
return o;
}
CCategoryBar::CBarItem::CBarItem( LPCTSTR name, const int image, DWORD exData )
{
cItem = NULL;
iImageIndex = image;
dwData = exData;
if( name )
{
cItem = new TCHAR[ _tcslen( name ) + 1 ];
ASSERT(cItem);
_tcscpy( cItem, name );
}
}
CCategoryBar::CBarItem::~CBarItem()
{
if (cItem) delete [] cItem;
}
int CCategoryBar::CBarFolder::GetItemCount()
{
return arItems.GetSize();
}
void CCategoryBar::PaintItems(CDC * pDC, const int iFolder, CRect rc)
{
ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
int max = pbf->GetItemCount(), t;
CRect irc;
GetInsideRect(irc);
int isdc = pDC->SaveDC();
CRgn itemRegion;
itemRegion.CreateRectRgnIndirect(&irc);
pDC->SelectClipRgn(&itemRegion);
itemRegion.DeleteObject();
for (t = iFirstItem; t < max; t++)
{
CRect itemRc;
GetItemRect(iFolder, t, itemRc);
if (itemRc.top > rc.bottom) break;
else DrawItem(pDC, iFolder, itemRc, t);
}
pDC->RestoreDC(isdc);
}
CSize CCategoryBar::GetItemSize(const int iFolder, const int index, const int type)
{
ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
ASSERT(index >= 0 && index < pbf->GetItemCount());
CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
CSize szImage(0,0);
CSize szLabel(0,0);
CSize szAll(0,0);
if (pi->iImageIndex >= 0)
{
if (type != ircLabel)
{
CImageList * il = GetFolderImageList(iFolder, IsSmallIconView());
ASSERT(il);
if (il)
{
IMAGEINFO ii;
il->GetImageInfo(pi->iImageIndex, &ii);
szImage = CRect(ii.rcImage).Size();
}
}
}
if (pi->cItem)
{
if (type != ircIcon)
{
CClientDC dc(this);
CFont * oft = (CFont *) dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
if (IsSmallIconView())
{
szLabel = dc.GetTextExtent(pi->cItem, lstrlen(pi->cItem));
}
else
{
CRect rc;
GetInsideRect(rc);
rc.bottom = rc.top;
dc.DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CALCRECT|DT_CENTER|DT_WORDBREAK);
szLabel = rc.Size();
}
dc.SelectObject(oft);
}
}
if (IsSmallIconView())
{
if (type == ircIcon) szAll = szImage;
else if (type == ircLabel) szAll = szLabel;
else if (type == ircAll) szAll = CSize(szImage.cx + szLabel.cx + xSmallIconLabelOffset, szImage.cy > szLabel.cy ? szImage.cy : szLabel.cy);
}
else
{
if (type == ircIcon) szAll = szImage;
else if (type == ircLabel) szAll = szLabel;
else if (type == ircAll)
{
szAll = CSize(szImage.cx > szLabel.cx ? szImage.cx : szLabel.cx, szLabel.cy + szImage.cy + yLargeIconLabelOffset + yLargeIconSpacing);
}
}
return szAll;
}
CImageList * CCategoryBar::GetFolderImageList(const int index, const bool bSmall) const
{
ASSERT(index >= 0 && index < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
if (bSmall)
{
if (pbf->pSmallImageList) return pbf->pSmallImageList; else return pSmallImageList;
}
if (pbf->pLargeImageList) return pbf->pLargeImageList; else return pLargeImageList;
}
void CCategoryBar::DrawItem(CDC * pDC, const int iFolder, CRect rc, const int index, const bool bOnlyImage)
{
CImageList * ima = GetFolderImageList(iFolder, IsSmallIconView());
ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
ASSERT(index >= 0 && index < pbf->GetItemCount());
CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
ASSERT(pi && ima);
CFont * oft = (CFont *) pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
COLORREF ocr = pDC->SetTextColor(crTextColor);
int obk = pDC->SetBkMode(TRANSPARENT);
if (IsSmallIconView())
{
if (ima)
{
IMAGEINFO ii;
ima->GetImageInfo(pi->iImageIndex, &ii);
CSize szImage = CRect(ii.rcImage).Size();
CPoint pt;
pt.x = rc.left + 2;
pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
if (!bOnlyImage)
{
rc.left += szImage.cx + xSmallIconLabelOffset;
pDC->TextOut(rc.left, rc.top, CString(pi->cItem));
}
}
}
else
{
if (ima)
{
IMAGEINFO ii;
ima->GetImageInfo(pi->iImageIndex, &ii);
CSize szImage = CRect(ii.rcImage).Size();
CPoint pt;
pt.x = rc.left + (rc.Width() - szImage.cx) / 2;
pt.y = rc.top;// + (rc.Height() - szImage.cy) / 2;
ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
if (!bOnlyImage)
{
rc.top += szImage.cy + yLargeIconLabelOffset;
pDC->DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CENTER|DT_WORDBREAK);
}
}
}
if (dwFlags&fSelHighlight && iLastSel == index && iLastSel >= 0)
{
CRect rc;
GetIconRect(iSelFolder, iLastSel, rc);
rc.InflateRect(1,1);
pDC->Draw3dRect(rc, crDkShadowBorder, cr3dFace);
}
pDC->SetTextColor(ocr);
pDC->SelectObject(oft);
pDC->SetBkMode(obk);
}
BOOL CCategoryBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
CPoint pt(GetMessagePos());
ScreenToClient(&pt);
int index, ht = HitTestEx(pt, index);
if (ht == htFolder)
return true;
return CWnd::OnSetCursor(pWnd, nHitTest, message);
}
void CCategoryBar::GetVisibleRange(const int iFolder, int & first, int & last)
{
first = iFirstItem;
CRect rc;
GetInsideRect(rc);
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
int max = pbf->GetItemCount(), t;
for (t = iFirstItem; t < max; t++)
{
CRect itemRc;
GetItemRect(iFolder, t, itemRc);
if (itemRc.bottom > rc.bottom)
{
last = t - 1;
break;
}
else last = t;
}
}
void CCategoryBar::OnSize(UINT nType, int cx, int cy)
{
bUpArrow = bDownArrow = false;
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
int t, max = GetFolderCount();
CRect rc;
GetInsideRect(rc);
for (t = 0; t < max; t++)
{
CWnd * pc = GetFolderChild(t);
if (pc) pc->SetWindowPos(0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER);
}
}
void CCategoryBar::HighlightItem(const int index, const bool bPressed)
{
CWnd * pf = GetFocus();
if (pf != NULL && pf != this && IsChild(pf)) return;
static bool bOldPressed = false;
if (iLastItemHighlighted == index && bOldPressed == bPressed) return;
bOldPressed = bPressed;
CClientDC dc(this);
CRect irc;
GetInsideRect(irc);
int isdc = dc.SaveDC();
CRgn itemRegion;
itemRegion.CreateRectRgnIndirect(&irc);
dc.SelectClipRgn(&itemRegion);
itemRegion.DeleteObject();
if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
{
CRect rc;
// GetIconRect(iSelFolder, iLastItemHighlighted, rc);
// rc.InflateRect(1,1);
GetHighItemRect(rc);
dc.Draw3dRect(rc, crBackGroundColor, crBackGroundColor);
}
if (iSelAnimTiming > 0 && index == iLastSel)
{
iLastItemHighlighted = -1;
return;
}
if (dwFlags&fSelHighlight && iLastSel == index)
{
iLastItemHighlighted = -1;
return;
}
iLastItemHighlighted = index;
if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
{
CRect rc;
// GetIconRect(iSelFolder, iLastItemHighlighted, rc);
// rc.InflateRect(1,1);
GetHighItemRect(rc);
if (bPressed)
dc.Draw3dRect(rc, crDkShadowBorder, cr3dFace);
else
dc.Draw3dRect(rc, cr3dFace, crDkShadowBorder);
}
dc.RestoreDC(isdc);
GetOwner()->SendMessage(WM_CATEGORY_NOTIFY,NM_OB_ITEMHOVER,index);
}
void CCategoryBar::GetIconRect(const int iFolder, const int iIndex, CRect & rect)
{
CRect rc;
GetInsideRect(rc);
int top = rc.top;
CSize sz(0,0);
int y = 0;
int spacing = IsSmallIconView() ? ySmallIconSpacing : yLargeIconSpacing;
for (int t = 0; t < iIndex; t++)
{
sz = GetItemSize(iFolder, t, ircAll);
top += sz.cy;
top += spacing;
if (t == iFirstItem - 1) y = top - rc.top;
}
top += spacing;
sz = GetItemSize(iFolder, iIndex, ircIcon);
if (IsSmallIconView())
{
rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
rect.left += xLeftMargin + 2;
rect.right += xLeftMargin + 2;
rect.top -= yTopMargin;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -