GFXOUTBARCTRL.CPP
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:58k
源码类别:

网格计算

开发平台:

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