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

对话框与窗口

开发平台:

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 "GuiMiniSplitter.h"
  24. #include "GuiDrawLayer.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CGuiMiniSplitter
  32. CGuiMiniSplitter::CGuiMiniSplitter()
  33. {
  34. bIniciaArrastre=FALSE;
  35. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  36. m_clrborder=GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style);
  37. m_ToolLeft=NULL;
  38. m_ToolRight=NULL;
  39. }
  40. CGuiMiniSplitter::~CGuiMiniSplitter()
  41. {
  42. }
  43. BEGIN_MESSAGE_MAP(CGuiMiniSplitter, CWnd)
  44. //{{AFX_MSG_MAP(CGuiMiniSplitter)
  45. ON_WM_SIZE()
  46. ON_WM_SYSCOLORCHANGE()
  47. ON_WM_PAINT()
  48. ON_WM_LBUTTONDOWN()
  49. ON_WM_LBUTTONUP()
  50. ON_WM_MOUSEMOVE()
  51. ON_WM_SETCURSOR()
  52. ON_WM_TIMER()
  53. ON_WM_ERASEBKGND()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CGuiMiniSplitter message handlers
  58. BOOL CGuiMiniSplitter::Create(CWnd* pParentWnd)
  59. {
  60. return CWnd::Create(0,0,
  61.  WS_CHILD|WS_VISIBLE,CRect(0,0,0,0), pParentWnd,0xffff);
  62. }
  63. void CGuiMiniSplitter::OnSize(UINT nType, int cx, int cy) 
  64. {
  65. CWnd::OnSize(nType, cx, cy);
  66. RecalLayout();
  67. // TODO: Add your message handler code here
  68. }
  69. void CGuiMiniSplitter::RecalLayout()
  70. {
  71. CRect m_rectCli;
  72. CRect m_rctemp;
  73. if (m_ToolLeft== NULL || m_ToolRight==NULL) return ;
  74. GetClientRect(m_rectCli);
  75. if (m_rectCli.IsRectEmpty()) return;
  76. if (m_rcSplitter.IsRectEmpty())
  77. {
  78. m_rcSplitter=m_rectCli;
  79. m_rcSplitter.right=m_rectCli.Width()/2;
  80. m_rcSplitter.left=m_rcSplitter.right-3;
  81. }
  82. m_rcSplitter.right=m_rcSplitter.left+3;
  83. m_rctemp=m_rectCli;
  84. m_rctemp.right=m_rcSplitter.left-1;
  85. m_ToolLeft->MoveWindow(m_rctemp);
  86. m_ToolLeft->UpdateWindow();
  87. m_rctemp=m_rectCli;
  88. m_rctemp.left=m_rcSplitter.right+1;
  89. m_ToolRight->MoveWindow(m_rctemp);
  90. m_ToolRight->UpdateWindow();
  91. }
  92. void CGuiMiniSplitter::OnSysColorChange() 
  93. {
  94. CWnd::OnSysColorChange();
  95. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  96. m_clrborder=GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style);
  97. }
  98. void CGuiMiniSplitter::OnPaint() 
  99. {
  100. CPaintDC dc(this);
  101. CBrush cbr;
  102. CRect rcClient;
  103. GetClientRect(&rcClient);
  104. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  105. cbr.CreateSolidBrush(m_clrface);
  106. CDC MemDC;
  107. CBitmap m_BitmapMemDC;
  108. MemDC.CreateCompatibleDC(&dc);
  109. m_BitmapMemDC.CreateCompatibleBitmap(&dc,
  110.   rcClient.Width(),rcClient.Height());
  111. CBitmap* m_bitmapOld=MemDC.SelectObject(&m_BitmapMemDC);
  112. MemDC.FillRect(&rcClient,&cbr);
  113. DrawSplitter(m_rcSplitter,&MemDC);
  114. dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,
  115.       rcClient.left,rcClient.top,SRCCOPY);
  116. MemDC.SelectObject(m_bitmapOld);
  117. m_BitmapMemDC.DeleteObject();
  118. MemDC.DeleteDC();
  119. cbr.DeleteObject();
  120. }
  121. void CGuiMiniSplitter::OnLButtonUp(UINT nFlags, CPoint point) 
  122. {
  123. if (bIniciaArrastre==TRUE)
  124. {
  125. bIniciaArrastre=FALSE;
  126. RecalLayout();
  127. ReleaseCapture ();
  128. Invalidate();
  129. }
  130. CWnd::OnLButtonUp(nFlags, point);
  131. }
  132. void CGuiMiniSplitter::OnLButtonDown(UINT nFlags, CPoint point) 
  133. {
  134. // TODO: Add your message handler code here and/or call default
  135. if (m_rcSplitter.PtInRect(point) && !bIniciaArrastre)
  136. {
  137. bIniciaArrastre=TRUE;
  138. SetCapture ();
  139. InvalidateRect(m_rcSplitter,TRUE);
  140. }
  141. else
  142. CWnd::OnLButtonDown(nFlags, point);
  143. }
  144. void CGuiMiniSplitter::OnMouseMove(UINT nFlags, CPoint point) 
  145. {
  146. // TODO: Add your message handler code here and/or call default
  147. CRect m_rectCli;
  148. GetClientRect(m_rectCli);
  149.     if (bIniciaArrastre==TRUE)
  150.     {
  151. m_rcSplitterOld=m_rcSplitter;
  152. if (point.x < m_rectCli.left+50) 
  153. m_rcSplitter.left=50;
  154. else if (point.x >m_rectCli.right-50)
  155. m_rcSplitter.left=m_rectCli.right-55;
  156. else 
  157. {
  158. m_rcSplitter.left= point.x;
  159. m_rcSplitter.right=point.x+3;
  160. }
  161. CClientDC dc(this);
  162. DrawSplitter(m_rcSplitter,&dc);
  163. InvalidateRect(m_rcSplitterOld);
  164. RecalLayout();
  165. }
  166. else
  167. CWnd::OnMouseMove(nFlags, point);
  168. }
  169. BOOL CGuiMiniSplitter::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  170. {
  171. // TODO: Add your message handler code here and/or call default
  172. CPoint ptCurPos;
  173. GetCursorPos (&ptCurPos);
  174. ScreenToClient (&ptCurPos);
  175. if (m_rcSplitter.PtInRect (ptCurPos))
  176. {
  177. SetCursor (LoadCursor(NULL, IDC_SIZEWE));
  178. return TRUE;
  179. }
  180. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  181. }
  182. void CGuiMiniSplitter::OnTimer(UINT nIDEvent) 
  183. {
  184. // TODO: Add your message handler code here and/or call default
  185. CWnd::OnTimer(nIDEvent);
  186. }
  187. BOOL CGuiMiniSplitter::OnEraseBkgnd(CDC* pDC) 
  188. {
  189. return TRUE;
  190. }
  191. void  CGuiMiniSplitter::SetColor(COLORREF m_clrFace,COLORREF m_clrBorder)
  192. {
  193. if (!GetSafeHwnd()) return;
  194. if (!HIWORD(m_ToolLeft) || !HIWORD(m_ToolRight))
  195. return;
  196. m_clrface=m_clrFace;
  197. m_clrborder=m_clrBorder;
  198. m_ToolLeft->SetColor(m_clrface);
  199. m_ToolRight->SetColor(m_clrface);
  200. }
  201. BOOL CGuiMiniSplitter::AddMiniToolLeft(CGuiMiniTool * m_Toolleft)
  202. {
  203. if (!m_Toolleft->Create(_T(""),WS_VISIBLE | WS_CHILD |SS_OWNERDRAW, 
  204. CRect(0,0,0,0), this))
  205. return FALSE;
  206. m_ToolLeft= m_Toolleft;
  207. return TRUE;
  208. }
  209. BOOL CGuiMiniSplitter::AddMiniToolRight(CGuiMiniTool * m_Toolright)
  210. {
  211. CRect m_rectCli;
  212. GetClientRect(m_rectCli);
  213. if (!m_Toolright->Create(_T(""),WS_VISIBLE | WS_CHILD |SS_OWNERDRAW, 
  214. CRect(0,0,0,0), this))
  215. return FALSE;
  216. m_ToolRight=m_Toolright;
  217. RecalLayout();
  218. return TRUE;
  219. }
  220. void  CGuiMiniSplitter::DrawSplitter(CRect rc,CDC* pDC)
  221. {
  222. //CClientDC dc(this);
  223. rc.top+=1;
  224. rc.bottom-=1;
  225. pDC->Draw3dRect(rc,m_clrborder,m_clrborder);
  226. }