GuiSplitter.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "GuiLib.h"
  15. #include "guisplitter.h"
  16. #include "guiDrawlayer.h"
  17. // CGuiSplitter
  18. IMPLEMENT_DYNAMIC(CGuiSplitter, CWnd)
  19. CGuiSplitter::CGuiSplitter()
  20. {
  21. TypeAling=ALINGHORZ;
  22. m_nSizePix=4;
  23. mStyleSeparator=STYLE3D;
  24. bIniciaArrastre=FALSE;
  25. clrBg=GuiDrawLayer::GetRGBColorFace();
  26. mclrLeftTop=GuiDrawLayer::GetRGBColorBTNHigh();
  27. mclrBottomRight=GuiDrawLayer::GetRGBColorShadow();
  28. m_rectLeft=CRect(0,0,0,0);
  29. m_rectRight=CRect(0,0,0,0);
  30. }
  31. CGuiSplitter::~CGuiSplitter()
  32. {
  33. }
  34. BEGIN_MESSAGE_MAP(CGuiSplitter, CWnd)
  35. ON_WM_CREATE()
  36. ON_WM_PAINT()
  37. ON_WM_LBUTTONDOWN()
  38. ON_WM_LBUTTONUP()
  39. ON_WM_MOUSEMOVE()
  40. ON_WM_SIZE()
  41. ON_WM_SYSCOLORCHANGE()
  42. ON_WM_SETCURSOR()
  43. END_MESSAGE_MAP()
  44. void CGuiSplitter::SeTypeALing(TYPEALING typeAling)
  45. {
  46. TypeAling=typeAling;
  47. m_rcSpplitter=CRect(0,0,0,0);
  48. Invalidate();
  49. UpdateWindow();
  50. }
  51. // CGuiSplitter message handlers
  52. void CGuiSplitter::SetColor(COLORREF m_clrface)
  53. {
  54. clrBg=m_clrface;
  55. }
  56. int CGuiSplitter::OnCreate(LPCREATESTRUCT lpCreateStruct)
  57. {
  58. if (CWnd::OnCreate(lpCreateStruct) == -1)
  59. return -1;
  60. // TODO:  Add your specialized creation code here
  61. return 0;
  62. }
  63. BOOL CGuiSplitter::Create(CWnd* pParentWnd)
  64. {
  65. // TODO: Add your specialized code here and/or call the base class
  66. return CWnd::Create(NULL,NULL, WS_VISIBLE|WS_CHILD, CRect(0,0,0,0), pParentWnd, 0xffff);
  67. }
  68. void CGuiSplitter::OnPaint()
  69. {
  70. CPaintDC dc(this); // device context for painting
  71. CBrush cbr;
  72. CRect rcClient;
  73. GetClientRect(&rcClient);
  74. cbr.CreateSolidBrush(clrBg);
  75. CDC MemDC;
  76. CBitmap m_BitmapMemDC;
  77. MemDC.CreateCompatibleDC(&dc);
  78. m_BitmapMemDC.CreateCompatibleBitmap(&dc,
  79.   rcClient.Width(),rcClient.Height());
  80. CBitmap* m_bitmapOld=MemDC.SelectObject(&m_BitmapMemDC);
  81. MemDC.FillRect(&rcClient,&cbr);
  82. DrawSplitter(m_rcSpplitter,m_rectLeft,m_rectRight,&MemDC);
  83. dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,
  84.       rcClient.left,rcClient.top,SRCCOPY);
  85. MemDC.SelectObject(m_bitmapOld);
  86. m_BitmapMemDC.DeleteObject();
  87. MemDC.DeleteDC();
  88. }
  89. void CGuiSplitter::SetPixelWidht(int nSizePix)
  90. {
  91. m_nSizePix=nSizePix;
  92. }
  93. void  CGuiSplitter::AddLeftCtrl(CWnd* pWnd,long MinSize)
  94. {
  95. ASSERT_VALID(pWnd);
  96. pWndLeft=pWnd;
  97. }
  98. void  CGuiSplitter::AddRightCtrl(CWnd* pWnd,long MinSize)
  99. {
  100. ASSERT_VALID(pWnd);
  101.     pWndRight=pWnd;
  102. RecalLayout();
  103. }
  104. void CGuiSplitter::OnLButtonDown(UINT nFlags, CPoint point)
  105. {
  106. // TODO: Add your message handler code here and/or call default
  107. if (m_rcSpplitter.PtInRect(point) && !bIniciaArrastre)
  108. {
  109. bIniciaArrastre=TRUE;
  110. SetCapture ();
  111. InvalidateRect(m_rcSpplitter,TRUE);
  112. }
  113. else
  114. CWnd::OnLButtonDown(nFlags, point);
  115. }
  116. void CGuiSplitter::OnLButtonUp(UINT nFlags, CPoint point)
  117. {
  118. // TODO: Add your message handler code here and/or call default
  119. if (bIniciaArrastre==TRUE)
  120. {
  121. bIniciaArrastre=FALSE;
  122. RecalLayout();
  123. ReleaseCapture ();
  124. Invalidate();
  125. }
  126. CWnd::OnLButtonUp(nFlags, point);
  127. }
  128. void CGuiSplitter::OnMouseMove(UINT nFlags, CPoint point)
  129. {
  130. // TODO: Add your message handler code here and/or call default
  131. CRect m_rectCli;
  132. GetClientRect(m_rectCli);
  133.     if (bIniciaArrastre==TRUE)
  134.     {
  135. m_rcSpplitterOld=m_rcSpplitter;
  136. if (TypeAling==ALINGHORZ)
  137. {
  138. if (point.x < m_rectCli.left) 
  139. m_rcSpplitter.left=m_rectCli.left+m_nSizePix;
  140. else if (point.x >m_rectCli.right)
  141. m_rcSpplitter.left=m_rectCli.right-m_nSizePix;
  142. else 
  143. {
  144. m_rcSpplitter.left= point.x;
  145. m_rcSpplitter.right=point.x+m_nSizePix;
  146. }
  147. }
  148. else
  149. {
  150. if (point.y < m_rectCli.top) 
  151. m_rcSpplitter.top=m_rectCli.top+m_nSizePix;
  152. else if (point.y >m_rectCli.bottom)
  153. m_rcSpplitter.bottom=m_rectCli.top-m_nSizePix;
  154. else 
  155. {
  156. m_rcSpplitter.top=point.y;
  157. m_rcSpplitter.bottom=point.y+m_nSizePix;
  158. }
  159. }
  160. CClientDC dc(this);
  161. InvalidateRect(m_rcSpplitterOld);
  162. RecalLayout();
  163. }
  164. else
  165. CWnd::OnMouseMove(nFlags, point);
  166. }
  167. void CGuiSplitter::OnSize(UINT nType, int cx, int cy)
  168. {
  169. CWnd::OnSize(nType, cx, cy);
  170. RecalLayout();
  171. // TODO: Add your message handler code here
  172. }
  173. void  CGuiSplitter::RecalLayout()
  174. {
  175. CRect m_rectCli;
  176. CRect m_rctemp;
  177. if (pWndLeft== NULL || pWndRight==NULL) return ;
  178. GetClientRect(m_rectCli);
  179. if (m_rectCli.IsRectEmpty()) return;
  180. if (m_rcSpplitter.left < m_rectCli.left ) m_rcSpplitter.left=m_rectCli.left+1;
  181. if (m_rcSpplitter.right > m_rectCli.right) m_rcSpplitter.right=m_rectCli.right-1;
  182. if (m_rcSpplitter.bottom > m_rectCli.bottom) m_rcSpplitter.bottom=m_rectCli.bottom-1;
  183. if (m_rcSpplitter.top < m_rectCli.top) m_rcSpplitter.top=m_rectCli.top+1;
  184. if (m_rcSpplitter.IsRectEmpty() || m_rcSpplitter.bottom >=5000 )
  185. {
  186. m_rcSpplitter=m_rectCli;
  187. if (TypeAling==ALINGHORZ)
  188. {
  189. m_rcSpplitter.right=m_rectCli.Width()/2;
  190. m_rcSpplitter.left=m_rcSpplitter.right-m_nSizePix;
  191. }
  192. else
  193. {
  194. m_rcSpplitter.bottom=m_rectCli.Height()/2;
  195. m_rcSpplitter.top=m_rcSpplitter.bottom-m_nSizePix;
  196. }
  197. }
  198. if (TypeAling==ALINGHORZ)
  199. {
  200. m_rcSpplitter.right=m_rcSpplitter.left+m_nSizePix;
  201. m_rcSpplitter.bottom=m_rectCli.bottom;
  202. }
  203. else
  204. {
  205. m_rcSpplitter.bottom=m_rcSpplitter.top+m_nSizePix;
  206. m_rcSpplitter.right=m_rectCli.right;
  207. }
  208. m_rctemp=m_rectCli;
  209. if (TypeAling==ALINGHORZ)
  210. m_rctemp.right=m_rcSpplitter.left-1;
  211. else
  212. m_rctemp.bottom=m_rcSpplitter.top-1;
  213. m_rectLeft=m_rctemp;
  214. m_rctemp.DeflateRect(1,1);
  215. pWndLeft->MoveWindow(m_rctemp);
  216. m_rctemp=m_rectCli;
  217. if (TypeAling==ALINGHORZ)
  218. m_rctemp.left=m_rcSpplitter.right+1;
  219. else
  220. m_rctemp.top=m_rcSpplitter.bottom+1;
  221. m_rectRight=m_rctemp;
  222. m_rctemp.DeflateRect(1,1);
  223. pWndRight->MoveWindow(m_rctemp);
  224. }
  225. void CGuiSplitter::OnSysColorChange()
  226. {
  227. CWnd::OnSysColorChange();
  228. // TODO: Add your message handler code here
  229. }
  230. BOOL CGuiSplitter::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  231. {
  232. // TODO: Add your message handler code here and/or call default
  233. CPoint ptCurPos;
  234. GetCursorPos (&ptCurPos);
  235. ScreenToClient (&ptCurPos);
  236. if (m_rcSpplitter.PtInRect (ptCurPos))
  237. {
  238. if(TypeAling==ALINGHORZ)
  239. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_HSPLITBAR));
  240. else if(TypeAling==ALINGVERT)
  241. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_VSPLITBAR));
  242. return TRUE;
  243. }
  244. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  245. }
  246. void CGuiSplitter::SetStyleSeparator(STYLESEPARATOR StyleSeparator,COLORREF clrLeftTop,COLORREF clrBottomRight)
  247. {
  248. mStyleSeparator=StyleSeparator;
  249. mclrLeftTop=clrLeftTop;
  250. mclrBottomRight=clrBottomRight;
  251. }
  252. void CGuiSplitter::DrawSplitter(CRect rcSeparator,CRect rcLeft,CRect rcRight,CDC* pDC)
  253. {
  254. if (mStyleSeparator == STYLE3D)
  255. {
  256. pDC->Draw3dRect(rcLeft,mclrLeftTop,mclrBottomRight);
  257. pDC->Draw3dRect(rcRight,mclrLeftTop,mclrBottomRight);
  258. }
  259. }