GfxOutBarCtrl.cpp
上传用户:aokegd
上传日期:2009-12-14
资源大小:1276k
文件大小:54k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // Copyright (c) Iuri Apollonio 1998
  2. // Use & modify as you want & need, and leave those 3 lines.
  3. // http://www.codeguru.com
  4. // GfxOutBarCtrl.cpp : implementation file
  5. //
  6. #include "stdafx.h"
  7. #include "resource.h"//"OutWAts1.h"
  8. #include "GfxOutBarCtrl.h"
  9. #include "GfxGroupEdit.h"
  10. #include "GfxPopupMenu.h"
  11. #define _ID_GFX_SMALLICON "小图标方式"
  12. #define _ID_GFX_LARGEICON "大图标方式"
  13. #define _ID_GFX_ADDAGROUP   "添加组"
  14. #define _ID_GFX_FONTCOLOR   "改变字体颜色"
  15. #define _ID_GFX_BACKCOLOR   "改变背景颜色"
  16. #define _ID_GFX_REMOVEITEM "从该组中删除"
  17. #define _ID_GFX_RENAMEITEM "改名"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CGfxOutBarCtrl
  25. IMPLEMENT_DYNCREATE(CGfxOutBarCtrl, CWnd)
  26. CGfxOutBarCtrl::CGfxOutBarCtrl()
  27. {
  28. crBackGroundColor = GetSysColor(COLOR_BACKGROUND);//RGB(0,128,128);//
  29. crBackGroundColor1 = GetSysColor(COLOR_BACKGROUND);
  30. crTextColor = GetSysColor(COLOR_WINDOW);
  31. cr3dFace = GetSysColor(COLOR_3DFACE);
  32. crLightBorder = GetSysColor(COLOR_3DLIGHT);
  33. crHilightBorder = GetSysColor(COLOR_3DHILIGHT);
  34. crShadowBorder = GetSysColor(COLOR_3DSHADOW);
  35. crDkShadowBorder = GetSysColor(COLOR_3DDKSHADOW);
  36. pBlackPen = new CPen(PS_SOLID, 1, RGB(0,0,0));
  37. iFolderHeight = 22;
  38. dwFlags = fDragItems|fEditGroups|fEditItems|fRemoveGroups|fRemoveItems|fAddGroups|fAnimation|fSelHighlight;
  39. iSelFolder = 1;
  40. iLastFolderHighlighted = -1;
  41. iLastSelectedFolder = -1;
  42. pLargeImageList = NULL;
  43. pSmallImageList = NULL;
  44. iFirstItem = 0;
  45. xSmallIconLabelOffset = 4;
  46. yLargeIconLabelOffset = 3;
  47. ySmallIconSpacing = 10;
  48. yLargeIconSpacing = 8;
  49. xLeftMargin = 5;
  50. yTopMargin = 5;
  51. bUpArrow = bDownArrow = false;
  52. hHandCursor = AfxGetApp()->LoadCursor(IDC_HANDCUR);
  53. rcUpArrow = rcDownArrow = CRect(0,0,0,0);
  54. bUpPressed = bDownPressed = false;
  55. bLooping = false;
  56. iLastItemHighlighted = -1;
  57. bPressedHighlight = false;
  58. iLastDragItemDraw = -1;
  59. lAnimationTickCount = 10;
  60. hDragCursor = AfxGetApp()->LoadCursor(IDC_DRAGGING);
  61. hNoDragCursor = AfxGetApp()->LoadCursor(IDC_NODRAGGING);
  62. iLastSel = -1;
  63. iSelAnimCount = 0;
  64. iSelAnimTiming = 0;
  65. }
  66. CGfxOutBarCtrl::~CGfxOutBarCtrl()
  67. {
  68. for (int t = 0; t < arFolder.GetSize(); t++)
  69. {
  70. if (arFolder.GetAt(t)) delete (CBarFolder*) arFolder.GetAt(t);
  71. }
  72. arFolder.RemoveAll();
  73. delete pBlackPen;
  74. }
  75. BEGIN_MESSAGE_MAP(CGfxOutBarCtrl, CWnd)
  76. //{{AFX_MSG_MAP(CGfxOutBarCtrl)
  77. ON_WM_CREATE()
  78. ON_WM_TIMER()
  79. ON_WM_PAINT()
  80. ON_WM_ERASEBKGND()
  81. ON_WM_MOUSEMOVE()
  82. ON_WM_LBUTTONDOWN()
  83. ON_WM_SETCURSOR()
  84. ON_WM_SIZE()
  85. ON_WM_RBUTTONDOWN()
  86. ON_COMMAND(ID_GFX_LARGEICON, OnGfxLargeicon)
  87. ON_UPDATE_COMMAND_UI(ID_GFX_LARGEICON, OnUpdateGfxLargeicon)
  88. ON_COMMAND(ID_GFX_SMALLICON, OnGfxSmallicon)
  89. ON_UPDATE_COMMAND_UI(ID_GFX_SMALLICON, OnUpdateGfxSmallicon)
  90. ON_COMMAND(ID_GFX_REMOVEITEM, OnGfxRemoveitem)
  91. ON_UPDATE_COMMAND_UI(ID_GFX_REMOVEITEM, OnUpdateGfxRemoveitem)
  92. ON_COMMAND(ID_GFX_RENAMEITEM, OnGfxRenameitem)
  93. ON_UPDATE_COMMAND_UI(ID_GFX_RENAMEITEM, OnUpdateGfxRenameitem)
  94. //}}AFX_MSG_MAP
  95. ON_MESSAGE(WM_OUTBAR_NOTIFY, OnEndLabelEdit)
  96. END_MESSAGE_MAP()
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CGfxOutBarCtrl message handlers
  99. long CGfxOutBarCtrl::OnEndLabelEdit(WPARAM wParam, LPARAM lParam)
  100. {
  101. if (wParam == NM_OB_ONGROUPENDEDIT)
  102. {
  103. CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
  104. OUTBAR_INFO ob;
  105. ob.index = pEdit->iIndex;
  106. ob.cText = pEdit->text;
  107. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONGROUPENDEDIT, (LPARAM) &ob))
  108. {
  109. SetFolderText(pEdit->iIndex, pEdit->text);
  110. CRect rc;
  111. GetFolderRect(pEdit->iIndex, rc);
  112. InvalidateRect(rc, false);
  113. }
  114. }
  115. if (wParam == NM_OB_ONLABELENDEDIT)
  116. {
  117. CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
  118. OUTBAR_INFO ob;
  119. ob.index = pEdit->iIndex;
  120. ob.cText = pEdit->text;
  121. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONLABELENDEDIT, (LPARAM) &ob))
  122. {
  123. SetItemText(pEdit->iIndex, pEdit->text);
  124. CRect rc;
  125. GetInsideRect(rc);
  126. InvalidateRect(rc, true);
  127. }
  128. }
  129. return 0;
  130. }
  131. void CGfxOutBarCtrl::SetFolderText(const int index, const char * text)
  132. {
  133. ASSERT(index >= 0 && index < GetFolderCount());
  134. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  135. if (pbf->cName) 
  136. {
  137. delete [] pbf->cName;
  138. pbf->cName = NULL;
  139. }
  140. pbf->cName = new char [lstrlen(text)+1];
  141. lstrcpy(pbf->cName, text);
  142. }
  143. void CGfxOutBarCtrl::SetItemText(const int index, const char * text)
  144. {
  145. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  146. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  147. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  148. if (pi->cItem) 
  149. {
  150. delete [] pi->cItem;
  151. pi->cItem = NULL;
  152. }
  153. pi->cItem = new char [lstrlen(text)+1];
  154. lstrcpy(pi->cItem, text);
  155. }
  156. BOOL CGfxOutBarCtrl::Create(DWORD dwStyle, const RECT & rect, CWnd * pParentWnd, UINT nID, const DWORD dwFlag)
  157. {
  158. dwFlags = dwFlag;
  159. return CWnd::CreateEx(WS_EX_STATICEDGE, NULL, NULL, dwStyle|WS_CHILD, rect, pParentWnd, nID);
  160. //GFXOUTBARCTRL_CLASSNAME
  161. }
  162. bool CGfxOutBarCtrl::IsSmallIconView() const
  163. {
  164. return dwFlags&fSmallIcon;
  165. }
  166. void CGfxOutBarCtrl::SetSmallIconView(const bool bSet)
  167. {
  168. iFirstItem = 0;
  169. if (bSet)
  170. {
  171. if (!IsSmallIconView()) 
  172. {
  173. dwFlags |= fSmallIcon;
  174. CRect rc;
  175. GetInsideRect(rc);
  176. InvalidateRect(rc, false);
  177. }
  178. }
  179. else
  180. {
  181. if (IsSmallIconView()) 
  182. {
  183. dwFlags &= ~fSmallIcon;
  184. CRect rc;
  185. GetInsideRect(rc);
  186. InvalidateRect(rc, false);
  187. }
  188. }
  189. }
  190. DWORD CGfxOutBarCtrl::GetFlag() const
  191. {
  192. return dwFlags;
  193. }
  194. void CGfxOutBarCtrl::ModifyFlag(const DWORD & dwRemove, const DWORD & dwAdd, const UINT redraw)
  195. {
  196. if (dwRemove) dwFlags &= ~(dwRemove);
  197. if (dwAdd) dwFlags |= dwAdd;
  198. if (GetSafeHwnd())
  199. {
  200. if (redraw != 0) SetWindowPos(0,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|redraw);
  201. else Invalidate();
  202. }
  203. }
  204. int CGfxOutBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  205. {
  206. if (CWnd::OnCreate(lpCreateStruct) == -1)
  207. return -1;
  208. // TODO: Add your specialized creation code here
  209. return 0;
  210. }
  211. void CGfxOutBarCtrl::OnTimer(UINT nIDEvent) 
  212. {
  213. if (nIDEvent == 1)
  214. {
  215. CPoint pt(GetMessagePos());
  216. ScreenToClient(&pt);
  217. CRect rc;
  218. GetClientRect(&rc);
  219. if (!(rc.PtInRect(pt)))
  220. {
  221. HighlightFolder(-1);
  222. HighlightItem(-1);
  223. KillTimer(1);
  224. }
  225. }
  226. else if (nIDEvent == 3 && iLastSel >= 0)
  227. {
  228. iSelAnimCount ++;
  229. if (iSelAnimCount > 10) iSelAnimCount = -1;
  230. if (iSelAnimCount == 0)
  231. DrawAnimItem(-1, 1, iLastSel);
  232. if (iSelAnimCount == 1)
  233. DrawAnimItem(0, 0, iLastSel);
  234. if (iSelAnimCount == 2)
  235. DrawAnimItem(1, 1, iLastSel);
  236. if (iSelAnimCount == 3)
  237. DrawAnimItem(0, 0, iLastSel);
  238. }
  239. CWnd::OnTimer(nIDEvent);
  240. }
  241. void CGfxOutBarCtrl::DrawAnimItem(const int xoffset, const int yoffset, const int index)
  242. {
  243. CImageList * ima = GetFolderImageList(iSelFolder, IsSmallIconView());
  244. CRect rc, irc;
  245. GetInsideRect(irc);
  246. GetItemRect(iSelFolder, iLastSel, rc);
  247. if (iLastSel >= iFirstItem && irc.bottom > rc.bottom && irc.top < rc.top)
  248. {
  249. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  250. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  251. ASSERT(index >= 0 && index < pbf->GetItemCount());
  252. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  253. ASSERT(pi && ima);
  254. CClientDC dc(this);
  255. if (IsSmallIconView())
  256. {
  257. if (ima)
  258. {
  259. IMAGEINFO ii;
  260. ima->GetImageInfo(pi->iImageIndex, &ii);
  261. CSize szImage = CRect(ii.rcImage).Size();
  262. CPoint pt;
  263. pt.x = rc.left + 2;
  264. pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
  265. CRect rcBck(pt.x-1, pt.y-1, pt.x + szImage.cx+2, pt.y + szImage.cy+2);
  266. dc.FillSolidRect(rcBck, crBackGroundColor);
  267. pt.x += xoffset;
  268. pt.y += yoffset;
  269. ima->Draw(&dc, pi->iImageIndex, pt, ILD_NORMAL);
  270. }
  271. }
  272. else
  273. {
  274. if (ima)
  275. {
  276. IMAGEINFO ii;
  277. ima->GetImageInfo(pi->iImageIndex, &ii);
  278. CSize szImage = CRect(ii.rcImage).Size();
  279. CPoint pt;
  280. pt.x = rc.left + (rc.Width() - szImage.cx) / 2;
  281. pt.y = rc.top;
  282. CRect rcBck(pt.x-1, pt.y-1, pt.x + szImage.cx+2, pt.y + szImage.cy+2);
  283. dc.FillSolidRect(rcBck, crBackGroundColor);
  284. pt.x += xoffset;
  285. pt.y += yoffset;
  286. ima->Draw(&dc, pi->iImageIndex, pt, ILD_NORMAL);
  287. }
  288. }
  289. }
  290. }
  291. void CGfxOutBarCtrl::OnPaint() 
  292. {
  293. CRect clientRc;
  294. GetClientRect(&clientRc);
  295. CPaintDC dc(this);
  296. CDC memDC;
  297. memDC.CreateCompatibleDC(&dc);
  298. CBitmap bmp;
  299. bmp.CreateCompatibleBitmap(&dc, clientRc.Width(), clientRc.Height());
  300. CBitmap * obmp = memDC.SelectObject(&bmp);
  301. CDC * pDC = &memDC;
  302. CRect rc;
  303. GetInsideRect(rc);
  304. if (!GetFolderChild()) pDC->FillSolidRect(rc, crBackGroundColor);
  305. int max = arFolder.GetSize();
  306. CRect frc;
  307. for (int t = 0; t < max; t++)
  308. {
  309. GetFolderRect(t, frc);
  310. DrawFolder(pDC, t, frc, false);
  311. }
  312. if (!GetFolderChild())
  313. {
  314. int f,l;
  315. GetVisibleRange(iSelFolder, f,l);
  316. rcUpArrow.SetRect(0,0,GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CXVSCROLL));
  317. rcDownArrow = rcUpArrow;
  318. rcUpArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.top +5);
  319. rcDownArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.bottom - 5 - GetSystemMetrics(SM_CXVSCROLL));
  320. if (f > 0)
  321. {
  322. if (bUpPressed) pDC->DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  323. else pDC->DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  324. bUpArrow = true;
  325. pDC->ExcludeClipRect(rcUpArrow);
  326. }
  327. else bUpArrow = false;
  328. if (l < GetItemCount() - 1)
  329. {
  330. if (bDownPressed) pDC->DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  331. else pDC->DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  332. bDownArrow = true;
  333. pDC->ExcludeClipRect(rcDownArrow);
  334. }
  335. else bDownArrow = false;
  336. PaintItems(pDC, iSelFolder, rc);
  337. }
  338. dc.BitBlt(clientRc.left, clientRc.top, clientRc.Width(), clientRc.Height(), &memDC, 0,0, SRCCOPY);
  339. memDC.SelectObject(obmp);
  340. if (iLastFolderHighlighted >= 0)
  341. {
  342. int i = iLastFolderHighlighted;
  343. iLastFolderHighlighted = -1;
  344. HighlightFolder(i);
  345. }
  346. if (iLastItemHighlighted >= 0)
  347. {
  348. int i = iLastItemHighlighted;
  349. iLastItemHighlighted = -1;
  350. HighlightItem(i, bPressedHighlight);
  351. }
  352. }
  353. BOOL CGfxOutBarCtrl::OnEraseBkgnd(CDC* pDC) 
  354. {
  355. return true;
  356. }
  357. bool CGfxOutBarCtrl::GetFolderRect(const int iIndex, CRect & rect) const
  358. {
  359. int max = arFolder.GetSize();
  360. ASSERT(iIndex >= 0 && iIndex < max);
  361. if (iIndex >= 0 && iIndex < max)
  362. {
  363. CRect rc;
  364. GetClientRect(rc);
  365. if (iIndex > iSelFolder)
  366. rect.SetRect(rc.left, rc.bottom - ((max - iIndex)) * iFolderHeight, rc.right, 
  367. rc.bottom - (max - iIndex - 1) * iFolderHeight);
  368. else 
  369. rect.SetRect(rc.left, rc.top + iIndex * iFolderHeight - 1, rc.right, 
  370. rc.top + (1 + iIndex) * iFolderHeight - 1);
  371. return true;
  372. }
  373. return false;
  374. }
  375. void CGfxOutBarCtrl::GetItemRect(const int iFolder, const int iIndex, CRect & rect)
  376. {
  377. CRect rc;
  378. GetInsideRect(rc);
  379. int top = rc.top;
  380. CSize sz(0,0);
  381. int y = 0;
  382. for (int t = 0; t < iIndex; t++)
  383. {
  384. sz = GetItemSize(iFolder, t, ircAll);
  385. top += sz.cy;
  386. if (IsSmallIconView()) 
  387. {
  388. top += ySmallIconSpacing; 
  389. }
  390. else 
  391. {
  392. top += yLargeIconSpacing;
  393. }
  394. if (t == iFirstItem - 1) y = top - rc.top;
  395. }
  396. sz = GetItemSize(iFolder, iIndex, ircAll);
  397. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  398. rect.top -= y;
  399. rect.bottom -= y;
  400. rect.left += xLeftMargin;
  401. rect.top  += yTopMargin;
  402. rect.bottom += yTopMargin;
  403. if (!IsSmallIconView()) 
  404. {
  405. rect.left = rc.left;
  406. rect.right = rc.right;
  407. }
  408. }
  409. void CGfxOutBarCtrl::DrawFolder(CDC * pDC, const int iIdx, CRect rect, const bool bSelected)
  410. {
  411. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iIdx);
  412. if (!bSelected)
  413. {
  414. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  415. CPen * op = pDC->SelectObject(&pn1);
  416. pDC->MoveTo(rect.left, rect.top);
  417. pDC->LineTo(rect.right, rect.top);
  418. pDC->SelectObject(op);
  419. rect.top ++;
  420. pDC->Draw3dRect(rect, crHilightBorder, crBackGroundColor1);
  421. rect.InflateRect(-1,-1);
  422. pDC->FillSolidRect(rect, cr3dFace);
  423. int obk = pDC->SetBkMode(TRANSPARENT);
  424. CFont * of = pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  425. pDC->DrawText(CString(pbf->cName), rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  426. pDC->SetBkMode(obk);
  427. pDC->SelectObject(of);
  428. }
  429. else
  430. {
  431. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  432. CPen * op = pDC->SelectObject(&pn1);
  433. pDC->MoveTo(rect.left+1, rect.top);
  434. pDC->LineTo(rect.right, rect.top);
  435. pDC->SelectObject(op);
  436. rect.top ++;
  437. pDC->Draw3dRect(rect, crDkShadowBorder, crHilightBorder);
  438. rect.InflateRect(-1,-1);
  439. pDC->Draw3dRect(rect, crBackGroundColor1, cr3dFace);
  440. rect.InflateRect(-1,-1);
  441. pDC->FillSolidRect(rect, cr3dFace);
  442. int obk = pDC->SetBkMode(TRANSPARENT);
  443. CFont * of = pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  444. pDC->DrawText(CString(pbf->cName), rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  445. pDC->SetBkMode(obk);
  446. pDC->SelectObject(of);
  447. }
  448. }
  449. int CGfxOutBarCtrl::AddFolder(const char * cFolderName, const DWORD exData)
  450. {
  451. CBarFolder * pbf = new CBarFolder(cFolderName, exData);
  452. ASSERT(pbf);
  453. arFolder.Add((void *)pbf);
  454. return arFolder.GetSize() - 1;
  455. }
  456. CGfxOutBarCtrl::CBarFolder::CBarFolder(const char * name, DWORD exData)
  457. {
  458. cName = NULL;
  459. dwData = exData;
  460. if (name)
  461. {
  462. cName = new char[lstrlen(name)+1];
  463. ASSERT(cName);
  464. lstrcpy(cName, name);
  465. }
  466. pLargeImageList = NULL;
  467. pSmallImageList = NULL;
  468. pChild = NULL;
  469. }
  470. CGfxOutBarCtrl::CBarFolder::~CBarFolder()
  471. {
  472. if (cName) delete [] cName;
  473. for (int t = 0; t < arItems.GetSize(); t++)
  474. if (arItems.GetAt(t)) delete (CBarFolder*) arItems.GetAt(t);
  475. arItems.RemoveAll();
  476. }
  477. void CGfxOutBarCtrl::GetInsideRect(CRect & rect) const
  478. {
  479. GetClientRect(rect);
  480. if (arFolder.GetSize() > 0)
  481. {
  482. int max = arFolder.GetSize();
  483. rect.top += iFolderHeight * (iSelFolder + 1) - 1;//+ 2;
  484. rect.bottom -= (max - iSelFolder - 1)*iFolderHeight;
  485. return;
  486. }
  487. }
  488. void CGfxOutBarCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  489. {
  490. int index, ht = HitTestEx(point, index);
  491. if (ht != htFolder && iLastFolderHighlighted >= 0) HighlightFolder(-1);
  492. if (ht != htItem   && iLastItemHighlighted   >= 0) HighlightItem(-1);
  493. if (ht == htFolder)
  494. {
  495. HighlightFolder(index);
  496. SetTimer(1,100,NULL);
  497. }
  498. else if (ht == htItem)
  499. {
  500. HighlightItem(index);
  501. SetTimer(1,100,NULL);
  502. }
  503. CWnd::OnMouseMove(nFlags, point);
  504. }
  505. int CGfxOutBarCtrl::HitTestEx(const CPoint & point, int &index)
  506. {
  507. if (bUpArrow && rcUpArrow.PtInRect(point)) return htUpScroll;
  508. if (bDownArrow && rcDownArrow.PtInRect(point)) return htDownScroll;
  509. int max = arFolder.GetSize(), t;
  510. CRect rc;
  511. for (t = 0; t < max; t++)
  512. {
  513. GetFolderRect(t, rc);
  514. if (rc.PtInRect(point)) 
  515. {
  516. index = t;
  517. return htFolder;
  518. }
  519. }
  520. GetInsideRect(rc);
  521. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  522. max = pbf->GetItemCount();
  523. for (t = iFirstItem; t < max; t++)
  524. {
  525. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  526. CRect itemRc;
  527. if (!IsSmallIconView()) 
  528. {
  529. GetIconRect(iSelFolder, t, itemRc);
  530. if (itemRc.PtInRect(point))
  531. {
  532. index = t;
  533. return htItem;
  534. }
  535. else if (itemRc.top > rc.bottom) break;
  536. GetLabelRect(iSelFolder, t, itemRc);
  537. itemRc.top -= yLargeIconLabelOffset;
  538. if (itemRc.PtInRect(point))
  539. {
  540. index = t;
  541. return htItem;
  542. }
  543. else if (itemRc.top > rc.bottom) break;
  544. }
  545. else
  546. {
  547. GetItemRect(iSelFolder, t, itemRc);
  548. if (itemRc.PtInRect(point))
  549. {
  550. index = t;
  551. return htItem;
  552. }
  553. else if (itemRc.top > rc.bottom) break;
  554. }
  555. }
  556. return htNothing;
  557. }
  558. void CGfxOutBarCtrl::HighlightFolder(const int index)
  559. {
  560. CWnd * pf = GetFocus();
  561. if (pf != NULL && pf != this && IsChild(pf)) return;
  562. if (iLastFolderHighlighted == index) return;
  563. if (iLastFolderHighlighted >= 0)
  564. {
  565. CRect rc;
  566. if (GetFolderRect(iLastFolderHighlighted, rc))
  567. {
  568. CClientDC dc(this);
  569. CPen pn(PS_SOLID, 1, crBackGroundColor1);//crShadowBorder);
  570. CPen * op = dc.SelectObject(&pn);
  571. dc.MoveTo(rc.left, rc.bottom-1);
  572. dc.LineTo(rc.right-1, rc.bottom-1);
  573. dc.LineTo(rc.right-1, rc.top);
  574. CPen pn1(PS_SOLID, 1, cr3dFace);
  575. dc.SelectObject(&pn1);
  576. dc.MoveTo(rc.left+1, rc.bottom-2);
  577. dc.LineTo(rc.right-2, rc.bottom-2);
  578. dc.LineTo(rc.right-2, rc.top+1);
  579. dc.SelectObject(op);
  580. }
  581. }
  582. iLastFolderHighlighted = index;
  583. if (iLastFolderHighlighted >= 0)
  584. {
  585. CRect rc;
  586. if (GetFolderRect(iLastFolderHighlighted, rc))
  587. {
  588. CClientDC dc(this);
  589. CPen pn(PS_SOLID, 1, crDkShadowBorder);
  590. CPen * op = dc.SelectObject(&pn);
  591. dc.MoveTo(rc.left, rc.bottom-1);
  592. dc.LineTo(rc.right-1, rc.bottom-1);
  593. dc.LineTo(rc.right-1, rc.top);
  594. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  595. dc.SelectObject(&pn1);
  596. dc.MoveTo(rc.left+1, rc.bottom-2);
  597. dc.LineTo(rc.right-2, rc.bottom-2);
  598. dc.LineTo(rc.right-2, rc.top+1);
  599. dc.SelectObject(op);
  600. }
  601. }
  602. }
  603. void CGfxOutBarCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  604. {
  605. if (GetFocus() != this) SetFocus();
  606. int index, ht = HitTestEx(point, index);
  607. iLastDragItemDrawType = -1;
  608. CRect inRc;
  609. GetInsideRect(inRc);
  610. if (ht == htFolder)
  611. {
  612. bool bHigh = true;
  613. CRect rc;
  614. GetFolderRect(index, rc);
  615. if (::GetCapture() == NULL)
  616. {
  617. SetCapture();
  618. ASSERT(this == GetCapture());
  619. CClientDC dc(this);
  620. DrawFolder(&dc, index, rc, true);
  621. AfxLockTempMaps();
  622. for (;;)
  623. {
  624. MSG msg;
  625. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  626. if (CWnd::GetCapture() != this) break;
  627. switch (msg.message)
  628. {
  629. case WM_MOUSEMOVE:
  630. {
  631. CPoint pt(msg.lParam);
  632. int idx, ht1 = HitTestEx(pt, idx);
  633. if (ht1 == htFolder && idx == index)
  634. {
  635. if (!bHigh)
  636. {
  637. DrawFolder(&dc, index, rc, true);
  638. bHigh = true;
  639. }
  640. }
  641. else
  642. {
  643. if (bHigh)
  644. {
  645. DrawFolder(&dc, index, rc, false);
  646. bHigh = false;
  647. }
  648. }
  649. }
  650. break;
  651. case WM_LBUTTONUP:
  652. {
  653. if (bHigh)
  654. {
  655. DrawFolder(&dc, index, rc, false);
  656. bHigh = false;
  657. }
  658. CPoint pt(msg.lParam);
  659. int idx, ht1 = HitTestEx(pt, idx);
  660. if (ht1 == htFolder && idx != iSelFolder)
  661. SetSelFolder(idx);
  662. }
  663. goto ExitLoop2;
  664. case WM_KEYDOWN:
  665. if (msg.wParam != VK_ESCAPE) 
  666. break;
  667. default:
  668. DispatchMessage(&msg);
  669. break;
  670. }
  671. }
  672. ExitLoop2:
  673. ReleaseCapture();
  674. AfxUnlockTempMaps(FALSE);
  675. }
  676. if (bHigh) InvalidateRect(rc, false);
  677. }
  678. else iLastSelectedFolder = -1;
  679. if (ht == htItem)
  680. {
  681. iLastDragItemDraw = -1;
  682. bool bHigh = true, bDragging = false;
  683. CRect rc;
  684. GetItemRect(iSelFolder, index, rc);
  685. HCURSOR hCur = GetCursor();
  686. if (::GetCapture() == NULL)
  687. {
  688. SetCapture();
  689. ASSERT(this == GetCapture());
  690. CClientDC dc(this);
  691. HighlightItem(index, true);
  692. AfxLockTempMaps();
  693. for (;;)
  694. {
  695. MSG msg;
  696. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  697. if (CWnd::GetCapture() != this) break;
  698. switch (msg.message)
  699. {
  700. case WM_MOUSEMOVE:
  701. {
  702. CPoint pt(msg.lParam);
  703. int idx, ht1 = HitTestEx(pt, idx);
  704. if (bDragging)
  705. {
  706. if (ht1 == htItem) 
  707. {
  708. DrawDragArrow(&dc, index, idx);
  709. SetCursor(hDragCursor);
  710. hCur = hDragCursor;
  711. }
  712. else 
  713. {
  714. CRect rcItem;
  715. GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
  716. if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
  717. {
  718. DrawDragArrow(&dc, index, GetItemCount());
  719. SetCursor(hDragCursor);
  720. hCur = hDragCursor;
  721. }
  722. else
  723. {
  724. DrawDragArrow(&dc, index, -1);
  725. SetCursor(hNoDragCursor);
  726. hCur = hNoDragCursor;
  727. }
  728. }
  729. }
  730. else
  731. {
  732. if (ht1 == htItem && idx == index)
  733. {
  734. if (!bHigh)
  735. {
  736. HighlightItem(index, true);
  737. bHigh = true;
  738. bPressedHighlight = true;
  739. }
  740. }
  741. else 
  742. {
  743. if (ht1 == htItem)
  744. {
  745. if (bHigh)
  746. {
  747. HighlightItem(index, false);
  748. bHigh = false;
  749. bPressedHighlight = false;
  750. }
  751. }
  752. else
  753. {
  754. if (dwFlags&fDragItems)
  755. {
  756. HighlightItem(index, true);
  757. bHigh = true;
  758. bDragging = true;
  759. SetCursor(hDragCursor);
  760. hCur = hDragCursor;
  761. bPressedHighlight = true;
  762. }
  763. }
  764. }
  765. }
  766. }
  767. break;
  768. case WM_SETCURSOR:
  769. SetCursor(hCur);
  770. break;
  771. case WM_LBUTTONUP:
  772. {
  773. if (bHigh)
  774. {
  775. HighlightItem(-1);
  776. bHigh = false;
  777. }
  778. CPoint pt(msg.lParam);
  779. int idx, ht1 = HitTestEx(pt, idx);
  780. if (!bDragging)
  781. {
  782. if (ht1 == htItem && idx == index) 
  783. {
  784. if (iSelAnimTiming > 0 && index != iLastSel && iLastSel >= 0)
  785. {
  786. DrawAnimItem(0, 0, iLastSel);
  787. }
  788. if (dwFlags&fSelHighlight && iLastSel >= 0)
  789. {
  790. CRect rc;
  791. GetIconRect(iSelFolder, iLastSel, rc);
  792. rc.InflateRect(1,1);
  793. InvalidateRect(rc);
  794. }
  795. iLastSel = index;
  796. if (dwFlags&fSelHighlight && iLastSel >= 0)
  797. {
  798. CRect rc;
  799. GetIconRect(iSelFolder, iLastSel, rc);
  800. rc.InflateRect(1,1);
  801. InvalidateRect(rc);
  802. }
  803. GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ITEMCLICK, idx);
  804. }
  805. }
  806. else
  807. {
  808. if (ht1 == htItem)
  809. {
  810. if (idx != index)
  811. {
  812. OUTBAR_INFO ob;
  813. ob.iDragFrom = iSelFolder;
  814. ob.iDragTo = index;
  815. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
  816. {
  817. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  818. CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
  819. pbf->arItems.RemoveAt(index);
  820. if (idx > index) idx --;
  821. pbf->arItems.InsertAt(idx, piFrom);
  822. }
  823. }
  824. }
  825. else
  826. {
  827. CRect rcItem;
  828. GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
  829. if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
  830. {
  831. OUTBAR_INFO ob;
  832. ob.iDragFrom = iSelFolder;
  833. ob.iDragTo = index;
  834. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
  835. {
  836. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  837. CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
  838. pbf->arItems.RemoveAt(index);
  839. pbf->arItems.Add((void *) piFrom);
  840. }
  841. }
  842. }
  843. }
  844. }
  845. goto ExitLoop4;
  846. default:
  847. DispatchMessage(&msg);
  848. break;
  849. }
  850. }
  851. ExitLoop4:
  852. ReleaseCapture();
  853. AfxUnlockTempMaps(FALSE);
  854. if (bDragging) 
  855. {
  856. Invalidate();
  857. }
  858. }
  859. bPressedHighlight = false;
  860. if (bHigh) InvalidateRect(rc, false);
  861. }
  862. else iLastItemHighlighted = -1;
  863. if (ht == htDownScroll)
  864. {
  865. bLooping = true;
  866. bool bHigh = true;
  867. if (::GetCapture() == NULL)
  868. {
  869. SetCapture();
  870. ASSERT(this == GetCapture());
  871. CClientDC dc(this);
  872. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  873. SetTimer(2,300,NULL);
  874. AfxLockTempMaps();
  875. for (;;)
  876. {
  877. MSG msg;
  878. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  879. if (CWnd::GetCapture() != this) break;
  880. switch (msg.message)
  881. {
  882. case WM_MOUSEMOVE:
  883. {
  884. CPoint pt(msg.lParam);
  885. if (rcDownArrow.PtInRect(pt))
  886. {
  887. if (bHigh == false)
  888. {
  889. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  890. bHigh = true;
  891. bDownArrow = true;
  892. bDownPressed = true;
  893. }
  894. }
  895. else
  896. {
  897. if (bHigh == true)
  898. {
  899. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  900. bHigh = false;
  901. bDownArrow = false;
  902. bDownPressed = false;
  903. }
  904. }
  905. }
  906. break;
  907. case WM_LBUTTONUP:
  908. {
  909. if (bHigh)
  910. {
  911. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  912. bHigh = false;
  913. }
  914. bDownArrow = false;
  915. CPoint pt(msg.lParam);
  916. if (rcDownArrow.PtInRect(pt))
  917. {
  918. CRect itrc;
  919. GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
  920. CRect crc;
  921. GetInsideRect(crc);
  922. if (itrc.bottom > crc.bottom)
  923. {
  924. iFirstItem ++;
  925. InvalidateRect(crc, true);
  926. }
  927. }
  928. }
  929. goto ExitLoop3;
  930. case WM_TIMER:
  931. {
  932. if (msg.wParam == 2)
  933. {
  934. if (bHigh)
  935. {
  936. CPoint pt(msg.pt);
  937. ScreenToClient(&pt);
  938. if (rcDownArrow.PtInRect(pt))
  939. {
  940. bDownPressed = true;
  941. CRect itrc;
  942. GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
  943. CRect crc;
  944. GetInsideRect(crc);
  945. if (itrc.bottom > crc.bottom)
  946. {
  947. iFirstItem ++;
  948. InvalidateRect(crc, true);
  949. }
  950. else goto ExitLoop3;
  951. }
  952. else bDownPressed = false;
  953. }
  954. }
  955. break;
  956. }
  957. case WM_KEYDOWN:
  958. if (msg.wParam != VK_ESCAPE) 
  959. break;
  960. default:
  961. DispatchMessage(&msg);
  962. break;
  963. }
  964. }
  965. ExitLoop3:
  966. KillTimer(2);
  967. ReleaseCapture();
  968. AfxUnlockTempMaps(FALSE);
  969. bLooping = false;
  970. bDownPressed = false;
  971. bDownArrow = false;
  972. CRect crc;
  973. GetInsideRect(crc);
  974. InvalidateRect(crc, true);
  975. }
  976. }
  977. if (ht == htUpScroll)
  978. {
  979. bLooping = true;
  980. bool bHigh = true;
  981. if (::GetCapture() == NULL)
  982. {
  983. SetCapture();
  984. ASSERT(this == GetCapture());
  985. CClientDC dc(this);
  986. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  987. SetTimer(2,300,NULL);
  988. AfxLockTempMaps();
  989. for (;;)
  990. {
  991. MSG msg;
  992. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  993. if (CWnd::GetCapture() != this) break;
  994. switch (msg.message)
  995. {
  996. case WM_MOUSEMOVE:
  997. {
  998. CPoint pt(msg.lParam);
  999. if (rcUpArrow.PtInRect(pt))
  1000. {
  1001. if (bHigh == false)
  1002. {
  1003. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  1004. bHigh = true;
  1005. bUpArrow = true;
  1006. bUpPressed = true;
  1007. }
  1008. }
  1009. else
  1010. {
  1011. if (bHigh == true)
  1012. {
  1013. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  1014. bHigh = false;
  1015. bUpArrow = false;
  1016. bUpPressed = false;
  1017. }
  1018. }
  1019. }
  1020. break;
  1021. case WM_LBUTTONUP:
  1022. {
  1023. if (bHigh)
  1024. {
  1025. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  1026. bHigh = false;
  1027. }
  1028. bUpArrow = false;
  1029. CPoint pt(msg.lParam);
  1030. if (rcUpArrow.PtInRect(pt))
  1031. {
  1032. if (iFirstItem > 0 ) 
  1033. {
  1034. iFirstItem --;
  1035. CRect crc;
  1036. GetInsideRect(crc);
  1037. InvalidateRect(crc, true);
  1038. }
  1039. }
  1040. }
  1041. goto ExitLoop;
  1042. case WM_TIMER:
  1043. {
  1044. if (msg.wParam == 2)
  1045. {
  1046. if (bHigh)
  1047. {
  1048. CPoint pt(msg.pt);
  1049. ScreenToClient(&pt);
  1050. if (rcUpArrow.PtInRect(pt))
  1051. {
  1052. bUpPressed = true;
  1053. if (iFirstItem > 0) 
  1054. {
  1055. iFirstItem --;
  1056. CRect crc;
  1057. GetInsideRect(crc);
  1058. InvalidateRect(crc, true);
  1059. }
  1060. else goto ExitLoop;
  1061. }
  1062. else bUpPressed = false;
  1063. }
  1064. }
  1065. break;
  1066. }
  1067. case WM_KEYDOWN:
  1068. if (msg.wParam != VK_ESCAPE) break;
  1069. default:
  1070. DispatchMessage(&msg);
  1071. break;
  1072. }
  1073. }
  1074. ExitLoop:
  1075. KillTimer(2);
  1076. ReleaseCapture();
  1077. AfxUnlockTempMaps(FALSE);
  1078. bLooping = false;
  1079. bUpPressed = false;
  1080. bUpArrow = false;
  1081. CRect crc;
  1082. GetInsideRect(crc);
  1083. InvalidateRect(crc, true);
  1084. }
  1085. }
  1086. CWnd::OnLButtonDown(nFlags, point);
  1087. }
  1088. int CGfxOutBarCtrl::InsertItem(const int folder, const int index, const char * text, const int image, const DWORD exData)
  1089. {
  1090. ASSERT(folder >= 0 && folder < GetFolderCount());
  1091. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(folder);
  1092. return pbf->InsertItem(index, text, image, exData);
  1093. }
  1094. int CGfxOutBarCtrl::GetItemCount() const
  1095. {
  1096. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1097. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1098. return  pbf->GetItemCount();
  1099. }
  1100. void CGfxOutBarCtrl::SetSelFolder(const int index)
  1101. {
  1102. ASSERT(index >= 0 && index < GetFolderCount());
  1103. // if (index == iSelFolder) return;
  1104. CWnd * pc = GetFolderChild();
  1105. if (pc) pc->ShowWindow(SW_HIDE);
  1106. if (index != iSelFolder)
  1107. {
  1108. if (dwFlags&fAnimation && lAnimationTickCount >= 0) AnimateFolderScroll(iSelFolder, index);
  1109. }
  1110. iSelFolder = index;
  1111. iFirstItem = 0;
  1112. iLastSel = -1;
  1113. pc = GetFolderChild();
  1114. if (pc)
  1115. {
  1116. CRect rc;
  1117. GetInsideRect(rc);
  1118. pc->MoveWindow(rc);
  1119. pc->ShowWindow(SW_SHOW);
  1120. }
  1121. GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_FOLDERCHANGE, (LPARAM) iSelFolder);
  1122. Invalidate();
  1123. }
  1124. int CGfxOutBarCtrl::GetFolderCount() const
  1125. {
  1126. return arFolder.GetSize();
  1127. }
  1128. int CGfxOutBarCtrl::GetSelFolder() const
  1129. {
  1130. return iSelFolder;
  1131. }
  1132. void CGfxOutBarCtrl::RemoveFolder(const int index)
  1133. {
  1134. ASSERT(index >= 0 && index < GetFolderCount());
  1135. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1136. delete pbf;
  1137. arFolder.RemoveAt(index);
  1138. if (iSelFolder >= index) iSelFolder = index - 1;
  1139. if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;
  1140. Invalidate();
  1141. }
  1142. int CGfxOutBarCtrl::CBarFolder::InsertItem(int index, const char * text, const int image, const DWORD exData)
  1143. {
  1144. if (index < 0 || index > GetItemCount()) index = GetItemCount();
  1145. int c = GetItemCount();
  1146. CBarItem * pbf = new CBarItem(text, image, exData);
  1147. ASSERT(pbf);
  1148. if (index < GetItemCount()) 
  1149. arItems.InsertAt(index, (void *) pbf);
  1150. else 
  1151. arItems.Add((void *) pbf);
  1152. c = GetItemCount();
  1153. return index;
  1154. }
  1155. int CGfxOutBarCtrl::GetCountPerPage() const
  1156. {
  1157. return 0;
  1158. }
  1159. CImageList * CGfxOutBarCtrl::SetImageList(CImageList * pImageList, int nImageList)
  1160. {
  1161. CImageList * o = NULL;
  1162. if (nImageList == fSmallIcon)
  1163. {
  1164. o = pSmallImageList;
  1165. pSmallImageList = pImageList;
  1166. }
  1167. else if (nImageList == fLargeIcon)
  1168. {
  1169. o = pLargeImageList;
  1170. pLargeImageList = pImageList;
  1171. }
  1172. return o;
  1173. }
  1174. CImageList * CGfxOutBarCtrl::GetImageList(CImageList * pImageList, int nImageList)
  1175. {
  1176. if (nImageList == fSmallIcon) return pSmallImageList;
  1177. else if (nImageList == fLargeIcon) return pLargeImageList;
  1178. return NULL;
  1179. }
  1180. CImageList * CGfxOutBarCtrl::SetFolderImageList(const int folder, CImageList * pImageList, int nImageList)
  1181. {
  1182. ASSERT(folder >= 0 && folder < GetFolderCount());
  1183. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(folder);
  1184. CImageList * o = NULL;
  1185. if (nImageList == fSmallIcon)
  1186. {
  1187. o = pbf->pSmallImageList;
  1188. pbf->pSmallImageList = pImageList;
  1189. }
  1190. else if (nImageList == fLargeIcon)
  1191. {
  1192. o = pbf->pLargeImageList;
  1193. pbf->pLargeImageList = pImageList;
  1194. }
  1195. return o;
  1196. }
  1197. CGfxOutBarCtrl::CBarItem::CBarItem(const char * name, const int image, DWORD exData)
  1198. {
  1199. cItem = NULL;
  1200. iImageIndex = image;
  1201. dwData = exData;
  1202. if (name)
  1203. {
  1204. cItem = new char[lstrlen(name)+1];
  1205. ASSERT(cItem);
  1206. lstrcpy(cItem, name);
  1207. }
  1208. }
  1209. CGfxOutBarCtrl::CBarItem::~CBarItem()
  1210. {
  1211. if (cItem) delete [] cItem;
  1212. }
  1213. int CGfxOutBarCtrl::CBarFolder::GetItemCount()
  1214. {
  1215. return arItems.GetSize();
  1216. }
  1217. void CGfxOutBarCtrl::PaintItems(CDC * pDC, const int iFolder, CRect rc)
  1218. {
  1219. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1220. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1221. int max = pbf->GetItemCount(), t;
  1222. CRect irc;
  1223. GetInsideRect(irc);
  1224. int isdc = pDC->SaveDC();
  1225. CRgn itemRegion;
  1226. itemRegion.CreateRectRgnIndirect(&irc);
  1227. pDC->SelectClipRgn(&itemRegion);
  1228. itemRegion.DeleteObject();
  1229. for (t = iFirstItem; t < max; t++)
  1230. {
  1231. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  1232. CRect itemRc;
  1233. GetItemRect(iFolder, t, itemRc);
  1234. if (itemRc.top > rc.bottom) break;
  1235. else DrawItem(pDC, iFolder, itemRc, t);
  1236. }
  1237. pDC->RestoreDC(isdc);
  1238. }
  1239. CSize CGfxOutBarCtrl::GetItemSize(const int iFolder, const int index, const int type)
  1240. {
  1241. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1242. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1243. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1244. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1245. CSize szImage(0,0);
  1246. CSize szLabel(0,0);
  1247. CSize szAll(0,0);
  1248. if (pi->iImageIndex >= 0)
  1249. {
  1250. if (type != ircLabel)
  1251. {
  1252. CImageList * il = GetFolderImageList(iFolder, IsSmallIconView());
  1253. ASSERT(il);
  1254. if (il)
  1255. {
  1256. IMAGEINFO ii;
  1257. il->GetImageInfo(pi->iImageIndex, &ii);
  1258. szImage = CRect(ii.rcImage).Size();
  1259. }
  1260. }
  1261. }
  1262. if (pi->cItem)
  1263. {
  1264. if (type != ircIcon)
  1265. {
  1266. CClientDC dc(this);
  1267. CFont * oft = (CFont *) dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  1268. if (IsSmallIconView())
  1269. {
  1270. szLabel = dc.GetTextExtent(pi->cItem, lstrlen(pi->cItem));
  1271. }
  1272. else
  1273. {
  1274. CRect rc;
  1275. GetInsideRect(rc);
  1276. rc.bottom = rc.top;
  1277. dc.DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CALCRECT|DT_CENTER|DT_WORDBREAK);
  1278. szLabel = rc.Size();
  1279. }
  1280. dc.SelectObject(oft);
  1281. }
  1282. }
  1283. if (IsSmallIconView())
  1284. {
  1285. if (type == ircIcon) szAll = szImage;
  1286. else if (type == ircLabel) szAll = szLabel;
  1287. else if (type == ircAll) szAll = CSize(szImage.cx + szLabel.cx + xSmallIconLabelOffset, szImage.cy > szLabel.cy ? szImage.cy : szLabel.cy);
  1288. }
  1289. else
  1290. {
  1291. if (type == ircIcon) szAll = szImage;
  1292. else if (type == ircLabel) szAll = szLabel;
  1293. else if (type == ircAll) 
  1294. {
  1295. szAll = CSize(szImage.cx > szLabel.cx ? szImage.cx : szLabel.cx, szLabel.cy + szImage.cy + yLargeIconLabelOffset + yLargeIconSpacing);
  1296. }
  1297. }
  1298. return szAll;
  1299. }
  1300. CImageList * CGfxOutBarCtrl::GetFolderImageList(const int index, const bool bSmall) const
  1301. {
  1302. ASSERT(index >= 0 && index < GetFolderCount());
  1303. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1304. if (bSmall)
  1305. {
  1306. if (pbf->pSmallImageList) return pbf->pSmallImageList; else return pSmallImageList;
  1307. }
  1308. if (pbf->pLargeImageList) return pbf->pLargeImageList; else return pLargeImageList;
  1309. }
  1310. void CGfxOutBarCtrl::DrawItem(CDC * pDC, const int iFolder, CRect rc, const int index, const bool bOnlyImage)
  1311. {
  1312. CImageList * ima = GetFolderImageList(iFolder, IsSmallIconView());
  1313. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1314. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1315. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1316. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1317. ASSERT(pi && ima);
  1318. CFont * oft = (CFont *) pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  1319. COLORREF ocr = pDC->SetTextColor(crTextColor);
  1320. int obk = pDC->SetBkMode(TRANSPARENT);
  1321. if (IsSmallIconView())
  1322. {
  1323. if (ima)
  1324. {
  1325. IMAGEINFO ii;
  1326. ima->GetImageInfo(pi->iImageIndex, &ii);
  1327. CSize szImage = CRect(ii.rcImage).Size();
  1328. CPoint pt;
  1329. pt.x = rc.left + 2;
  1330. pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
  1331. ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
  1332. if (!bOnlyImage)
  1333. {
  1334. rc.left += szImage.cx + xSmallIconLabelOffset;
  1335. pDC->TextOut(rc.left, rc.top, CString(pi->cItem));
  1336. }
  1337. }
  1338. }
  1339. else
  1340. {
  1341. if (ima)
  1342. {
  1343. IMAGEINFO ii;
  1344. ima->GetImageInfo(pi->iImageIndex, &ii);
  1345. CSize szImage = CRect(ii.rcImage).Size();
  1346. CPoint pt;
  1347. pt.x = rc.left + (rc.Width() - szImage.cx) / 2;
  1348. pt.y = rc.top;// + (rc.Height() - szImage.cy) / 2;
  1349. ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
  1350. if (!bOnlyImage)
  1351. {
  1352. rc.top += szImage.cy + yLargeIconLabelOffset;
  1353. pDC->DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CENTER|DT_WORDBREAK);
  1354. }
  1355. }
  1356. }
  1357. if (dwFlags&fSelHighlight && iLastSel == index && iLastSel >= 0)
  1358. {
  1359. CRect rc;
  1360. GetIconRect(iSelFolder, iLastSel, rc);
  1361. rc.InflateRect(1,1);
  1362. pDC->Draw3dRect(rc, crDkShadowBorder, cr3dFace);
  1363. }
  1364. pDC->SetTextColor(ocr);
  1365. pDC->SelectObject(oft);
  1366. pDC->SetBkMode(obk);
  1367. }
  1368. BOOL CGfxOutBarCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  1369. {
  1370. CPoint pt(GetMessagePos());
  1371. ScreenToClient(&pt);
  1372. int index, ht = HitTestEx(pt, index);
  1373. if (ht == htFolder)
  1374. {
  1375. SetCursor(hHandCursor);
  1376. return true;
  1377. }
  1378. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  1379. }
  1380. void CGfxOutBarCtrl::GetVisibleRange(const int iFolder, int & first, int & last)
  1381. {
  1382. first = iFirstItem;
  1383. CRect rc;
  1384. GetInsideRect(rc);
  1385. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1386. int max = pbf->GetItemCount(), t;
  1387. for (t = iFirstItem; t < max; t++)
  1388. {
  1389. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  1390. CRect itemRc;
  1391. GetItemRect(iFolder, t, itemRc);
  1392. if (itemRc.bottom > rc.bottom) 
  1393. {
  1394. last = t - 1;
  1395. break;
  1396. }
  1397. else last = t;
  1398. }
  1399. }
  1400. void CGfxOutBarCtrl::OnSize(UINT nType, int cx, int cy) 
  1401. {
  1402. bUpArrow = bDownArrow = false;
  1403. CWnd::OnSize(nType, cx, cy);
  1404. int t, max = GetFolderCount();
  1405. CRect rc;
  1406. GetInsideRect(rc);
  1407. for (t = 0; t < max; t++)
  1408. {
  1409. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(t);
  1410. CWnd * pc = GetFolderChild(t);
  1411. if (pc) pc->SetWindowPos(0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER);
  1412. }
  1413. }
  1414. void CGfxOutBarCtrl::HighlightItem(const int index, const bool bPressed)
  1415. {
  1416. CWnd * pf = GetFocus();
  1417. if (pf != NULL && pf != this && IsChild(pf)) return;
  1418. static bool bOldPressed = false;
  1419. if (iLastItemHighlighted == index && bOldPressed == bPressed) return;
  1420. bOldPressed = bPressed;
  1421. CClientDC dc(this);
  1422. CRect irc;
  1423. GetInsideRect(irc);
  1424. int isdc = dc.SaveDC();
  1425. CRgn itemRegion;
  1426. itemRegion.CreateRectRgnIndirect(&irc);
  1427. dc.SelectClipRgn(&itemRegion);
  1428. itemRegion.DeleteObject();
  1429. if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
  1430. {
  1431. CRect rc;
  1432. GetIconRect(iSelFolder, iLastItemHighlighted, rc);
  1433. rc.InflateRect(1,1);
  1434. dc.Draw3dRect(rc, crBackGroundColor, crBackGroundColor);
  1435. }
  1436. if (iSelAnimTiming > 0 && index == iLastSel)
  1437. {
  1438. iLastItemHighlighted = -1;
  1439. return;
  1440. }
  1441. if (dwFlags&fSelHighlight && iLastSel == index)
  1442. {
  1443. iLastItemHighlighted = -1;
  1444. return;
  1445. }
  1446. iLastItemHighlighted = index;
  1447. if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
  1448. {
  1449. CRect rc;
  1450. GetIconRect(iSelFolder, iLastItemHighlighted, rc);
  1451. rc.InflateRect(1,1);
  1452. if (bPressed)
  1453. dc.Draw3dRect(rc, crDkShadowBorder, cr3dFace);
  1454. else
  1455. dc.Draw3dRect(rc, cr3dFace, crDkShadowBorder);
  1456. }
  1457. dc.RestoreDC(isdc);
  1458. }
  1459. void CGfxOutBarCtrl::GetIconRect(const int iFolder, const int iIndex, CRect & rect)
  1460. {
  1461. CRect rc;
  1462. GetInsideRect(rc);
  1463. int top = rc.top;
  1464. CSize sz(0,0);
  1465. int y = 0;
  1466. int spacing = IsSmallIconView() ? ySmallIconSpacing : yLargeIconSpacing;
  1467. for (int t = 0; t < iIndex; t++)
  1468. {
  1469. sz = GetItemSize(iFolder, t, ircAll);
  1470. top += sz.cy;
  1471. top += spacing;
  1472. if (t == iFirstItem - 1) y = top - rc.top;
  1473. }
  1474. top += spacing;
  1475. sz = GetItemSize(iFolder, iIndex, ircIcon);
  1476. if (IsSmallIconView())
  1477. {
  1478. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  1479. rect.left += xLeftMargin + 2;
  1480. rect.right += xLeftMargin + 2;
  1481. rect.top -= yTopMargin;
  1482. rect.bottom -= yTopMargin;
  1483. rect.top -= y;
  1484. rect.bottom -= y;
  1485. }
  1486. else
  1487. {
  1488. rect.SetRect(rc.left + (rc.Width() - sz.cx)/2, top, rc.left + (rc.Width() - sz.cx)/2 + sz.cx, top + sz.cy);
  1489. rect.top -= y + 3;
  1490. rect.bottom -= y + 2;
  1491. }
  1492. }
  1493. void CGfxOutBarCtrl::GetLabelRect(const int iFolder, const int iIndex, CRect & rect)
  1494. {
  1495. CRect rc;
  1496. GetInsideRect(rc);
  1497. int top = rc.top;
  1498. CSize sz(0,0);
  1499. int y = 0;
  1500. int spacing = IsSmallIconView() ? ySmallIconSpacing : yLargeIconSpacing;
  1501. for (int t = 0; t < iIndex; t++)
  1502. {
  1503. sz = GetItemSize(iFolder, t, ircAll);
  1504. top += sz.cy;
  1505. top += spacing;
  1506. if (t == iFirstItem - 1) y = top - rc.top;
  1507. }
  1508. top += spacing;
  1509. sz = GetItemSize(iFolder, iIndex, ircAll);
  1510. CSize szLabel = GetItemSize(iFolder, iIndex, ircLabel);
  1511. if (IsSmallIconView())
  1512. {
  1513. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  1514. rect.left += xLeftMargin + 2;
  1515. rect.right += xLeftMargin + 2;
  1516. rect.top  += yTopMargin - 5;
  1517. rect.bottom += yTopMargin - 5;
  1518. }
  1519. else
  1520. {
  1521. rect.SetRect(rc.left + (rc.Width() - sz.cx)/2, top, rc.left + (rc.Width() - sz.cx)/2 + sz.cx, top + sz.cy);
  1522. rect.top -= y + 3;
  1523. rect.bottom -= y + 2;
  1524. rect.bottom -=  yLargeIconSpacing;
  1525. rect.top    = rect.bottom - szLabel.cy;
  1526. }
  1527. }
  1528. void CGfxOutBarCtrl::StartGroupEdit(const int index)
  1529. {
  1530. CGfxGroupEdit * pEdit = new CGfxGroupEdit;
  1531. pEdit->iIndex = index;
  1532. CRect rc;
  1533. GetFolderRect(index, rc);
  1534. rc.InflateRect(-2,-2);
  1535. pEdit->Create(WS_CHILD|WS_VISIBLE|ES_CENTER|ES_MULTILINE,rc,this,1);
  1536. pEdit->msgSend = NM_OB_ONGROUPENDEDIT;
  1537. pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
  1538. ASSERT(index >= 0 && index < GetFolderCount());
  1539. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1540. pEdit->SetWindowText(pbf->cName);
  1541. pEdit->SetFocus();
  1542. }
  1543. void CGfxOutBarCtrl::StartItemEdit(const int index)
  1544. {
  1545. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1546. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1547. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1548. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1549. CGfxGroupEdit * pEdit = new CGfxGroupEdit;
  1550. pEdit->iIndex = index;
  1551. CRect rc, crc;
  1552. GetLabelRect(iSelFolder, index, rc);
  1553. GetInsideRect(crc);
  1554. DWORD dwFlag = WS_CHILD|WS_VISIBLE|WS_BORDER;
  1555. if (!IsSmallIconView())
  1556. {
  1557. rc.left = crc.left + 5;
  1558. rc.right = crc.right - 5;
  1559. rc.bottom += 5;
  1560. dwFlag |= ES_CENTER|ES_MULTILINE;
  1561. }
  1562. else 
  1563. {
  1564. CRect irc;
  1565. GetIconRect(iSelFolder, index, irc);
  1566. dwFlag |= ES_AUTOHSCROLL;
  1567. rc.OffsetRect(irc.Width()+1, -6);
  1568. pEdit->bNoDown = true;
  1569. }
  1570. pEdit->Create(dwFlag, rc, this, 1);
  1571. pEdit->msgSend = NM_OB_ONLABELENDEDIT;
  1572. pEdit->SetWindowText(pi->cItem);
  1573. pEdit->SetFocus();
  1574. }
  1575. void CGfxOutBarCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
  1576. {
  1577. iHitInternal1 = HitTestEx(point, iHitInternal2);
  1578. CGfxPopupMenu cMenu;
  1579. cMenu.CreatePopupMenu();
  1580. cMenu.AppendMenu(MF_STRING, ID_GFX_SMALLICON, _ID_GFX_SMALLICON);
  1581. cMenu.AppendMenu(MF_STRING, ID_GFX_LARGEICON, _ID_GFX_LARGEICON);
  1582. cMenu.AppendMenu(MF_STRING, ID_GFX_GROUPICON, _ID_GFX_ADDAGROUP);
  1583. cMenu.AppendMenu(MF_STRING, ID_GFX_FONTCICON, _ID_GFX_FONTCOLOR);
  1584. cMenu.AppendMenu(MF_STRING, ID_GFX_BACKCICON, _ID_GFX_BACKCOLOR);
  1585. if (iHitInternal1 == htItem)
  1586. {
  1587. if (dwFlags&fRemoveItems || dwFlags&fEditItems)
  1588. {
  1589. cMenu.AppendMenu(MF_SEPARATOR);
  1590. if (dwFlags&fRemoveItems)
  1591. cMenu.AppendMenu(MF_STRING, ID_GFX_REMOVEITEM, _ID_GFX_REMOVEITEM);
  1592. if (dwFlags&fEditItems)
  1593. cMenu.AppendMenu(MF_STRING, ID_GFX_RENAMEITEM, _ID_GFX_RENAMEITEM);
  1594. }
  1595. }
  1596. else if (iHitInternal1 == htFolder)
  1597. {
  1598. if (dwFlags&fRemoveGroups || dwFlags&fEditGroups)
  1599. {
  1600. cMenu.AppendMenu(MF_SEPARATOR);
  1601. if (dwFlags&fRemoveGroups)
  1602. cMenu.AppendMenu(MF_STRING, ID_GFX_REMOVEITEM, _ID_GFX_REMOVEITEM);
  1603. if (dwFlags&fEditGroups)
  1604. cMenu.AppendMenu(MF_STRING, ID_GFX_RENAMEITEM, _ID_GFX_RENAMEITEM);
  1605. }
  1606. }
  1607. cMenu.LoadToolBarResource(IDR_MAINFRAME);
  1608. cMenu.RemapMenu(&cMenu);
  1609. cMenu.EnableMenuItems(&cMenu, this);
  1610. CPoint pt(point);
  1611. ClientToScreen(&pt);
  1612. cMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, this);
  1613. cMenu.DestroyMenu();
  1614. CWnd::OnRButtonDown(nFlags, point);
  1615. }
  1616. void CGfxOutBarCtrl::OnGfxLargeicon() 
  1617. {
  1618. SetSmallIconView(false);
  1619. Invalidate();
  1620. }
  1621. void CGfxOutBarCtrl::OnUpdateGfxLargeicon(CCmdUI* pCmdUI) 
  1622. {
  1623. pCmdUI->Enable(IsSmallIconView());
  1624. }
  1625. void CGfxOutBarCtrl::OnGfxSmallicon() 
  1626. {
  1627. SetSmallIconView(true);
  1628. Invalidate();
  1629. }
  1630. void CGfxOutBarCtrl::OnUpdateGfxSmallicon(CCmdUI* pCmdUI) 
  1631. {
  1632. pCmdUI->Enable(!IsSmallIconView());
  1633. }
  1634. void CGfxOutBarCtrl::OnGfxRemoveitem() 
  1635. {
  1636. if (iHitInternal1 == htFolder)
  1637. {
  1638. RemoveFolder(iHitInternal2);
  1639. }
  1640. else if (iHitInternal1 == htItem)
  1641. {
  1642. RemoveItem(iHitInternal2);
  1643. }
  1644. }
  1645. void CGfxOutBarCtrl::OnUpdateGfxRemoveitem(CCmdUI* pCmdUI) 
  1646. {
  1647. }
  1648. void CGfxOutBarCtrl::OnGfxRenameitem() 
  1649. {
  1650. if (iHitInternal1 == htFolder)
  1651. {
  1652. StartGroupEdit(iHitInternal2);
  1653. }
  1654. else if (iHitInternal1 == htItem)
  1655. {
  1656. StartItemEdit(iHitInternal2);
  1657. }
  1658. }
  1659. void CGfxOutBarCtrl::OnUpdateGfxRenameitem(CCmdUI* pCmdUI) 
  1660. {
  1661. }
  1662. void CGfxOutBarCtrl::RemoveItem(const int index)
  1663. {
  1664. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1665. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1666. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1667. if (IsValidItem(index))
  1668. {
  1669. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1670. delete i;
  1671. pbf->arItems.RemoveAt(index);
  1672. CRect rc;
  1673. GetInsideRect(rc);
  1674. InvalidateRect(rc);
  1675. }
  1676. }
  1677. bool CGfxOutBarCtrl::IsValidItem(const int index) const
  1678. {
  1679. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1680. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1681. return (index >= 0 && index < pbf->GetItemCount());
  1682. }
  1683. DWORD CGfxOutBarCtrl::GetItemData(const int index) const
  1684. {
  1685. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1686. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1687. if (IsValidItem(index))
  1688. {
  1689. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1690. return i->dwData;
  1691. }
  1692. return 0;
  1693. }
  1694. int CGfxOutBarCtrl::GetItemImage(const int index) const
  1695. {
  1696. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1697. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1698. if (IsValidItem(index))
  1699. {
  1700. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1701. return i->iImageIndex;
  1702. }
  1703. return 0;
  1704. }
  1705. void CGfxOutBarCtrl::SetItemData(const int index, const DWORD dwData)
  1706. {
  1707. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1708. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1709. if (IsValidItem(index))
  1710. {
  1711. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1712. i->dwData = dwData;
  1713. }
  1714. }
  1715. void CGfxOutBarCtrl::SetItemImage(const int index, const int iImage)
  1716. {
  1717. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1718. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1719. if (IsValidItem(index))
  1720. {
  1721. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1722. i->iImageIndex = iImage;
  1723. }
  1724. }
  1725. void CGfxOutBarCtrl::DrawDragArrow(CDC * pDC, const int iFrom, const int iTo)
  1726. {
  1727. if (iTo == iLastDragItemDraw) return;
  1728. CRect rc1;
  1729. if (iLastDragItemDraw >= 0)
  1730. {
  1731. GetDragItemRect(iLastDragItemDraw, rc1);
  1732. if (iLastDragItemDrawType == 0) rc1.bottom = rc1.top + 5;
  1733. else if (iLastDragItemDrawType == 1) { rc1.top -= 4; rc1.bottom = rc1.top + 9; }
  1734. else if (iLastDragItemDrawType == 2) { rc1.top -= 4; rc1.bottom = rc1.top + 5; }
  1735. InvalidateRect(rc1, true);
  1736. UpdateWindow();
  1737. }
  1738. iLastDragItemDraw = iTo;
  1739. if (iLastDragItemDraw >= 0)
  1740. {
  1741. iLastDragItemDrawType = GetDragItemRect(iLastDragItemDraw, rc1);
  1742. CPen * op = pDC->SelectObject(pBlackPen);
  1743. pDC->MoveTo(rc1.left, rc1.top);
  1744. pDC->LineTo(rc1.right, rc1.top);
  1745. if (iLastDragItemDrawType != 2)
  1746. {
  1747. pDC->MoveTo(rc1.left, rc1.top+1);
  1748. pDC->LineTo(rc1.left + 7, rc1.top+1);
  1749. pDC->MoveTo(rc1.left, rc1.top+2);
  1750. pDC->LineTo(rc1.left + 5, rc1.top+2);
  1751. pDC->MoveTo(rc1.left, rc1.top+3);
  1752. pDC->LineTo(rc1.left + 3, rc1.top+3);
  1753. pDC->MoveTo(rc1.left, rc1.top+4);
  1754. pDC->LineTo(rc1.left + 1, rc1.top+4);
  1755. pDC->MoveTo(rc1.right-1, rc1.top+1);
  1756. pDC->LineTo(rc1.right - 7, rc1.top+1);
  1757. pDC->MoveTo(rc1.right-1, rc1.top+2);
  1758. pDC->LineTo(rc1.right - 5, rc1.top+2);
  1759. pDC->MoveTo(rc1.right-1, rc1.top+3);
  1760. pDC->LineTo(rc1.right - 3, rc1.top+3);
  1761. }
  1762. if (iLastDragItemDrawType != 0)
  1763. {
  1764. pDC->MoveTo(rc1.left, rc1.top-1);
  1765. pDC->LineTo(rc1.left + 7, rc1.top-1);
  1766. pDC->MoveTo(rc1.left, rc1.top-2);
  1767. pDC->LineTo(rc1.left + 5, rc1.top-2);
  1768. pDC->MoveTo(rc1.left, rc1.top-3);
  1769. pDC->LineTo(rc1.left + 3, rc1.top-3);
  1770. pDC->MoveTo(rc1.left, rc1.top-4);
  1771. pDC->LineTo(rc1.left + 1, rc1.top-4);
  1772. pDC->MoveTo(rc1.right-1, rc1.top-1);
  1773. pDC->LineTo(rc1.right - 7, rc1.top-1);
  1774. pDC->MoveTo(rc1.right-1, rc1.top-2);
  1775. pDC->LineTo(rc1.right - 5, rc1.top-2);
  1776. pDC->MoveTo(rc1.right-1, rc1.top-3);
  1777. pDC->LineTo(rc1.right - 3, rc1.top-3);
  1778. pDC->MoveTo(rc1.right-1, rc1.top-4);
  1779. pDC->LineTo(rc1.right - 1, rc1.top-4);
  1780. }
  1781. pDC->SelectObject(op);
  1782. }
  1783. }
  1784. int CGfxOutBarCtrl::GetDragItemRect(const int index, CRect & rect)
  1785. {
  1786. CRect rc, crc;
  1787. GetInsideRect(crc);
  1788. crc.InflateRect(-2, 0);
  1789. GetItemRect(iSelFolder, index < GetItemCount() ? index : index - 1, rc);
  1790. int line = 0;
  1791. if (index < GetItemCount())
  1792. {
  1793. line = rc.top - 4;
  1794. }
  1795. else
  1796. {
  1797. line = rc.bottom + 6;
  1798. }
  1799. int tpe;
  1800. if (index == 0)
  1801. {
  1802. rect.SetRect(crc.left, line+2, crc.right, line + 7);
  1803. tpe = 0;
  1804. }
  1805. else if (index < GetItemCount())
  1806. {
  1807. rect.SetRect(crc.left, line - 9, crc.right, line);
  1808. tpe = 1;
  1809. if (IsSmallIconView()) 
  1810. {
  1811. rect.top += 8;
  1812. rect.bottom += 8;
  1813. }
  1814. }
  1815. else
  1816. {
  1817. rect.SetRect(crc.left, line, crc.right, line + 5);
  1818. tpe = 2;
  1819. }
  1820. return tpe;
  1821. }
  1822. void CGfxOutBarCtrl::AnimateFolderScroll(const int iFrom, const int iTo)
  1823. {
  1824. ASSERT(iFrom >= 0 && iFrom < GetFolderCount());
  1825. ASSERT(iTo >= 0 && iTo < GetFolderCount());
  1826. CRect rc, rc1, frc, frc1;
  1827. GetInsideRect(rc);
  1828. rc1.SetRect(0,0,rc.Width(),rc.Height());
  1829. GetFolderRect(iTo, frc);
  1830. frc1 = frc;
  1831. CClientDC dc(this);
  1832. CDC memDC;
  1833. memDC.CreateCompatibleDC(&dc);
  1834. CBitmap bmpFrom, bmpTo;
  1835. bmpFrom.CreateCompatibleBitmap(&dc, rc1.Width(), rc1.Height() + frc.Height() * 2);
  1836. bmpTo.CreateCompatibleBitmap(&dc, rc1.Width(), rc1.Height() + frc.Height() * 2);
  1837. CDC * pDC = &memDC;
  1838. CWnd * pWnd1 = GetFolderChild(iFrom);
  1839. CWnd * pWnd2 = GetFolderChild(iTo);
  1840. CBitmap * obmp = pDC->SelectObject(&bmpFrom);
  1841. if (iTo > iFrom)
  1842. {
  1843. rc1.bottom += frc.Height() * 2;
  1844. pDC->FillSolidRect(rc1, crBackGroundColor);
  1845. if (pWnd1) 
  1846. {
  1847. BOOL bPrev = pWnd1->ShowWindow(SW_SHOW);
  1848. pWnd1->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1849. pWnd1->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1850. if (!bPrev) pWnd1->ShowWindow(SW_HIDE);
  1851. }
  1852. else PaintItems(pDC, iFrom, rc1);
  1853. pDC->SelectObject(&bmpTo);
  1854. frc.SetRect(0,0,frc.Width(),frc.Height());
  1855. rc1.SetRect(0,frc.Height(),rc.Width(), rc.Height()+frc.Height() * 2);
  1856. pDC->FillSolidRect(rc1, crBackGroundColor);
  1857. if (pWnd2) 
  1858. {
  1859. CPoint ovpt = pDC->SetViewportOrg(0, frc.Height());
  1860. BOOL bPrev = pWnd2->ShowWindow(SW_SHOW);
  1861. pWnd2->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1862. pWnd2->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1863. if (!bPrev) pWnd2->ShowWindow(SW_HIDE);
  1864. pDC->SetViewportOrg(ovpt);
  1865. }
  1866. else PaintItems(pDC, iTo, rc1);
  1867. DrawFolder(pDC, iTo, frc, false);
  1868. }
  1869. else
  1870. {
  1871. frc.SetRect(0,0,frc.Width(),frc.Height());
  1872. rc1.top += frc.Height();
  1873. rc1.bottom += frc.Height() * 2;
  1874. pDC->FillSolidRect(rc1, crBackGroundColor);
  1875. if (pWnd1) 
  1876. {
  1877. CPoint ovpt = pDC->SetViewportOrg(0, frc.Height());
  1878. BOOL bPrev = pWnd1->ShowWindow(SW_SHOW);
  1879. pWnd1->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1880. pWnd1->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1881. if (!bPrev) pWnd1->ShowWindow(SW_HIDE);
  1882. pDC->SetViewportOrg(ovpt);
  1883. }
  1884. else PaintItems(pDC, iFrom, rc1);
  1885. DrawFolder(pDC, iFrom, frc, false);
  1886. pDC->SelectObject(&bmpTo);
  1887. rc1.SetRect(0,0,rc.Width(), rc.Height() + frc.Height() * 2);
  1888. pDC->FillSolidRect(rc1, crBackGroundColor);
  1889. if (pWnd2) 
  1890. {
  1891. BOOL bPrev = pWnd2->ShowWindow(SW_SHOW);
  1892. pWnd2->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1893. pWnd2->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1894. if (!bPrev) pWnd2->ShowWindow(SW_HIDE);
  1895. }
  1896. else PaintItems(pDC, iTo, rc1);
  1897. }
  1898. if (iTo > iFrom)
  1899. {
  1900. CRect rcFrom, rcTo;
  1901. GetFolderRect(iFrom, rcFrom);
  1902. GetFolderRect(iTo, rcTo);
  1903. int fh = rcFrom.Height();
  1904. for (int y = rcTo.top - fh; y > rcFrom.bottom; y -= fh)
  1905. {
  1906. pDC->SelectObject(&bmpFrom);
  1907. dc.BitBlt(rc.left, rcFrom.bottom + 1, rc.Width(), y - rcFrom.bottom - 1, pDC, 0,fh, SRCCOPY);
  1908. pDC->SelectObject(&bmpTo);
  1909. dc.BitBlt(rc.left, y, rc.Width(), rc.bottom - y + fh, pDC, 0,0, SRCCOPY);
  1910. Sleep(lAnimationTickCount);
  1911. }
  1912. }
  1913. else
  1914. {
  1915. CRect rcFrom, rcTo;
  1916. GetFolderRect(iFrom, rcFrom);
  1917. int fh = rcFrom.Height();
  1918. rcTo.SetRect(rc.left, rc.bottom, rc.right, rc.bottom - fh);
  1919. for (int y = rcFrom.top + 1; y < rcTo.top - fh; y += fh)
  1920. {
  1921. pDC->SelectObject(&bmpTo);
  1922. dc.BitBlt(rc.left, rcFrom.top, rc.Width(), y - rcFrom.top - 1, pDC, 0, fh*2, SRCCOPY);
  1923. pDC->SelectObject(&bmpFrom);
  1924. dc.BitBlt(rc.left, y, rc.Width(), rc.bottom - y, pDC, 0,0, SRCCOPY);
  1925. Sleep(lAnimationTickCount);
  1926. }
  1927. }
  1928. pDC->SelectObject(obmp);
  1929. }
  1930. CString CGfxOutBarCtrl::GetItemText(const int index)
  1931. {
  1932. CString item;
  1933. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1934. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1935. if (IsValidItem(index))
  1936. {
  1937. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1938. if (pi->cItem) item = pi->cItem;
  1939. }
  1940. return item;
  1941. }
  1942. int CGfxOutBarCtrl::AddFolderBar(const char * pFolder, CWnd * pSon, const DWORD exData)
  1943. {
  1944. CBarFolder * pbf = new CBarFolder(pFolder, exData);
  1945. ASSERT(pbf);
  1946. pbf->pChild = pSon;
  1947. arFolder.Add((void *)pbf);
  1948. return arFolder.GetSize() - 1;
  1949. }
  1950. CWnd * CGfxOutBarCtrl::GetFolderChild(int iFolder)
  1951. {
  1952. if (GetFolderCount())
  1953. {
  1954. if (iFolder < 0) iFolder = iSelFolder;
  1955. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1956. return pbf->pChild;
  1957. }
  1958. return NULL;
  1959. }
  1960. DWORD CGfxOutBarCtrl::GetFolderData(int iFolder)
  1961. {
  1962. if (iFolder < 0) iFolder = iSelFolder;
  1963. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1964. return pbf->dwData;
  1965. }
  1966. void CGfxOutBarCtrl::SetAnimSelHighlight(const int iTime)
  1967. {
  1968. if (iTime <= 0) KillTimer(3);
  1969. else SetTimer(3, iTime, NULL);
  1970. iSelAnimTiming = iTime;
  1971. }