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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMiniToolBar.cpp : implementation of the CXTPMiniToolBar 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/XTPDrawHelpers.h"
  22. #include "XTPPaintManager.h"
  23. #include "XTPMouseManager.h"
  24. #include "XTPCommandBars.h"
  25. #include "XTPKeyboardManager.h"
  26. #include "XTPMiniToolBar.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. #ifndef LWA_ALPHA
  33. #define LWA_ALPHA               0x00000002
  34. #endif
  35. #ifndef WS_EX_LAYERED
  36. #define WS_EX_LAYERED           0x00080000
  37. #endif
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CXTPMiniToolBar
  40. IMPLEMENT_XTP_COMMANDBAR(CXTPMiniToolBar, CXTPPopupToolBar);
  41. CXTPMiniToolBar::CXTPMiniToolBar()
  42. {
  43. m_pfnSetLayeredWindowAttributes = NULL;
  44. m_pfnUpdateLayeredWindow = NULL;
  45. HMODULE hLib = GetModuleHandle(_T("USER32"));
  46. if (hLib)
  47. {
  48. m_pfnSetLayeredWindowAttributes = (PFNSETLAYEREDWINDOWATTRIBUTES) ::GetProcAddress(hLib, "SetLayeredWindowAttributes");
  49. m_pfnUpdateLayeredWindow = (LPFNUPDATELAYEREDWINDOW) GetProcAddress(hLib, "UpdateLayeredWindow");
  50. }
  51. m_bActivated = FALSE;
  52. m_bTracking = FALSE;
  53. m_nOpacity = 0;
  54. m_pContextMenu = FALSE;
  55. m_bTrackOnHover = FALSE;
  56. m_rcBorders = CRect(2, 2, 2, 2);
  57. m_nWrapMargin = 3;
  58. }
  59. CXTPMiniToolBar::~CXTPMiniToolBar()
  60. {
  61. }
  62. void CXTPMiniToolBar::UpdateOpacity()
  63. {
  64. CXTPWindowRect rc(this);
  65. CPoint pt;
  66. GetCursorPos(&pt);
  67. int x = pt.x < rc.left ? rc.left - pt.x : pt.x > rc.right ? pt.x - rc.right : 0;
  68. int y = pt.y < rc.top ? rc.top - pt.y : pt.y > rc.bottom ? pt.y - rc.bottom : 0;
  69. int nLen = max(x, y);
  70. int nOpacity = 0;
  71. if (m_nPopuped != -1 || m_pContextMenu || IsTrackingMode() || nLen == 0)
  72. {
  73. nLen = 0;
  74. nOpacity = 255;
  75. }
  76. else if (!m_bActivated)
  77. {
  78. if (nLen < 17) nOpacity = 17 + (16 - nLen) * 14;
  79. }
  80. else
  81. {
  82. if (nLen < 90) nOpacity = MulDiv(255, 90 - nLen, 90);
  83. }
  84. if ((m_nOpacity != nOpacity))
  85. {
  86. m_nOpacity = nOpacity;
  87. if (m_pfnSetLayeredWindowAttributes)
  88. {
  89. m_pfnSetLayeredWindowAttributes(m_hWnd, 0x00, (BYTE)nOpacity, LWA_ALPHA);
  90. }
  91. else
  92. {
  93. SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | (nOpacity > 20 ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
  94. }
  95. CXTPShadowManager* pShadowManager = GetPaintManager()->GetShadowManager();
  96. POSITION pos = pShadowManager->GetHeadPosition(this);
  97. while (pos)
  98. {
  99. CWnd* pShadow = pShadowManager->GetNext(pos);
  100. if (m_pfnUpdateLayeredWindow)
  101. {
  102. BLENDFUNCTION bf;
  103. bf.BlendOp = AC_SRC_OVER;
  104. bf.BlendFlags = 0;
  105. bf.SourceConstantAlpha = (BYTE)nOpacity;
  106. bf.AlphaFormat = 0x01;
  107. m_pfnUpdateLayeredWindow(pShadow->GetSafeHwnd(), (HDC)0, 0, 0, 0, 0, 0, &bf, 0x02);
  108. }
  109. else
  110. {
  111. pShadow->SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | (nOpacity > 20 ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
  112. }
  113. }
  114. }
  115. if (m_nOpacity == 255)
  116. {
  117. m_bActivated = TRUE;
  118. }
  119. if (nLen > (m_bActivated ? 180 : 110))
  120. {
  121. m_bTracking = FALSE;
  122. }
  123. }
  124. void CXTPMiniToolBar::Animate()
  125. {
  126. GetPaintManager()->SetCommandBarRegion(this);
  127. if (m_pfnSetLayeredWindowAttributes != 0)
  128. {
  129. ModifyStyleEx(0, WS_EX_LAYERED);
  130. }
  131. }
  132. BOOL CXTPMiniToolBar::TrackMiniBar(UINT nFlags, int x, int y)
  133. {
  134. CXTPMouseManager* pMouseManager = XTPMouseManager();
  135. m_bActivated = FALSE;
  136. m_bTracking = TRUE;
  137. m_popupFlags = xtpPopupUp;
  138. m_nOpacity = 0;
  139. CWnd* pWnd = GetSite();
  140. if (pWnd && pWnd->GetExStyle() & (WS_EX_LAYOUTRTL | WS_EX_RIGHT))
  141. nFlags |= TPM_RIGHTALIGN;
  142. m_bExecOnRButton = nFlags & TPM_RIGHTBUTTON;
  143. m_popupFlags = (nFlags & TPM_RIGHTALIGN) ? xtpPopupLeft | xtpPopupUp : xtpPopupUp;
  144. pMouseManager->SendTrackLost();
  145. ReleaseCapture();
  146. if (!Popup(x, y, CRect(0, 0, 0, 0)))
  147. {
  148. return FALSE;
  149. }
  150. InternalAddRef();
  151. SetTrackingMode(FALSE);
  152. UpdateOpacity();
  153. PumpMessage();
  154. DestroyWindow();
  155. InternalRelease();
  156. return TRUE;
  157. }
  158. BOOL CXTPMiniToolBar::TrackPopupMenu(CXTPPopupBar* pPopup, UINT nFlags, int x, int y)
  159. {
  160. ASSERT(pPopup);
  161. if (!pPopup)
  162. {
  163. return FALSE;
  164. }
  165. m_bActivated = TRUE;
  166. m_bTracking = TRUE;
  167. m_nOpacity = 0;
  168. m_popupFlags = xtpPopupUp;
  169. CWnd* pWnd = GetSite();
  170. if (pWnd && pWnd->GetExStyle() & (WS_EX_LAYOUTRTL | WS_EX_RIGHT))
  171. nFlags |= TPM_RIGHTALIGN;
  172. UINT nReturn = TRUE;
  173. pPopup->m_pReturnCmd = NULL;
  174. if (nFlags & TPM_RETURNCMD)
  175. {
  176. pPopup->m_pReturnCmd = &nReturn;
  177. nReturn = 0;
  178. }
  179. m_bExecOnRButton = nFlags & TPM_RIGHTBUTTON;
  180. pPopup->m_bIgnoreUpdateHandler = nFlags & TPM_NONOTIFY;
  181. pPopup->m_bExecOnRButton = nFlags & TPM_RIGHTBUTTON;
  182. if (nFlags & TPM_RIGHTALIGN)
  183. {
  184. SetPopupFlags(xtpPopupLeft | xtpPopupUp);
  185. pPopup->SetPopupFlags(xtpPopupLeft | xtpPopupDown);
  186. }
  187. else
  188. {
  189. SetPopupFlags(xtpPopupUp);
  190. pPopup->SetPopupFlags(xtpPopupDown);
  191. }
  192. CXTPMouseManager* pMouseManager = XTPMouseManager();
  193. pMouseManager->SendTrackLost();
  194. ReleaseCapture();
  195. pMouseManager->IgnoreLButtonUp();
  196. if (!Create())
  197. return FALSE;
  198. if (!pPopup->Create())
  199. return FALSE;
  200. int nPopupWidth = pPopup->GetWidth();
  201. int nMiniBarWidth = GetWidth();
  202. CSize szMiniBar = CalcDynamicLayout(0, 0);
  203. CSize szPopupBar = pPopup->CalcDynamicLayout(0, 0);
  204. CPoint ptPopup(x, y);
  205. CRect rc = pPopup->CalculatePopupRect(ptPopup, szPopupBar);
  206. int nWidth = max(szMiniBar.cx, szPopupBar.cx);
  207. int nTop = rc.top - 15;
  208. if (!Popup(x, nTop, CRect(0, 0, 0, 0)))
  209. {
  210. return FALSE;
  211. }
  212. m_pContextMenu = pPopup;
  213. UpdateOpacity();
  214. UpdateWindow();
  215. pPopup->SetWidth(nWidth);
  216. SetWidth(nWidth);
  217. if (!pPopup->Popup(x, y, CRect(0, 0, 0, 0)))
  218. {
  219. m_pContextMenu = NULL;
  220. return FALSE;
  221. }
  222. InternalAddRef();
  223. PumpMessage();
  224. SetWidth(nMiniBarWidth);
  225. pPopup->SetWidth(nPopupWidth);
  226. m_pContextMenu = NULL;
  227. DestroyWindow();
  228. InternalRelease();
  229. return nReturn;
  230. }
  231. BOOL CXTPMiniToolBar::OnHookKeyDown(UINT nChar, LPARAM lParam)
  232. {
  233. if (m_pContextMenu)
  234. return FALSE;
  235. return CXTPPopupToolBar::OnHookKeyDown(nChar, lParam);
  236. }
  237. BOOL CXTPMiniToolBar::SetTrackingMode(int bMode, BOOL bSelectFirst, BOOL bKeyboard)
  238. {
  239. return CXTPCommandBar::SetTrackingMode(bMode, bSelectFirst, bKeyboard);
  240. }
  241. BOOL CXTPMiniToolBar::CursorInWindow() const
  242. {
  243. CPoint pt;
  244. GetCursorPos(&pt);
  245. if (CXTPWindowRect(this).PtInRect(pt))
  246. return TRUE;
  247. CXTPCommandBar* pCommandBar = XTPMouseManager()->HitTest(pt);
  248. if (!pCommandBar)
  249. return FALSE;
  250. return pCommandBar->GetRootParent() == (CXTPCommandBar*)this;
  251. }
  252. int CXTPMiniToolBar::OnHookMessage(HWND hWnd, UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  253. {
  254. if (m_bTracking)
  255. {
  256. if (nMessage == WM_ENABLE || nMessage == WM_ACTIVATEAPP)
  257. {
  258. ShowWindow(SW_HIDE);
  259. m_bTracking = FALSE;
  260. }
  261. }
  262. return CXTPPopupToolBar::OnHookMessage(hWnd, nMessage, wParam, lParam, lResult);
  263. }
  264. void CXTPMiniToolBar::PumpMessage()
  265. {
  266. HWND hwndSite = GetSite()->m_hWnd;
  267. CWinThread* pThread = AfxGetThread();
  268. XTPHookManager()->SetHook(hwndSite, this);
  269. while (m_bTracking)
  270. {
  271. MSG msg;
  272. if (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
  273. {
  274. if (!m_bTracking)
  275. break;
  276. if (!m_pContextMenu)
  277. {
  278. if (msg.message == WM_MOUSEMOVE)
  279. {
  280. UpdateOpacity();
  281. }
  282. if ((msg.message == WM_KEYDOWN || msg.message == WM_CHAR
  283. || msg.message == WM_SYSKEYDOWN || msg.message == WM_MOUSEWHEEL) && !IsTrackingMode())
  284. {
  285. m_bTracking = FALSE;
  286. }
  287. if (msg.message == WM_CLOSE || msg.message == WM_SYSCOMMAND)
  288. {
  289. m_bTracking = FALSE;
  290. }
  291. if ((msg.message == WM_LBUTTONDOWN || msg.message == WM_RBUTTONDOWN || msg.message == WM_MBUTTONDOWN ||
  292. msg.message == WM_NCLBUTTONDOWN || msg.message == WM_NCRBUTTONDOWN) && !CursorInWindow())
  293. {
  294. m_bTracking = FALSE;
  295. }
  296. }
  297. else
  298. {
  299. if (msg.message == WM_LBUTTONDOWN || msg.message == WM_RBUTTONDOWN || msg.message == WM_MBUTTONDOWN ||
  300. msg.message == WM_NCLBUTTONDOWN || msg.message == WM_NCRBUTTONDOWN)
  301. {
  302. if (!CursorInWindow())
  303. {
  304. CPoint point;
  305. GetCursorPos(&point);
  306. if (XTPMouseManager()->HitTest(point) == 0)
  307. m_bTracking = FALSE;
  308. }
  309. else
  310. {
  311. m_pContextMenu->SetTrackingMode(FALSE);
  312. m_pContextMenu = NULL;
  313. SetTrackingMode(FALSE);
  314. }
  315. }
  316. }
  317. if (msg.message == WM_ACTIVATE || msg.message == WM_ACTIVATEAPP || msg.message == WM_CAPTURECHANGED)
  318. {
  319. m_bTracking = FALSE;
  320. }
  321. if (m_pContextMenu && !m_pContextMenu->IsTrackingMode())
  322. {
  323. ShowWindow(SW_HIDE);
  324. m_bTracking = FALSE;
  325. }
  326. if (!m_bTracking)
  327. break;
  328. if (!::GetMessage(&msg, NULL, 0, 0))
  329. break;
  330. if (m_pContextMenu && !m_pContextMenu->IsTrackingMode())
  331. {
  332. m_bTracking = FALSE;
  333. }
  334. if (!m_bTracking)
  335. {
  336. ::PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
  337. break;
  338. }
  339. if (msg.message != WM_KICKIDLE && !AfxGetThread()->PreTranslateMessage(&msg))
  340. {
  341. // process this message
  342. ::TranslateMessage(&msg);
  343. ::DispatchMessage(&msg);
  344. }
  345. pThread->OnIdle(-1);
  346. OnIdleUpdateCmdUI(TRUE, 0L);
  347. }
  348. else
  349. {
  350. WaitMessage();
  351. }
  352. }
  353. XTPHookManager()->RemoveHook(hwndSite, this);
  354. }
  355. CXTPMiniToolBar* CXTPMiniToolBar::CreateMiniToolBar(CXTPCommandBars* pCommandBars)
  356. {
  357. CXTPMiniToolBar* pMiniToolBar = new CXTPMiniToolBar();
  358. pMiniToolBar->SetCommandBars(pCommandBars);
  359. return pMiniToolBar;
  360. }
  361. INT_PTR CXTPMiniToolBar::OnToolHitTest(CPoint /*point*/, TOOLINFO* /*pTI*/) const
  362. {
  363. return -1; // No Tips.
  364. }
  365. BEGIN_MESSAGE_MAP(CXTPMiniToolBar, CXTPPopupToolBar)
  366. //{{AFX_MSG_MAP(CXTPMiniToolBar)
  367. //}}AFX_MSG_MAP
  368. END_MESSAGE_MAP()
  369. /////////////////////////////////////////////////////////////////////////////
  370. // CXTPMiniToolBar message handlers