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

对话框与窗口

开发平台:

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.  * -CodeJunkie *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiContainer.h"
  24. #include "GuiVisioFolder.h"
  25. #include "Guicontainer.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CGuiContainer
  33. CGuiContainer::CGuiContainer()
  34. {
  35. m_arrContainer.RemoveAll();
  36. m_nItems=0;
  37. m_nItems = -1;
  38. m_bUseWin=FALSE;
  39. m_bDrawBorder=TRUE;
  40. m_StyleDisplay=GUISTYLE_XP;
  41. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  42. }
  43. CGuiContainer::~CGuiContainer()
  44. {
  45. m_arrContainer.RemoveAll();
  46. }
  47. BEGIN_MESSAGE_MAP(CGuiContainer, CWnd)
  48. //{{AFX_MSG_MAP(CGuiContainer)
  49. ON_WM_CREATE()
  50. ON_WM_PAINT()
  51. ON_WM_SIZE()
  52. ON_WM_ERASEBKGND()
  53. ON_WM_SYSCOLORCHANGE()
  54. //}}AFX_MSG_MAP
  55. ON_WM_DESTROY()
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CGuiContainer message handlers
  59. int CGuiContainer::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  60. {
  61. if (CWnd::OnCreate(lpCreateStruct) == -1)
  62. return -1;
  63. return 0;
  64. }
  65. //THANKS to CodeJunkie
  66. BOOL CGuiContainer::OnCommand(WPARAM wParam, LPARAM lParam)
  67. {
  68. CWnd* pParent= GetParent();
  69. while (pParent)
  70. {
  71. pParent->PostMessage (WM_COMMAND,wParam, lParam);
  72. pParent= pParent->GetParent();
  73. }
  74. return TRUE;
  75. //********************************************************************************
  76. void CGuiContainer::OnPaint()  
  77. {
  78. CPaintDC dc(this); // device context for painting
  79. CBrush cbr;
  80. CRect m_rectDraw;
  81. GetClientRect(&m_rectDraw);
  82. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  83. cbr.CreateSolidBrush(m_clrface);
  84. dc.FillRect(&m_rectDraw,&cbr);
  85. if (m_enBorder == STYLE3D)
  86. dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorBTNHigh(),
  87. GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  88. if (m_enBorder == STYLEPRESS)
  89. {
  90. dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),
  91. GuiDrawLayer::GetRGBColorBTNHigh());
  92. }
  93. RecalLayout();
  94. cbr.DeleteObject();
  95. }
  96. BOOL CGuiContainer::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) 
  97. {
  98. // TODO: Add your specialized code here and/or call the base class
  99. pParent= pParentWnd;
  100. return CWnd::Create(NULL, _T(""), dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, rect, pParentWnd, nID);
  101. }
  102. //********************************************************************************
  103. void CGuiContainer::OnSysColorChange() 
  104. {
  105. CWnd::OnSysColorChange();
  106. m_clrface=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  107. for (int i=0; i < m_nItems;i++)
  108. {
  109. CComponents* m_cwnd=(CComponents*) m_arrContainer[i];
  110. if(m_cwnd->bMiniTool==TRUE)
  111. m_cwnd->m_guiMini->SetColor(m_clrface);
  112. }
  113. RecalLayout();
  114. }
  115. //********************************************************************************
  116. void CGuiContainer::OnSize(UINT nType, int cx, int cy) 
  117. {
  118. CWnd::OnSize(nType, cx, cy);
  119. RecalLayout();
  120. }
  121. //********************************************************************************
  122. BOOL CGuiContainer::OnEraseBkgnd(CDC* pDC) 
  123. {
  124. return TRUE;
  125. }
  126. void CGuiContainer::UsedAllWindow(BOOL bUseWindow)
  127. {
  128. m_bUseWin=bUseWindow;
  129. }
  130. //********************************************************************************
  131. /*void CGuiContainer::PreSubclassWindow() 
  132. {
  133. CWnd::PreSubclassWindow();
  134. RecalLayout();
  135. }
  136. */
  137. //********************************************************************************
  138. void  CGuiContainer::RecalLayout()
  139. {
  140. if (!GetSafeHwnd()) return;
  141. CRect rcClient;
  142. CClientDC dc(this);
  143. GetClientRect(rcClient);
  144. rcClient.DeflateRect(1,1);
  145. CRect rctemp=rcClient;
  146. int nTipo=0;
  147. CalcAutoSize(rcClient);
  148. for (int i=0; i < m_nItems;i++)
  149. {
  150. CComponents* m_cwnd=(CComponents*) m_arrContainer[i];
  151. if(m_cwnd->bMiniTool==TRUE || m_cwnd->bTypeSmall == TRUE)
  152. nTipo=24;
  153. else
  154. nTipo=m_nResultCWnd;
  155. rctemp.bottom=rctemp.top+nTipo;
  156. if (m_cwnd->bMiniTool==TRUE)
  157. m_cwnd->m_guiMini->MoveWindow(rctemp);
  158. else if (nTipo != 0)
  159. {
  160. if (m_bDrawBorder)
  161. dc.Draw3dRect(rctemp,GuiDrawLayer::GetRGBColorShadow(),
  162. GuiDrawLayer::GetRGBColorShadow());
  163. if (m_bUseWin==FALSE)
  164. rctemp.DeflateRect(2,2);
  165. m_cwnd->m_cwnd->MoveWindow(rctemp);
  166. if (m_bUseWin==FALSE)
  167. rctemp.InflateRect(2,2);
  168. }
  169. rctemp.top+=nTipo;
  170. }
  171. }
  172. //********************************************************************************
  173. void CGuiContainer::CalcAutoSize(CRect m_rc)
  174. {
  175. if (m_nItems == -1) return;
  176. m_nResultCWnd=0;
  177.     m_nResultTools=0; 
  178. int m_numCWnd=0;
  179. BOOL m_bExisteCWnd=FALSE;
  180. for (int i=0; i < m_nItems;i++)
  181. {
  182. if (((CComponents*) m_arrContainer [i])->bMiniTool==TRUE ||
  183. ((CComponents*) m_arrContainer [i])->bTypeSmall ==TRUE)
  184. m_nResultTools+=24;
  185. else
  186. {
  187. m_bExisteCWnd=TRUE;
  188. m_numCWnd++;
  189. }
  190. }
  191. if (m_bExisteCWnd)
  192. {
  193. if (m_nResultTools > m_rc.Height())  //el espacio no alcanza para los botones
  194. m_nResultCWnd=0;
  195. else
  196. {
  197. m_nResultCWnd=m_rc.Height()-m_nResultTools;
  198. m_nResultCWnd/=m_numCWnd;
  199. }
  200. }
  201. }
  202. //********************************************************************************
  203. BOOL CGuiContainer::AddComponen(CGuiMiniTool* m_miniTool)
  204. {
  205. if (!m_miniTool->Create(_T(""),WS_VISIBLE | WS_CHILD |SS_OWNERDRAW, 
  206. CRect(0,0,0,0), this))
  207. return FALSE;
  208. if (m_nItems==-1) m_nItems=0;
  209. m_arrContainer.SetAtGrow(m_nItems, new CComponents(m_miniTool));
  210. m_nItems++;
  211. RecalLayout();
  212. return TRUE;
  213. }
  214. //********************************************************************************
  215. void CGuiContainer::SetBorder(Borders m_enborder)
  216. {
  217. m_enBorder=m_enborder;
  218. }
  219. //********************************************************************************
  220. void  CGuiContainer::AddComponen(CWnd* m_pParent)
  221. {
  222. BOOL btype=FALSE; //only object small
  223. ASSERT_VALID(pParent);
  224. if (m_pParent->IsKindOf(RUNTIME_CLASS(CComboBox)))
  225. btype=TRUE;
  226. if (m_pParent->IsKindOf(RUNTIME_CLASS(CEdit)))
  227. btype=TRUE;
  228. if (m_pParent->IsKindOf(RUNTIME_CLASS(CGuiImageLinkButton)))
  229. btype=TRUE;
  230. if (m_pParent->IsKindOf(RUNTIME_CLASS(CGuiLabelButton)))
  231. btype=TRUE;
  232. else if (m_pParent->IsKindOf(RUNTIME_CLASS(CGuiToolButton)))
  233. btype=TRUE;
  234. if (m_nItems==-1) m_nItems=0;
  235. m_arrContainer.SetAtGrow(m_nItems, new CComponents(m_pParent,btype));
  236. m_nItems++;
  237. RecalLayout();
  238. }
  239. //********************************************************************************
  240. CWnd*  CGuiContainer::AddComponen(CRuntimeClass* m_rtcwnd,UINT nID,DWORD dwStyle)
  241. {
  242. CWnd* m_cwnd=NULL;
  243. BOOL btype=FALSE; //only object small
  244. if (m_rtcwnd->IsDerivedFrom(RUNTIME_CLASS(CComboBox)))
  245. {
  246.  m_cwnd = new CGuiComboBoxExt();
  247.  if (!((CGuiComboBoxExt*)m_cwnd)->Create(dwStyle|WS_CHILD|WS_VISIBLE, CRect(1,1,100,100), this, nID))
  248.  {
  249. m_cwnd=NULL;
  250. return NULL;
  251.  }
  252.  btype=TRUE;
  253.  goto crear;
  254. }
  255. else if ( m_rtcwnd->IsDerivedFrom(RUNTIME_CLASS(CListBox)))
  256. {
  257.  m_cwnd = new CListBox();
  258.  if (!((CListBox*)m_cwnd)->Create(dwStyle|WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, nID))
  259.  {
  260. m_cwnd=NULL;
  261. return NULL;
  262.  }
  263.  goto crear;
  264. }
  265. else if ( m_rtcwnd->IsDerivedFrom(RUNTIME_CLASS(CEdit)))
  266. {
  267.  m_cwnd = new CEdit();
  268.  if (!((CEdit*)m_cwnd)->Create(dwStyle|WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, nID))
  269.  { 
  270. m_cwnd=NULL;
  271. return NULL;
  272.  }
  273.  
  274.  btype=TRUE;
  275.  goto crear;
  276. }
  277. else if ( m_rtcwnd->IsDerivedFrom(RUNTIME_CLASS(CListCtrl)))
  278. {
  279.  m_cwnd = new CListCtrl();
  280.  if (!((CListCtrl*)m_cwnd)->Create(dwStyle|WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, nID))
  281.  {
  282. m_cwnd=NULL;
  283. return NULL;
  284.  }
  285.  
  286.  btype=FALSE;
  287.  goto crear;
  288. }
  289. else if ( m_rtcwnd->IsDerivedFrom(RUNTIME_CLASS(CGuiVisioFolder)))
  290. {
  291.  m_cwnd = new CGuiVisioFolder();
  292.  if (!((CGuiVisioFolder*)m_cwnd)->Create(dwStyle|WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, nID))
  293.  {
  294. m_cwnd=NULL;
  295. return NULL;
  296.  }
  297.  goto crear;
  298. }
  299. else
  300. return NULL;
  301. crear:
  302. if (m_nItems==-1) m_nItems=0;
  303. m_arrContainer.SetAtGrow(m_nItems, new CComponents(m_cwnd,btype));
  304. m_nItems++;
  305. RecalLayout();
  306. return m_cwnd;
  307. }
  308. //*************************************************************************
  309. CComponents::CComponents(CGuiMiniTool* m_GuiMini)
  310. {
  311. m_guiMini=m_GuiMini;
  312. bMiniTool=TRUE;
  313. }
  314. //*************************************************************************
  315. CComponents::CComponents(CWnd* m_wnd,BOOL bType)
  316. {
  317. ASSERT(::IsWindow(m_wnd->m_hWnd));
  318. m_cwnd=m_wnd;
  319. bMiniTool=FALSE;
  320. bTypeSmall=bType;
  321. }
  322. BOOL CGuiContainer::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  323. {
  324. // TODO: Add your specialized code here and/or call the base class
  325. CWnd* pParent= GetParent();
  326. if (pParent->GetSafeHwnd())
  327. pParent->SendMessage(WM_NOTIFY, wParam, lParam);
  328. return TRUE;
  329. }
  330. //thanks to  Ernesto Garcia
  331. void CGuiContainer::OnDestroy()
  332. {
  333. for( int i=0; i<m_nItems; i++ )
  334.     {
  335.     CComponents *pArr = (CComponents*)m_arrContainer.GetAt(i);
  336.     if( pArr )
  337.         delete pArr;
  338.     }
  339. CWnd::OnDestroy();
  340. // TODO: Add your message handler code here
  341. }