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

对话框与窗口

开发平台:

Visual C++

  1. // CXTPReportDragDrop.cpp : implementation of the CXTPReportHeaderDropWnd class.
  2. //
  3. // This file is a part of the XTREME REPORTCONTROL 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 "XTPReportDefines.h"
  23. #include "XTPReportHeader.h"
  24. #include "XTPReportPaintManager.h"
  25. #include "XTPReportColumn.h"
  26. #include "XTPReportDragDrop.h"
  27. #include "XTPReportControl.h"
  28. #include "XTPReportColumn.h"
  29. #include "XTPReportColumns.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTPReportHeaderDragWnd
  37. CXTPReportHeaderDragWnd::CXTPReportHeaderDragWnd()
  38. {
  39. m_pHeader = NULL;
  40. m_pPaintManager = NULL;
  41. m_pColumn = NULL;
  42. }
  43. CXTPReportHeaderDragWnd::~CXTPReportHeaderDragWnd()
  44. {
  45. }
  46. BEGIN_MESSAGE_MAP(CXTPReportHeaderDragWnd, CWnd)
  47. //{{AFX_MSG_MAP(CXTPReportHeaderDragWnd)
  48. ON_WM_PAINT()
  49. ON_WM_ERASEBKGND()
  50. ON_WM_TIMER()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CXTPReportHeaderDragWnd message handlers
  55. BOOL CXTPReportHeaderDragWnd::Create(CRect rect, CXTPReportHeader* pHeader, CXTPReportPaintManager* pPaintManager, CXTPReportColumn* pColumn)
  56. {
  57. m_pHeader = pHeader;
  58. m_pPaintManager = pPaintManager;
  59. m_pColumn = pColumn;
  60. if (rect.Height() == 0)
  61. rect.bottom = rect.top + pPaintManager->GetHeaderHeight();
  62. DWORD dwStyle = WS_POPUP | WS_DISABLED;
  63. DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
  64. BOOL bCreated = CreateEx(dwExStyle, AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), NULL, dwStyle,
  65. rect.left, rect.top, rect.Width(), rect.Height(),
  66. NULL, NULL, NULL);
  67. if (bCreated && m_pHeader && m_pHeader->GetControl() &&
  68. m_pHeader->GetControl()->m_bHScrollBarVisible )
  69. {
  70. SetTimer(1, 100, NULL);
  71. }
  72. return bCreated;
  73. }
  74. void CXTPReportHeaderDragWnd::OnPaint()
  75. {
  76. CPaintDC dc(this);
  77. CXTPClientRect rc(this);
  78. CXTPBufferDC memDC(dc, rc);
  79. OnDraw(&memDC, rc);
  80. }
  81. BOOL CXTPReportHeaderDragWnd::OnEraseBkgnd(CDC* /*pDC*/)
  82. {
  83. return TRUE;
  84. }
  85. void CXTPReportHeaderDragWnd::OnDraw(CDC* pDC, CRect rcClient)
  86. {
  87. if (!m_pPaintManager)
  88. return;
  89. // draw background
  90. m_pPaintManager->FillHeaderControl(pDC, rcClient);
  91. // draw column header
  92. m_pPaintManager->DrawColumn(pDC, m_pColumn, m_pHeader, rcClient, TRUE);
  93. }
  94. void CXTPReportHeaderDragWnd::PostNcDestroy()
  95. {
  96. CWnd::PostNcDestroy();
  97. delete this;
  98. }
  99. void CXTPReportHeaderDragWnd::OnTimer(UINT_PTR nIDEvent)
  100. {
  101. UNREFERENCED_PARAMETER(nIDEvent);
  102. if (!m_pHeader || !m_pHeader->GetControl())
  103. {
  104. return;
  105. }
  106. CXTPReportControl* pControl = m_pHeader->GetControl();
  107. ASSERT(pControl->m_bHScrollBarVisible);
  108. CRect rcHeaderScreen = m_pHeader->m_rcHeader;
  109. pControl->ClientToScreen(&rcHeaderScreen);
  110. CRect rcControlScreen(0,0,0,0);
  111. CRect rcDragScreen(0,0,0,0);
  112. pControl->GetWindowRect(&rcControlScreen);
  113. GetWindowRect(&rcDragScreen);
  114. CPoint ptMouseScreen(0, 0);
  115. if (!GetCursorPos(&ptMouseScreen) ||
  116. ptMouseScreen.y < rcHeaderScreen.top || ptMouseScreen.y > rcHeaderScreen.bottom)
  117. {
  118. return;
  119. }
  120. BOOL bScrolled = FALSE;
  121. BOOL bLayoutRTL = pControl->GetExStyle() & WS_EX_LAYOUTRTL;
  122. int nDiffRight = bLayoutRTL ? rcControlScreen.left - rcDragScreen.left :
  123. rcDragScreen.right - rcControlScreen.right;
  124. if (nDiffRight > 0)
  125. {
  126. int nStep = max(min(7, nDiffRight/10), CXTPReportHeader::s_nMinAutoScrollStep);
  127. UINT uTimer = max(10, 100 - nDiffRight);
  128. SCROLLINFO scrollInfo;
  129. BOOL bRes = pControl->GetScrollInfo(SB_HORZ, &scrollInfo);
  130. if (bRes)
  131. {
  132. if (scrollInfo.nPos < scrollInfo.nMax)
  133. {
  134. pControl->SetLeftOffset(scrollInfo.nPos + nStep);
  135. SetTimer(1, uTimer, NULL);
  136. bScrolled = TRUE;
  137. }
  138. }
  139. }
  140. else
  141. {
  142. int nLeftBorderX = bLayoutRTL ? rcControlScreen.right : rcControlScreen.left;
  143. int nFreezCols = pControl->GetFreezeColumnsCount();
  144. if (nFreezCols && pControl->GetColumns())
  145. {
  146. CXTPReportColumn* pLastFCol = pControl->GetColumns()->GetVisibleAt(nFreezCols - 1);
  147. if (pLastFCol)
  148. {
  149. CRect rcLastFCol = pLastFCol->GetRect();
  150. pControl->ClientToScreen(&rcLastFCol);
  151. int nLastFCol_middleX = rcLastFCol.left + rcLastFCol.Width() / 2;
  152. if (rcDragScreen.left < rcLastFCol.right &&
  153. ptMouseScreen.x > nLastFCol_middleX )
  154. {
  155. nLeftBorderX = rcLastFCol.right;
  156. }
  157. }
  158. }
  159. int nDiffLeft = bLayoutRTL ? rcDragScreen.right - nLeftBorderX : nLeftBorderX - rcDragScreen.left;
  160. if (nDiffLeft > 0)
  161. {
  162. int nStep = max(min(7, nDiffLeft/10), CXTPReportHeader::s_nMinAutoScrollStep);
  163. UINT uTimer = max(10, 100 - nDiffLeft);
  164. SCROLLINFO scrollInfo;
  165. BOOL bRes = pControl->GetScrollInfo(SB_HORZ, &scrollInfo);
  166. if (bRes)
  167. {
  168. if (scrollInfo.nPos > scrollInfo.nMin)
  169. {
  170. pControl->SetLeftOffset(scrollInfo.nPos - nStep);
  171. SetTimer(1, uTimer, NULL);
  172. bScrolled = TRUE;
  173. }
  174. }
  175. }
  176. }
  177. //-------------------------------------------------------------------------
  178. if (bScrolled)
  179. {
  180. CPoint ptMouse = ptMouseScreen;
  181. pControl->ScreenToClient(&ptMouse);
  182. pControl->RedrawControl();
  183. pControl->UpdateWindow();
  184. m_pHeader->OnMouseMove(0, ptMouse);
  185. }
  186. }
  187. /////////////////////////////////////////////////////////////////////////////
  188. // CXTPReportHeaderDropWnd
  189. CXTPReportHeaderDropWnd::CXTPReportHeaderDropWnd(COLORREF crColor)
  190. : m_clr(crColor)
  191. {
  192. m_nHeight = 0;
  193. }
  194. CXTPReportHeaderDropWnd::~CXTPReportHeaderDropWnd()
  195. {
  196. }
  197. BEGIN_MESSAGE_MAP(CXTPReportHeaderDropWnd, CWnd)
  198. //{{AFX_MSG_MAP(CXTPReportHeaderDropWnd)
  199. ON_WM_ERASEBKGND()
  200. //}}AFX_MSG_MAP
  201. END_MESSAGE_MAP()
  202. /////////////////////////////////////////////////////////////////////////////
  203. // CXTPReportHeaderDropWnd message handlers
  204. BOOL CXTPReportHeaderDropWnd::Create(int nHeight)
  205. {
  206. m_nHeight = nHeight + 20;
  207. DWORD dwStyle = WS_POPUP | WS_DISABLED;
  208. DWORD dwExStyle = WS_EX_TOOLWINDOW ;
  209. BOOL bResult = CreateEx(dwExStyle, AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), NULL, dwStyle,
  210. 0, 0, 12, m_nHeight,
  211. NULL, NULL, NULL);
  212. CRgn rgn1, rgn2;
  213. POINT ptArrow[7];
  214. ptArrow[0].x = 8;   ptArrow[0].y = 0;
  215. ptArrow[1].x = 8;   ptArrow[1].y = 4;
  216. ptArrow[2].x = 11;  ptArrow[2].y = 4;
  217. ptArrow[3].x = 6;   ptArrow[3].y = 9;
  218. ptArrow[4].x = 1;   ptArrow[4].y = 4;
  219. ptArrow[5].x = 4;   ptArrow[5].y = 4;
  220. ptArrow[6].x = 4;   ptArrow[6].y = 0;
  221. rgn1.CreatePolygonRgn(ptArrow, 7, ALTERNATE);
  222. ptArrow[0].x = 4;   ptArrow[0].y = m_nHeight;
  223. ptArrow[1].x = 4;   ptArrow[1].y = m_nHeight-4;
  224. ptArrow[2].x = 0;   ptArrow[2].y = m_nHeight-4;
  225. ptArrow[3].x = 6;   ptArrow[3].y = m_nHeight-10;
  226. ptArrow[4].x = 12;  ptArrow[4].y = m_nHeight-4;
  227. ptArrow[5].x = 8;   ptArrow[5].y = m_nHeight-4;
  228. ptArrow[6].x = 8;   ptArrow[6].y = m_nHeight;
  229. rgn2.CreatePolygonRgn(ptArrow, 7, ALTERNATE);
  230. m_rgn.CreateRectRgn(0, 0, 12, nHeight);
  231. m_rgn.CombineRgn(&rgn1, &rgn2, RGN_OR);
  232. SetWindowRgn(m_rgn, FALSE);
  233. rgn1.DeleteObject();
  234. rgn2.DeleteObject();
  235. return bResult;
  236. }
  237. void CXTPReportHeaderDropWnd::PostNcDestroy()
  238. {
  239. m_rgn.DeleteObject();
  240. CWnd::PostNcDestroy();
  241. delete this;
  242. }
  243. BOOL CXTPReportHeaderDropWnd::OnEraseBkgnd(CDC* pDC)
  244. {
  245. pDC->FillSolidRect(0, 0, 12, m_nHeight, m_clr);
  246. return TRUE;
  247. }
  248. void CXTPReportHeaderDropWnd::SetWindowPos(int x, int y)
  249. {
  250. CWnd::SetWindowPos(&wndTop,
  251. x - 6, y - (m_nHeight / 2), 0, 0,
  252. SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);
  253. }