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

对话框与窗口

开发平台:

Visual C++

  1. // XTPShortcutBarPane.cpp : implementation of the CXTPShortcutBarPane class.
  2. //
  3. // This file is a part of the XTREME SHORTCUTBAR 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/Resource.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPResourceManager.h"
  24. #include "XTPShortcutBarPane.h"
  25. #include "XTPShortcutBar.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CXTPShortcutBarPaneItem
  33. CXTPShortcutBarPaneItem::CXTPShortcutBarPaneItem(LPCTSTR lpszCaption, CWnd* pWnd, int nHeight)
  34. {
  35. m_strCaption = lpszCaption;
  36. m_pWndClient = pWnd;
  37. m_nHeight = nHeight;
  38. m_bShowCaption = TRUE;
  39. m_pPane = NULL;
  40. m_bExpandable = TRUE;
  41. m_bExpanded = TRUE;
  42. }
  43. void CXTPShortcutBarPaneItem::SetHeight(int nHeight)
  44. {
  45. m_nHeight = max(0, nHeight);
  46. }
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CXTPShortcutBarPane
  49. IMPLEMENT_DYNAMIC(CXTPShortcutBarPane, CWnd)
  50. CXTPShortcutBarPane::CXTPShortcutBarPane()
  51. {
  52. m_pShortcutBar = NULL;
  53. m_bShowCaption = TRUE;
  54. m_nMinClientHeight = 0;
  55. m_rcIndent.SetRect(0, 5, 0, 5);
  56. m_pHighlighted = NULL;
  57. m_hHandCursor = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
  58. if (m_hHandCursor == 0)
  59. m_hHandCursor = XTPResourceManager()->LoadCursor(XTP_IDC_HAND);
  60. }
  61. CXTPShortcutBarPane::~CXTPShortcutBarPane()
  62. {
  63. for (int i = 0; i < m_arrItems.GetSize(); i++)
  64. {
  65. delete m_arrItems[i];
  66. }
  67. }
  68. CXTPShortcutBarPaneItem* CXTPShortcutBarPane::AddItem(LPCTSTR lpszCaption, CWnd* pWnd, int nHeight)
  69. {
  70. CXTPShortcutBarPaneItem* pItem = new CXTPShortcutBarPaneItem(lpszCaption, pWnd, nHeight);
  71. pItem->m_pPane = this;
  72. m_arrItems.Add(pItem);
  73. return pItem;
  74. }
  75. BOOL CXTPShortcutBarPane::Create(LPCTSTR lpszCaption, CXTPShortcutBar* pParent)
  76. {
  77. m_pShortcutBar = pParent;
  78. m_strCaption = lpszCaption;
  79. if (!CWnd::Create(AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
  80. NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CXTPEmptyRect(), pParent, 0))
  81. {
  82. return FALSE;
  83. }
  84. return TRUE;
  85. }
  86. CXTPShortcutBarPaneItem* CXTPShortcutBarPane::GetItem(int nIndex) const
  87. {
  88. if (nIndex >= 0 && nIndex < m_arrItems.GetSize())
  89. return m_arrItems[nIndex];
  90. return NULL;
  91. }
  92. void CXTPShortcutBarPane::SetCaption(LPCTSTR lpszCaption)
  93. {
  94. m_strCaption = lpszCaption;
  95. if (m_hWnd)
  96. {
  97. Invalidate(FALSE);
  98. }
  99. }
  100. void CXTPShortcutBarPaneItem::SetCaption(LPCTSTR lpszCaption)
  101. {
  102. m_strCaption = lpszCaption;
  103. if (m_pPane && m_pPane->m_hWnd)
  104. {
  105. m_pPane->Invalidate(FALSE);
  106. }
  107. }
  108. CXTPShortcutBarPaneItem* CXTPShortcutBarPane::HitTest(CPoint point) const
  109. {
  110. for (int i = 0; i < m_arrItems.GetSize(); i++)
  111. {
  112. if (m_arrItems[i]->GetCaptionRect().PtInRect(point))
  113. return m_arrItems[i];
  114. }
  115. return NULL;
  116. }
  117. BEGIN_MESSAGE_MAP(CXTPShortcutBarPane, CWnd)
  118. //{{AFX_MSG_MAP(CXTPShortcutBarPane)
  119. ON_WM_SIZE()
  120. ON_WM_ERASEBKGND()
  121. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  122. ON_WM_PAINT()
  123. ON_WM_MOUSEMOVE()
  124. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  125. ON_WM_LBUTTONDOWN()
  126. ON_WM_SETCURSOR()
  127. //}}AFX_MSG_MAP
  128. END_MESSAGE_MAP()
  129. /////////////////////////////////////////////////////////////////////////////
  130. // CXTPShortcutBarPane message handlers
  131. void CXTPShortcutBarPane::OnMouseMove(UINT nFlags, CPoint point)
  132. {
  133. CXTPShortcutBarPaneItem* pItem = HitTest(point);
  134. if (pItem && !pItem->m_bExpandable)
  135. pItem = NULL;
  136. if (pItem != m_pHighlighted)
  137. {
  138. m_pHighlighted = pItem;
  139. Invalidate(FALSE);
  140. if (m_pHighlighted)
  141. {
  142. TRACKMOUSEEVENT tme =
  143. {
  144. sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd
  145. };
  146. _TrackMouseEvent(&tme);
  147. }
  148. }
  149. CWnd::OnMouseMove(nFlags, point);
  150. }
  151. void CXTPShortcutBarPane::OnMouseLeave()
  152. {
  153. if (m_pHighlighted)
  154. {
  155. m_pHighlighted = NULL;
  156. Invalidate(FALSE);
  157. }
  158. }
  159. void CXTPShortcutBarPane::OnLButtonDown(UINT nFlags, CPoint point)
  160. {
  161. if (m_pHighlighted && m_pHighlighted->IsExpandable())
  162. {
  163. SetCapture();
  164. BOOL bAccept = FALSE;
  165. CXTPShortcutBarPaneItem* pHighlighted = m_pHighlighted;
  166. while (::GetCapture() == m_hWnd)
  167. {
  168. MSG msg;
  169. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  170. if (msg.message == WM_LBUTTONUP)
  171. {
  172. bAccept = m_pHighlighted != NULL;
  173. break;
  174. }
  175. if (msg.message == WM_MOUSEMOVE)
  176. {
  177. point = CPoint(LOWORD(msg.lParam), HIWORD(msg.lParam));
  178. CXTPShortcutBarPaneItem* pItem = pHighlighted->GetCaptionRect().PtInRect(point) ? pHighlighted : NULL;
  179. if (pItem != m_pHighlighted)
  180. {
  181. m_pHighlighted = pItem;
  182. Invalidate(FALSE);
  183. }
  184. continue;
  185. }
  186. DispatchMessage (&msg);
  187. }
  188. ReleaseCapture();
  189. if (bAccept && m_pHighlighted)
  190. {
  191. m_pHighlighted->SetExpanded(!m_pHighlighted->IsExpanded());
  192. }
  193. return;
  194. }
  195. CWnd::OnLButtonDown(nFlags, point);
  196. }
  197. BOOL CXTPShortcutBarPane::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  198. {
  199. if (m_pHighlighted)
  200. {
  201. ::SetCursor(m_hHandCursor);
  202. return TRUE;
  203. }
  204. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  205. }
  206. void CXTPShortcutBarPane::RecalcLayout()
  207. {
  208. if (!m_hWnd)
  209. return;
  210. CXTPClientRect rc(this);
  211. CXTPShortcutBarPaintManager* pPaintManager = m_pShortcutBar->GetPaintManager();
  212. ASSERT(pPaintManager);
  213. if (!pPaintManager)
  214. return;
  215. int nPaneCaptionHeight = m_bShowCaption ? pPaintManager->DrawPaneCaption(NULL, this, FALSE) : 0;
  216. int nItemCaptionHeight = pPaintManager->DrawPaneItemCaption(NULL, NULL, FALSE);
  217. int nTop = nPaneCaptionHeight;
  218. for (int i = 0; i < m_arrItems.GetSize(); i++)
  219. {
  220. CXTPShortcutBarPaneItem* pItem = m_arrItems[i];
  221. int nClientTop = nTop + (pItem->m_bShowCaption ? nItemCaptionHeight : 0);
  222. pItem->m_rcCaption.SetRect(0, nTop, rc.right, nClientTop);
  223. if (pItem->IsExpanded())
  224. {
  225. CRect rcClient(0 + m_rcIndent.left, m_rcIndent.top + nClientTop, rc.right - m_rcIndent.right, m_rcIndent.top + nClientTop + pItem->m_nHeight);
  226. if (rcClient.bottom > rc.bottom) rcClient.bottom = rc.bottom;
  227. if (i == m_arrItems.GetSize() - 1) rcClient.bottom = rc.bottom;
  228. pItem->m_rcClient = rcClient;
  229. nTop = nClientTop + pItem->m_nHeight + m_rcIndent.top + m_rcIndent.bottom;
  230. if (pItem->m_pWndClient)
  231. {
  232. pItem->m_pWndClient->SetWindowPos(0, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(),
  233. SWP_NOZORDER | SWP_SHOWWINDOW);
  234. }
  235. }
  236. else
  237. {
  238. pItem->m_rcClient.SetRectEmpty();
  239. nTop = nClientTop;
  240. if (pItem->m_pWndClient)
  241. {
  242. pItem->m_pWndClient->SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_HIDEWINDOW);
  243. }
  244. }
  245. }
  246. Invalidate(FALSE);
  247. }
  248. void CXTPShortcutBarPane::OnSize(UINT nType, int cx, int cy)
  249. {
  250. CWnd::OnSize(nType, cx, cy);
  251. RecalcLayout();
  252. }
  253. BOOL CXTPShortcutBarPane::OnEraseBkgnd(CDC* /*pDC*/)
  254. {
  255. return TRUE;
  256. }
  257. void CXTPShortcutBarPane::OnPaint()
  258. {
  259. CPaintDC dcPaint(this); // device context for painting
  260. CXTPBufferDC dc(dcPaint);
  261. OnDraw(&dc);
  262. }
  263. LRESULT CXTPShortcutBarPane::OnPrintClient(WPARAM wParam, LPARAM /*lParam*/)
  264. {
  265. CDC* pDC = CDC::FromHandle((HDC)wParam);
  266. if (pDC)
  267. {
  268. OnDraw(pDC);
  269. }
  270. return TRUE;
  271. }
  272. void CXTPShortcutBarPane::OnDraw(CDC* pDC)
  273. {
  274. CXTPClientRect rc(this);
  275. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_WINDOW));
  276. CXTPShortcutBarPaintManager* pPaintManager = m_pShortcutBar->GetPaintManager();
  277. ASSERT(pPaintManager);
  278. if (!pPaintManager)
  279. return;
  280. if (m_bShowCaption)
  281. {
  282. pPaintManager->DrawPaneCaption(pDC, this, TRUE);
  283. }
  284. for (int i = 0; i < m_arrItems.GetSize(); i++)
  285. {
  286. CXTPShortcutBarPaneItem* pItem = m_arrItems[i];
  287. if (pItem->m_bShowCaption)
  288. {
  289. pPaintManager->DrawPaneItemCaption(pDC, pItem, TRUE);
  290. }
  291. }
  292. }