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

对话框与窗口

开发平台:

Visual C++

  1. // XTPDialogBar.cpp : implementation of the CXTPDialogBar 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 "Resource.h"
  22. #include "XTPDialogBar.h"
  23. #include "XTPControls.h"
  24. #include "XTPControl.h"
  25. #include "XTPPaintManager.h"
  26. #include "XTPMouseManager.h"
  27. #include "XTPControlPopup.h"
  28. #include "XTPControlButton.h"
  29. #include "XTPPopupBar.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. IMPLEMENT_XTP_COMMANDBAR(CXTPDialogBar, CXTPToolBar)
  36. class CXTPDialogBar::CControlButtonHide: public CXTPControlButton
  37. {
  38. public:
  39. CControlButtonHide()
  40. {
  41. m_dwFlags = xtpFlagManualUpdate | xtpFlagSkipFocus | xtpFlagNoMovable;
  42. }
  43. void Draw(CDC* pDC);
  44. void SetBeginGroup(BOOL /*bBeginGroup*/)
  45. {
  46. }
  47. void OnExecute()
  48. {
  49. ASSERT(m_pParent);
  50. if (m_pParent) ((CXTPToolBar*)m_pParent)->SetVisible(FALSE);
  51. }
  52. };
  53. void CXTPDialogBar::CControlButtonHide::Draw(CDC* pDC)
  54. {
  55. CFont font;
  56. font.CreatePointFont(MulDiv(80, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
  57. CFont* pFont = pDC->SelectObject(&font);
  58. GetPaintManager()->DrawControlEntry(pDC, this);
  59. pDC->SetTextColor(GetPaintManager()->GetControlTextColor(this));
  60. pDC->SetBkMode(TRANSPARENT);
  61. pDC->DrawText(_T("r"), 1, m_rcControl, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  62. pDC->SelectObject(pFont);
  63. }
  64. class CXTPDialogBar::CControlCaptionPopup: public CXTPControlPopup
  65. {
  66. public:
  67. CControlCaptionPopup()
  68. {
  69. m_dwFlags = xtpFlagLeftPopup | xtpFlagManualUpdate | xtpFlagSkipFocus | xtpFlagNoMovable;
  70. m_bCaptionPopup = FALSE;
  71. }
  72. void Draw(CDC* pDC);
  73. void AdjustExcludeRect(CRect& rc, BOOL /*bVertical*/)
  74. {
  75. GetPaintManager()->AdjustExcludeRect(rc, this, FALSE);
  76. }
  77. BOOL OnSetPopup(BOOL bPopup)
  78. {
  79. if (m_bCaptionPopup)
  80. return CXTPControlPopup::OnSetPopup(bPopup);
  81. return TRUE;
  82. }
  83. public:
  84. BOOL m_bCaptionPopup;
  85. };
  86. void CXTPDialogBar::CControlCaptionPopup::Draw(CDC* pDC)
  87. {
  88. CXTPPaintManager* pPaintManager = GetPaintManager();
  89. CXTPFontDC font(pDC, pPaintManager->GetSmCaptionFont());
  90. CRect rcButton = GetRect();
  91. if (m_bCaptionPopup)
  92. {
  93. pPaintManager->DrawControlEntry(pDC, this);
  94. }
  95. pDC->SetTextColor(m_bCaptionPopup ? pPaintManager->GetControlTextColor(this) :
  96. GetXtremeColor(COLOR_BTNTEXT));
  97. CRect rcText(rcButton);
  98. rcText.DeflateRect(2, 0, m_bCaptionPopup ? 15 : 2, 0);
  99. pDC->DrawText(GetCaption(), rcText, DT_SINGLELINE | DT_VCENTER);
  100. COLORREF clrText = pDC->GetTextColor();
  101. if (m_bCaptionPopup)
  102. {
  103. CPoint pt = CPoint(rcButton.right - 9, rcButton.top + rcButton.Height()/2);
  104. pPaintManager->Triangle(pDC, CPoint(pt.x -4 , pt.y - 2), CPoint(pt.x + 4, pt.y - 2), CPoint (pt.x, pt.y + 2), clrText);
  105. }
  106. }
  107. class CXTPDialogBar::CCaptionPopupBar: public CXTPPopupBar
  108. {
  109. public:
  110. CCaptionPopupBar()
  111. {
  112. m_popupFlags = xtpPopupDown;
  113. }
  114. void UpdateFlags()
  115. {
  116. CXTPPopupBar::UpdateFlags();
  117. m_popupFlags = xtpPopupDown | xtpPopupLeft;
  118. m_ptPopup.x = (m_popupFlags & xtpPopupDown) ? m_rcExclude.left : m_rcExclude.right;
  119. m_ptPopup.y = (m_popupFlags & xtpPopupDown) ? m_rcExclude.bottom : m_rcExclude.top;
  120. }
  121. };
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CXTPDialogBar
  124. CXTPDialogBar::CXTPDialogBar()
  125. {
  126. m_rcBorders = CRect(3, 3, 3, 3);
  127. m_bResizable = TRUE;
  128. m_bCaptionVisible = TRUE;
  129. m_szDockingClient = m_szFloatingClient = CSize(200, 200);
  130. m_szMinTrackRect = CSize(50, 50);
  131. m_bCaptionPopup = TRUE;
  132. m_hwndChild = 0;
  133. m_pPopupBar = new CCaptionPopupBar();
  134. m_nCaptionHeight = 0;
  135. m_bCustomizable = FALSE;
  136. m_bActive = FALSE;
  137. EnableAutomation();
  138. }
  139. CXTPDialogBar::~CXTPDialogBar()
  140. {
  141. m_pPopupBar->InternalRelease();
  142. }
  143. BEGIN_MESSAGE_MAP(CXTPDialogBar, CXTPToolBar)
  144. //{{AFX_MSG_MAP(CXTPDialogBar)
  145. ON_WM_NCHITTEST_EX()
  146. ON_WM_SIZE()
  147. ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
  148. //}}AFX_MSG_MAP
  149. END_MESSAGE_MAP()
  150. /////////////////////////////////////////////////////////////////////////////
  151. // CXTPDialogBar message handlers
  152. CSize CXTPDialogBar::CalcDockingLayout(int nLength, DWORD dwMode, int /*nWidth*/)
  153. {
  154. return CalcSize(nLength, dwMode, m_szDockingClient);
  155. }
  156. CRect CXTPDialogBar::GetMargins()
  157. {
  158. CRect rcBorder = m_rcBorders;
  159. if (m_bCaptionVisible)
  160. {
  161. CClientDC dc(this);
  162. CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));
  163. CSize szGripper = GetPaintManager()->DrawCommandBarGripper(&dc, this, FALSE);
  164. int nTitleSize = szGripper.cy;
  165. rcBorder.top += nTitleSize;
  166. }
  167. return rcBorder;
  168. }
  169. CSize CXTPDialogBar::CalcSize(int nLength, DWORD dwMode, CSize szClient)
  170. {
  171. CRect rcBorder = m_rcBorders;
  172. CSize sizeResult = szClient;
  173. sizeResult.cx += rcBorder.left + rcBorder.right;
  174. sizeResult.cy += rcBorder.top + rcBorder.bottom;
  175. if (!m_bCaptionVisible)
  176. {
  177. m_nCaptionHeight = 0;
  178. if (dwMode & LM_STRETCH)
  179. {
  180. if (dwMode & LM_VERTDOCK)
  181. sizeResult.cy = max(nLength, sizeResult.cy);
  182. else
  183. sizeResult.cx = max(nLength, sizeResult.cx);
  184. }
  185. return sizeResult;
  186. }
  187. CClientDC dc(this);
  188. CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));
  189. CSize szGripper = GetPaintManager()->DrawCommandBarGripper(&dc, this, FALSE);
  190. int nTitleSize = szGripper.cy;
  191. m_nCaptionHeight = szGripper.cy + rcBorder.top;
  192. sizeResult.cy += nTitleSize;
  193. if (dwMode & LM_STRETCH)
  194. {
  195. if (dwMode & LM_VERTDOCK)
  196. sizeResult.cy = max(nLength, sizeResult.cy);
  197. else
  198. sizeResult.cx = max(nLength, sizeResult.cx);
  199. }
  200. if (dwMode & LM_HORZ)
  201. sizeResult.cx = min(nLength, sizeResult.cx);
  202. else
  203. sizeResult.cy = min(nLength, sizeResult.cy);
  204. int nRightBorder = sizeResult.cx - rcBorder.right;
  205. CXTPControl* pHide = m_pControls->FindControl(XTP_ID_TOOLBAR_HIDE);
  206. if (!pHide && IsCloseable())
  207. {
  208. pHide = (CXTPControlPopup*)m_pControls->Add(new CControlButtonHide(), XTP_ID_TOOLBAR_HIDE, _T(""), -1, TRUE);
  209. }
  210. if (pHide && !IsCloseable())
  211. {
  212. pHide->SetHideFlags(xtpHideGeneric);
  213. }
  214. else if (pHide)
  215. {
  216. pHide->SetRect(CRect(CPoint(nRightBorder - 16, m_rcBorders.top + nTitleSize/2 - 8), CSize(16, 16)));
  217. nRightBorder -= 16;
  218. }
  219. CControlCaptionPopup* pCaption = (CControlCaptionPopup*)m_pControls->FindControl(XTP_ID_DIALOGBAR_CAPTION);
  220. if (!pCaption)
  221. {
  222. pCaption = (CControlCaptionPopup*)m_pControls->Add(new CControlCaptionPopup(), XTP_ID_DIALOGBAR_CAPTION, _T(""), -1, TRUE);
  223. pCaption->SetCommandBar(m_pPopupBar);
  224. }
  225. pCaption->m_bCaptionPopup = m_bCaptionPopup && (m_pPopupBar->GetControlCount() != 0);
  226. int nCaptionHeight = 16;
  227. int nCaptionTop = m_rcBorders.top + nTitleSize/2 - nCaptionHeight / 2;
  228. pCaption->SetRect(CRect(m_rcBorders.left + szGripper.cx, nCaptionTop, nRightBorder, nCaptionTop + nCaptionHeight));
  229. pCaption->SetCaption(m_strCaption.IsEmpty() ? GetTitle() : m_strCaption);
  230. return sizeResult;
  231. }
  232. CSize CXTPDialogBar::CalcDynamicLayout(int /*nLength*/, DWORD dwMode)
  233. {
  234. return CalcSize(32000, dwMode, m_szFloatingClient);
  235. }
  236. LRESULT CXTPDialogBar::OnNcHitTest(CPoint point)
  237. {
  238. if (!m_bResizable)
  239. return CXTPCommandBar::OnNcHitTest(point);
  240. CRect rectWindow;
  241. GetWindowRect(&rectWindow);
  242. rectWindow.InflateRect(-3, -3);
  243. if (m_barPosition != xtpBarFloating)
  244. {
  245. if (m_barPosition == xtpBarBottom)
  246. {
  247. if (point.y <= rectWindow.top) return HTTOP;
  248. }
  249. else
  250. {
  251. if ((point.y >= rectWindow.bottom) && (((m_dwFlags & xtpFlagStretched) == 0) || !IsVerticalPosition(GetPosition()))) return HTBOTTOM;
  252. }
  253. if (m_barPosition == xtpBarRight)
  254. {
  255. if (point.x <= rectWindow.left) return HTLEFT;
  256. }
  257. else
  258. {
  259. if ((point.x >= rectWindow.right) && (((m_dwFlags & xtpFlagStretched) == 0) || IsVerticalPosition(GetPosition()))) return HTRIGHT;
  260. }
  261. }
  262. else
  263. {
  264. if ((point.y < rectWindow.top) && (point.x < rectWindow.left)) return HTTOPLEFT;
  265. if ((point.y < rectWindow.top) && (point.x >= rectWindow.right)) return HTTOPRIGHT;
  266. if ((point.y >= rectWindow.bottom) && (point.x < rectWindow.left)) return HTBOTTOMLEFT;
  267. if ((point.y >= rectWindow.bottom) && (point.x >= rectWindow.right)) return HTBOTTOMRIGHT;
  268. if (point.y < rectWindow.top) return HTTOP;
  269. if (point.y >= rectWindow.bottom) return HTBOTTOM;
  270. if (point.x < rectWindow.left) return HTLEFT;
  271. if (point.x >= rectWindow.right) return HTRIGHT;
  272. }
  273. return CXTPCommandBar::OnNcHitTest(point);
  274. }
  275. void CXTPDialogBar::OnResize(CRect rcWindow, int nHitTest)
  276. {
  277. CRect rcMargins = GetMargins();
  278. if (rcWindow.Width() < m_szMinTrackRect.cx || rcWindow.Height() < m_szMinTrackRect.cy)
  279. return;
  280. if (GetPosition() == xtpBarFloating)
  281. {
  282. m_szFloatingClient = CSize(rcWindow.Width() - rcMargins.left - rcMargins.right, rcWindow.Height() - rcMargins.top - rcMargins.bottom);
  283. CalcDynamicLayout(0, 0);
  284. MoveWindow(rcWindow);
  285. Redraw();
  286. }
  287. else
  288. {
  289. CSize szDockingClient = CSize(rcWindow.Width() - rcMargins.left - rcMargins.right, rcWindow.Height() - rcMargins.top - rcMargins.bottom);
  290. if (nHitTest == HTRIGHT || nHitTest == HTLEFT)
  291. m_szDockingClient.cx = szDockingClient.cx;
  292. else
  293. m_szDockingClient.cy = szDockingClient.cy;
  294. OnRecalcLayout();
  295. }
  296. }
  297. int CXTPDialogBar::OnMouseHitTest(CPoint pt)
  298. {
  299. CXTPWindowRect rc(this);
  300. rc.bottom = rc.top + m_nCaptionHeight;
  301. return rc.PtInRect(pt) ? HTCLIENT : HTERROR;
  302. }
  303. void CXTPDialogBar::MoveChildWindow(CRect rc)
  304. {
  305. if (m_hwndChild)
  306. {
  307. CRect rcMargins = GetMargins();
  308. CRect rcChild(rcMargins.left, rcMargins.top, rc.Width() - rcMargins.right, rc.Height() - rcMargins.bottom);
  309. ::SetWindowPos(m_hwndChild, 0, rcChild.left, rcChild.top, rcChild.Width(), rcChild.Height(), SWP_NOZORDER | SWP_NOACTIVATE);
  310. ::InvalidateRect(m_hwndChild, 0, FALSE);
  311. }
  312. }
  313. void CXTPDialogBar::OnSize(UINT nType, int cx, int cy)
  314. {
  315. CXTPToolBar::OnSize(nType, cx, cy);
  316. MoveChildWindow(CRect(0, 0, cx, cy));
  317. }
  318. void CXTPDialogBar::SetChild(CWnd* pChildWnd)
  319. {
  320. m_hwndChild = pChildWnd->m_hWnd;
  321. MoveChildWindow(CXTPClientRect(this));
  322. DelayLayout();
  323. }
  324. void CXTPDialogBar::SetCaption(LPCTSTR strCaption)
  325. {
  326. m_strCaption = strCaption;
  327. DelayLayout();
  328. }
  329. void CXTPDialogBar::SetCaptionPopup(int nMenuResourceID)
  330. {
  331. CMenu menu;
  332. VERIFY(menu.LoadMenu(nMenuResourceID));
  333. m_pPopupBar->LoadMenu(menu.GetSubMenu(0));
  334. }
  335. void CXTPDialogBar::SetSize(CSize sz)
  336. {
  337. m_szDockingClient = m_szFloatingClient = sz;
  338. DelayLayout();
  339. }
  340. CString CXTPDialogBar::GetCaption() const
  341. {
  342. return m_strCaption;
  343. }
  344. void CXTPDialogBar::SetCaptionVisible(BOOL bVisible)
  345. {
  346. m_bCaptionVisible = bVisible;
  347. DelayLayout();
  348. }
  349. LRESULT CXTPDialogBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
  350. {
  351. CWnd* pFocus = GetFocus();
  352. BOOL bActive = (pFocus->GetSafeHwnd() && (pFocus == this || IsChild(pFocus) ||
  353. (pFocus->GetOwner()->GetSafeHwnd() && IsChild(pFocus->GetOwner()))));
  354. if (bActive != m_bActive)
  355. {
  356. m_bActive = bActive;
  357. Redraw();
  358. }
  359. return CXTPToolBar::OnIdleUpdateCmdUI(wParam, lParam);
  360. }