GuiSplitter.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:8k
源码类别:

对话框与窗口

开发平台:

Visual C++

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