XTPTabToolBar.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:12k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPTabToolBar.cpp : implementation of the CXTPTabToolBar class.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPImageManager.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "XTPControl.h"
  24. #include "XTPControlPopup.h"
  25. #include "XTPControls.h"
  26. #include "XTPCommandBars.h"
  27. #include "XTPPaintManager.h"
  28. #include "XTPTabToolBar.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CXTPTabToolBar
  36. IMPLEMENT_XTP_COMMANDBAR(CXTPTabToolBar, CXTPToolBar)
  37. class CXTPTabToolBarControls : public CXTPControls
  38. {
  39. DECLARE_DYNCREATE(CXTPTabToolBarControls)
  40. protected:
  41. void OnControlAdded(CXTPControl* pControl)
  42. {
  43. CXTPTabManagerItem* pItem = m_pParent ? ((CXTPTabToolBar*)m_pParent)->GetSelectedItem() : NULL;
  44. if (pItem)
  45. {
  46. pControl->SetHideFlag(xtpHideRibbonTab, pControl->GetCategory() != pItem->GetCaption());
  47. }
  48. CXTPControls::OnControlAdded(pControl);
  49. }
  50. };
  51. IMPLEMENT_DYNCREATE(CXTPTabToolBarControls, CXTPControls)
  52. CXTPTabToolBar::CXTPTabToolBar()
  53. {
  54. SetControls(new CXTPTabToolBarControls());
  55. m_pTabPaintManager = new CXTPTabPaintManager();
  56. m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage2003);
  57. m_pTabPaintManager->m_bFillBackground = FALSE;
  58. m_pTabPaintManager->m_bHotTracking = TRUE;
  59. m_pTabPaintManager->m_clientFrame = xtpTabFrameSingleLine;
  60. m_bAllowReorder = FALSE;
  61. m_nMinWidth = 100;
  62. m_rcTabControl.SetRectEmpty();
  63. EnableAutomation();
  64. }
  65. CXTPTabToolBar::~CXTPTabToolBar()
  66. {
  67. CMDTARGET_RELEASE(m_pTabPaintManager);
  68. }
  69. CXTPTabManagerItem* CXTPTabToolBar::InsertCategory(int nItem, LPCTSTR lpszItem, UINT nIDResource, BOOL bLoadIcons)
  70. {
  71. LPCTSTR lpszResourceName = MAKEINTRESOURCE(nIDResource);
  72. struct CToolBarData
  73. {
  74. WORD wVersion;
  75. WORD wWidth;
  76. WORD wHeight;
  77. WORD wItemCount;
  78. WORD* items()
  79. { return (WORD*)(this + 1); }
  80. };
  81. ASSERT_VALID(this);
  82. ASSERT(lpszResourceName != NULL);
  83. if (!lpszResourceName)
  84. return FALSE;
  85. // determine location of the bitmap in resource fork
  86. HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);
  87. if (!hInst)
  88. return FALSE;
  89. HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);
  90. if (hRsrc == NULL)
  91. return NULL;
  92. HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
  93. if (hGlobal == NULL)
  94. return NULL;
  95. CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
  96. if (pData == NULL)
  97. return NULL;
  98. ASSERT(pData->wVersion == 1);
  99. UINT* pItems = new UINT[pData->wItemCount];
  100. for (int i = 0; i < pData->wItemCount; i++)
  101. pItems[i] = pData->items()[i];
  102. CXTPTabManagerItem* pItem = InsertCategory(nItem, lpszItem, pItems, pData->wItemCount, bLoadIcons);
  103. if (bLoadIcons)
  104. {
  105. CXTPImageManager* pImageManager = GetImageManager();
  106. pImageManager->SetIcons(nIDResource, pItems,
  107. pData->wItemCount, CSize(pData->wWidth, pData->wHeight));
  108. }
  109. delete[] pItems;
  110. UnlockResource(hGlobal);
  111. FreeResource(hGlobal);
  112. return pItem;
  113. }
  114. CXTPTabManagerItem* CXTPTabToolBar::InsertCategory(int nItem, LPCTSTR lpszItem, UINT* pButtons, int nCount, BOOL bLoadIcons)
  115. {
  116. CXTPTabManagerItem* pItem = AddItem(nItem);
  117. pItem->SetCaption(lpszItem);
  118. CWnd* pSite = GetSite();
  119. BOOL bSeparator = FALSE;
  120. CXTPImageManager* pImageManager = GetImageManager();
  121. for (int i = 0; i < nCount; i++)
  122. {
  123. if (pButtons[i] == 0)
  124. bSeparator = TRUE;
  125. else
  126. {
  127. XTPControlType controlType = xtpControlButton;
  128. XTPButtonStyle buttonStyle = xtpButtonAutomatic;
  129. CXTPControl* pControl = NULL;
  130. UINT nID = pButtons[i];
  131. XTP_COMMANDBARS_CREATECONTROL cs;
  132. if (pSite)
  133. {
  134. cs.nID = nID;
  135. cs.pControl = NULL;
  136. cs.bToolBar = TRUE;
  137. cs.pMenu = NULL;
  138. cs.nIndex = i;
  139. cs.strCaption = GetTitle();
  140. cs.controlType = controlType;
  141. cs.pCommandBar = this;
  142. cs.buttonStyle = buttonStyle;
  143. if (GetSite()->SendMessage(WM_XTP_BEFORECREATECONTROL, 0, (LPARAM)&cs) != 0)
  144. {
  145. pControl = cs.pControl;
  146. controlType = cs.controlType;
  147. buttonStyle = cs.buttonStyle;
  148. nID = cs.nID;
  149. }
  150. }
  151. if (pControl == NULL)
  152. {
  153. pControl = m_pControls->Add(controlType, nID);
  154. if (pControl)
  155. {
  156. pControl->SetStyle(buttonStyle);
  157. if (controlType == xtpControlPopup) pControl->SetIconId(nID);
  158. }
  159. }
  160. else m_pControls->Add(pControl, nID);
  161. if (!pControl)
  162. continue;
  163. if (bLoadIcons)
  164. {
  165. pImageManager->SetIcon(nID, nID);
  166. }
  167. if (bSeparator)
  168. {
  169. pControl->SetBeginGroup(TRUE);
  170. bSeparator = FALSE;
  171. }
  172. pControl->SetCategory(lpszItem);
  173. if (pSite)
  174. {
  175. cs.pControl = pControl;
  176. pSite->SendMessage(WM_XTP_AFTERCREATECONTROL, 0, (LPARAM)&cs);
  177. }
  178. }
  179. }
  180. if (nItem == 0)
  181. {
  182. SetCurSel(0);
  183. }
  184. UpdateTabs();
  185. m_pControls->CreateOriginalControls();
  186. return pItem;
  187. }
  188. void CXTPTabToolBar::UpdateTabs(CXTPTabManagerItem* pItem)
  189. {
  190. if (pItem == NULL)
  191. pItem = GetSelectedItem();
  192. if (!pItem)
  193. return;
  194. for (int i = 0; i < m_pControls->GetCount(); i++)
  195. {
  196. CXTPControl* pControl = m_pControls->GetAt(i);
  197. if (pControl->GetCategory() == pItem->GetCaption())
  198. {
  199. pControl->SetHideFlag(xtpHideRibbonTab, FALSE);
  200. }
  201. else
  202. {
  203. pControl->SetHideFlag(xtpHideRibbonTab, TRUE);
  204. }
  205. }
  206. DelayLayout();
  207. }
  208. void CXTPTabToolBar::SetSelectedItem(CXTPTabManagerItem* pItem)
  209. {
  210. if (m_pSelected != pItem)
  211. {
  212. UpdateTabs(pItem);
  213. GetCommandBars()->ClosePopups();
  214. CXTPTabManager::SetSelectedItem(pItem);
  215. }
  216. }
  217. BOOL CXTPTabToolBar::OnBeforeItemClick(CXTPTabManagerItem* pItem)
  218. {
  219. return CXTPTabManager::OnBeforeItemClick(pItem);
  220. }
  221. BEGIN_MESSAGE_MAP(CXTPTabToolBar, CXTPToolBar)
  222. //{{AFX_MSG_MAP(CXTPTabToolBar)
  223. ON_WM_LBUTTONDOWN()
  224. ON_WM_SYSCOLORCHANGE()
  225. ON_WM_MOUSEMOVE()
  226. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  227. //}}AFX_MSG_MAP
  228. END_MESSAGE_MAP()
  229. /////////////////////////////////////////////////////////////////////////////
  230. // CXTPTabToolBar message handlers
  231. void CXTPTabToolBar::DrawCommandBar(CDC* pDC, CRect rcClipBox)
  232. {
  233. CXTPToolBar::DrawCommandBar(pDC, rcClipBox);
  234. GetPaintManager()->DrawTabControl(this, pDC, m_rcTabControl);
  235. }
  236. void CXTPTabToolBar::RedrawControl(LPCRECT lpRect, BOOL bAnimate)
  237. {
  238. Redraw(lpRect, bAnimate);
  239. }
  240. void CXTPTabToolBar::Reposition()
  241. {
  242. if (!GetSafeHwnd())
  243. return;
  244. if (!IsCustomizeMode()) DelayLayout(); else OnRecalcLayout();
  245. }
  246. void CXTPTabToolBar::Reset(BOOL bShowWarningMessage)
  247. {
  248. CXTPToolBar::Reset(bShowWarningMessage);
  249. UpdateTabs();
  250. }
  251. CRect CXTPTabToolBar::GetBorders()
  252. {
  253. CRect rcBorder = CXTPToolBar::GetBorders();
  254. CRect rc(0, 0, 100, 100);
  255. GetPaintManager()->AdjustClientRect(this, rc);
  256. rcBorder.top += rc.top;
  257. if (CXTPToolBar::GetPosition() != xtpBarFloating)
  258. rcBorder.left += rc.left;
  259. return rcBorder;
  260. }
  261. CSize CXTPTabToolBar::CalcDockingLayout(int nLength, DWORD dwMode, int nWidth)
  262. {
  263. GetPaintManager()->SetPosition(dwMode & LM_VERTDOCK ?
  264. xtpTabPositionLeft : xtpTabPositionTop);
  265. CRect rc(0, 0, 100, 100);
  266. GetPaintManager()->AdjustClientRect(this, rc);
  267. CRect rcBorderOriginal = CXTPToolBar::GetBorders();
  268. int nExpandBorder = dwMode & LM_HORZDOCK ? rcBorderOriginal.right : rcBorderOriginal.bottom;
  269. CSize sz = CXTPToolBar::CalcDockingLayout(nLength, dwMode, nWidth);
  270. if (dwMode & LM_HORZ)
  271. sz.cx = max(m_nMinWidth, sz.cx);
  272. else
  273. sz.cy = max(m_nMinWidth, sz.cy);
  274. CXTPControl* pPopupExp = m_pControls->FindControl(XTP_ID_TOOLBAR_EXPAND);
  275. if (pPopupExp && ((pPopupExp->GetHideFlags() & xtpHideGeneric) == 0))
  276. {
  277. nExpandBorder += 11;
  278. CXTPCommandBar::GetPaintManager()->DrawSpecialControl(0, xtpButtonExpandToolbar, pPopupExp, this, FALSE, &sz);
  279. }
  280. if (dwMode & LM_COMMIT)
  281. {
  282. CClientDC dc(this);
  283. if (dwMode & LM_VERTDOCK)
  284. m_rcTabControl = CRect(rcBorderOriginal.left, rcBorderOriginal.top, rc.left, sz.cy - nExpandBorder);
  285. else
  286. m_rcTabControl = CRect(rcBorderOriginal.left, rcBorderOriginal.top, sz.cx - nExpandBorder, rc.top);
  287. GetPaintManager()->RepositionTabControl(this, &dc, m_rcTabControl);
  288. }
  289. return sz;
  290. }
  291. CSize CXTPTabToolBar::CalcDynamicLayout(int nLength, DWORD nMode)
  292. {
  293. GetPaintManager()->SetPosition(xtpTabPositionTop);
  294. CRect rc(0, 0, 100, 100);
  295. GetPaintManager()->AdjustClientRect(this, rc);
  296. ASSERT(!(nMode & LM_HORZDOCK || nMode & LM_VERTDOCK));
  297. CClientDC dc(this);
  298. CXTPFontDC font(&dc, CXTPToolBar::GetPaintManager()->GetCommandBarFont(this));
  299. int nTitleSize = CXTPToolBar::GetPaintManager()->DrawCommandBarGripper(&dc, this, FALSE).cy;
  300. CRect rcBorderOriginal(3, 3 + nTitleSize + 1, 3, 3);
  301. CRect rcBorder(rcBorderOriginal);
  302. rcBorder.top += rc.top;
  303. nLength = max(m_nMinWidth, nLength);
  304. CSize sz = CXTPToolBar::CalcDynamicLayout(nLength, nMode);
  305. sz.cx = max(m_nMinWidth, sz.cx);
  306. int nLeft = sz.cx - 3;
  307. CXTPControl* pHide = m_pControls->FindControl(XTP_ID_TOOLBAR_HIDE);;
  308. CXTPControl* pPopupExp = m_pControls->FindControl(XTP_ID_TOOLBAR_EXPAND);
  309. if (pHide)
  310. {
  311. pHide->SetHideFlags(xtpNoHide);
  312. pHide->SetRect(CRect(nLeft - nTitleSize, 3, nLeft, 3 + nTitleSize));
  313. nLeft -= nTitleSize;
  314. if (pPopupExp) pPopupExp->SetWrap(TRUE);
  315. }
  316. BOOL bShowExpandButtonAlways = TRUE;
  317. CXTPCommandBars* pCommandBars = GetCommandBars();
  318. if (pCommandBars) bShowExpandButtonAlways = pCommandBars->GetCommandBarsOptions()->bShowExpandButtonAlways;
  319. if (pPopupExp && nLeft - nTitleSize > 0 && bShowExpandButtonAlways)
  320. {
  321. pPopupExp->SetWrap(TRUE);
  322. pPopupExp->SetHideFlags(xtpNoHide);
  323. pPopupExp->SetRect(CRect(nLeft - nTitleSize, 3, nLeft, 3 + nTitleSize));
  324. }
  325. if (nMode & LM_COMMIT)
  326. {
  327. m_rcTabControl = CRect(rcBorderOriginal.left, rcBorderOriginal.top, sz.cx - rcBorderOriginal.right,
  328. rcBorderOriginal.top + rc.top);
  329. GetPaintManager()->RepositionTabControl(this, &dc, m_rcTabControl);
  330. }
  331. return sz;
  332. }
  333. void CXTPTabToolBar::OnCustomizeDrop(CXTPControl* pDataObject, DROPEFFECT& dropEffect, CPoint ptDrop, CPoint ptDrag)
  334. {
  335. CXTPToolBar::OnCustomizeDrop(pDataObject, dropEffect, ptDrop, ptDrag);
  336. CXTPCommandBars* pCommandBars = GetCommandBars();
  337. ASSERT(pCommandBars);
  338. if (pCommandBars && pCommandBars->GetDragControl() && GetSelectedItem())
  339. {
  340. pCommandBars->GetDragControl()->SetCategory(GetSelectedItem()->GetCaption());
  341. pCommandBars->GetDragControl()->SetHideFlag(xtpHideRibbonTab, FALSE);
  342. }
  343. OnRecalcLayout();
  344. }
  345. void CXTPTabToolBar::OnLButtonDown(UINT nFlags, CPoint point)
  346. {
  347. if (!PerformClick(m_hWnd, point))
  348. {
  349. CXTPToolBar::OnLButtonDown(nFlags, point);
  350. }
  351. }
  352. void CXTPTabToolBar::OnSysColorChange()
  353. {
  354. CXTPToolBar::OnSysColorChange();
  355. GetPaintManager()->RefreshMetrics();
  356. Reposition();
  357. }
  358. INT_PTR CXTPTabToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  359. {
  360. INT_PTR nHit = PerformToolHitTest(m_hWnd, point, pTI);
  361. if (nHit != -1)
  362. return nHit;
  363. return CXTPToolBar::OnToolHitTest(point, pTI);
  364. }
  365. void CXTPTabToolBar::OnMouseMove(UINT nFlags, CPoint point)
  366. {
  367. PerformMouseMove(m_hWnd, point);
  368. CXTPToolBar::OnMouseMove(nFlags, point);
  369. }
  370. void CXTPTabToolBar::OnMouseLeave()
  371. {
  372. PerformMouseMove(m_hWnd, CPoint(-1, -1));
  373. CXTPToolBar::OnMouseLeave();
  374. }
  375. BOOL CXTPTabToolBar::DrawIcon(CDC* pDC, CPoint pt, CXTPTabManagerItem* pItem, BOOL bDraw, CSize& szIcon) const
  376. {
  377. if (!pItem)
  378. return GetPaintManager()->m_bShowIcons;
  379. if (pItem->GetImageIndex() == -1 || GetPaintManager()->m_bShowIcons == FALSE)
  380. return FALSE;
  381. CXTPImageManagerIcon* pImage = GetImageManager()->GetImage(pItem->GetImageIndex(), szIcon.cx);
  382. if (!pImage)
  383. return FALSE;
  384. if (!bDraw)
  385. {
  386. return TRUE;
  387. }
  388. pItem->DrawImage(pDC, CRect(pt, szIcon), pImage);
  389. return TRUE;
  390. }