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

对话框与窗口

开发平台:

Visual C++

  1. // GuiPanelWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "guilib.h"
  5. #include "GuiPanelWnd.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CGuiPanelWnd
  13. CGuiPanelWnd::CGuiPanelWnd()
  14. {
  15. m_pWin=NULL;  
  16. bHide=TRUE;      
  17. m_bActive=FALSE;  
  18. m_StyleDisplay=GUISTYLE_XP;
  19. nGapGripper=20;
  20. m_stateBtn=NORMAL;
  21. }
  22. CGuiPanelWnd::~CGuiPanelWnd()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CGuiPanelWnd, CWnd)
  26. //{{AFX_MSG_MAP(CGuiPanelWnd)
  27. ON_WM_CREATE()
  28. ON_WM_PAINT()
  29. ON_WM_NCPAINT()
  30. ON_WM_MOUSEMOVE()
  31. ON_WM_LBUTTONDOWN()
  32. ON_WM_LBUTTONUP()
  33. ON_WM_ERASEBKGND()
  34. ON_WM_SIZE()
  35. ON_WM_NCCALCSIZE()
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. void CGuiPanelWnd::DrawGripper(CDC* pDC, CRect* rc)
  39. {
  40. CRect gripper = rc;
  41. gripper.top =3;
  42. gripper.left+=4;
  43. gripper.right-=3;
  44. if(m_StyleDisplay == GUISTYLE_XP)
  45. gripper.bottom =gripper.top +nGapGripper-3;
  46. if(m_StyleDisplay == GUISTYLE_2003)
  47. gripper.bottom =gripper.top +nGapGripper+1;
  48. //si la ventana esta activa pintamos el caption o el area del titulo de color azul 
  49. if(!m_bActive)
  50. {
  51. if (m_StyleDisplay == GUISTYLE_2003)
  52. {
  53. CGradient M(CSize(gripper.Width(),gripper.Height()));
  54. M.PrepareVertical(pDC,m_StyleDisplay);
  55. M.Draw(pDC,4,0,0,0,gripper.Width(),gripper.Height(),SRCCOPY);
  56. }
  57. if (m_StyleDisplay == GUISTYLE_XP)
  58. {
  59. CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW));
  60. CPen* cpold=pDC->SelectObject(&cp);
  61. //linea superior
  62. pDC->MoveTo(gripper.left+1,gripper.top);
  63. pDC->LineTo(gripper.right,gripper.top);
  64. //linea izquierda
  65. pDC->MoveTo(gripper.left,gripper.top+1);
  66. pDC->LineTo(gripper.left,gripper.bottom);
  67. //linea inferior
  68. pDC->MoveTo(gripper.left+1,gripper.bottom);
  69. pDC->LineTo(gripper.right,gripper.bottom);
  70. //linea derecha
  71. pDC->MoveTo(gripper.right,gripper.top+1);
  72. pDC->LineTo(gripper.right,gripper.bottom);
  73. pDC->SelectObject(cpold);
  74. }
  75. }
  76. else
  77. {
  78. if (m_StyleDisplay == GUISTYLE_XP)
  79. {
  80. CBrush cb;
  81. cb.CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION));//GuiDrawLayer::GetRGBCaptionXP());
  82. pDC->FillRect(gripper,&cb);
  83. cb.DeleteObject();
  84. }
  85. if (m_StyleDisplay == GUISTYLE_2003)
  86. {
  87. CGradient M(CSize(gripper.Width(),gripper.Height()));
  88. M.PrepareCaption(pDC,m_StyleDisplay);
  89. M.Draw(pDC,4,0,0,0,gripper.Width(),gripper.Height(),SRCCOPY);
  90. }
  91. }
  92. if(m_StyleDisplay == GUISTYLE_2003) //no es XP
  93. {
  94. CRect rcWin=gripper;
  95. //rcWin.left= gripper.left;
  96. rcWin.top+=5;
  97. rcWin.left+=5;
  98. rcWin.right=rcWin.left+2;
  99. rcWin.bottom-=4;
  100. CRect rcBlack;
  101. for (int i=0; i < rcWin.Height(); i+=4)
  102. {
  103. CRect rcWindow;
  104. CBrush cb;
  105. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNHIGHLIGHT));
  106. rcWindow=rcWin;
  107. rcWindow.top=rcWin.top+i;
  108. rcWindow.bottom=rcWindow.top+2;
  109. pDC->FillRect(rcWindow,&cb);
  110. rcBlack=rcWindow;
  111. rcBlack.left-=1;
  112. rcBlack.top=(rcWin.top+i)-1;
  113. rcBlack.bottom=rcBlack.top+2;
  114. rcBlack.right=rcBlack.left+2;
  115. cb.DeleteObject();
  116. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Theme));
  117. pDC->FillRect(rcBlack,&cb);
  118. }
  119. }
  120. gripper.DeflateRect(1, 1);
  121. CString m_caption;
  122. GetWindowText(m_caption);
  123. CFont m_cfont;
  124. m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,_T("Verdana"));
  125. CFont* m_fontOld=pDC->SelectObject(&m_cfont);
  126. int nMode = pDC->SetBkMode(TRANSPARENT);
  127. CSize SizeCad=pDC->GetTextExtent(m_caption);
  128. CRect rCText=gripper;
  129. rCText.top=6;
  130. rCText.bottom =rCText.top+14;
  131. int cont=SizeCad.cx;
  132. while(cont > 1 && gripper.Width() > 0)
  133. {
  134. CSize coor=pDC->GetTextExtent(m_caption,m_caption.GetLength());
  135. if(coor.cx > gripper.Width()-10)
  136. {
  137. m_caption=m_caption.Left(m_caption.GetLength()-1);
  138. }
  139. else
  140. break;
  141. cont--;
  142. }
  143. if (gripper.Width() > 0 )
  144. if (!m_bActive)
  145. pDC->TextOut(rCText.left+8,rCText.top,m_caption);
  146. else
  147. {
  148. if (!GuiDrawLayer::m_Theme)
  149. pDC->SetTextColor(RGB(255,255,255));
  150. pDC->TextOut(rCText.left+8,rCText.top,m_caption);
  151. }
  152. //CRect gripper;
  153. //------------------------------------------------
  154. GetWindowRect( gripper );
  155. ScreenToClient( gripper );
  156. gripper.OffsetRect( -gripper.left, -gripper.top );
  157. gripper.left=gripper.right-20;
  158. gripper.right-=7;
  159. gripper.top+=6;
  160. gripper.bottom=gripper.top+13;
  161. m_rcCloseBtn=gripper;
  162. //m_rcCloseBtn.left-=4;
  163. //ClientToScreen(m_rcCloseBtn);
  164. m_CloseBtn.Paint(pDC,m_stateBtn,gripper,NULL_BRUSH);
  165. //------------------------------------------------
  166.   pDC->SetBkMode(nMode);
  167. pDC->SelectObject(m_fontOld);
  168. }
  169. void CGuiPanelWnd::AddWindow(CWnd* pWin)
  170. {
  171. // m_pParent= (CGuiControlBar*)pWin->GetParent();
  172. m_pWin=pWin;
  173. m_pWin->SetOwner(this);
  174. }
  175. void CGuiPanelWnd::DeletedWindow()
  176. {
  177. m_pWin->SetOwner(GetParent());
  178. }
  179. /////////////////////////////////////////////////////////////////////////////
  180. // CGuiPanelWnd message handlers
  181. int CGuiPanelWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  182. {
  183. if (CWnd::OnCreate(lpCreateStruct) == -1)
  184. return -1;
  185. // TODO: Add your specialized creation code here
  186. return 0;
  187. }
  188. void CGuiPanelWnd::OnPaint() 
  189. {
  190. CPaintDC dc(this); // device context for painting
  191. CRect rect;
  192. GetClientRect(rect);
  193. CBrush cbr;
  194. cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  195. dc.FillRect(rect,&cbr);
  196. }
  197. void CGuiPanelWnd::OnNcPaint() 
  198. {
  199. // TODO: Add your message handler code here
  200. // Tomo la misma rutina que se desarrolla para la clase 
  201. // CGuiToolBarWnd.
  202. CRect rcWindow;
  203. CRect rcClient;
  204. CWindowDC dc(this);
  205. CDC m_dc; //contexto de dispositivo en memoria
  206. CBitmap m_bitmap;
  207. //la idea es tomar el area de la ventana y area  cliente , luego debemos
  208. //igualar el area de coordenadas de ventana al cliente
  209. GetWindowRect(&rcWindow);
  210. GetClientRect(&rcClient);
  211. ScreenToClient(rcWindow);
  212.     rcClient.OffsetRect(-rcWindow.TopLeft());
  213.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  214.   
  215. m_dc.CreateCompatibleDC(&dc);
  216. m_bitmap.CreateCompatibleBitmap(&dc,rcWindow.Width(),rcWindow.Height());
  217. CBitmap *m_OldBitmap=m_dc.SelectObject(&m_bitmap);
  218. //aqui debe utilizarse la brocha que define GuiDrawLayer, si no hacemos la siguiente
  219. //linea usted vera un horrible color negro, a cambio del dibujo.
  220. CBrush cb;
  221. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  222. m_dc.FillRect(rcWindow, &cb);
  223. DrawGripper(&m_dc,&rcWindow);
  224. dc.IntersectClipRect(rcWindow);
  225.     dc.ExcludeClipRect(rcClient);//asi evitamos el parpadeo
  226. dc.BitBlt(rcWindow.left,rcWindow.top,rcWindow.Width(),rcWindow.Height(),&m_dc,0,0,SRCCOPY);
  227. m_dc.SelectObject(m_OldBitmap);
  228. m_bitmap.DeleteObject();
  229. m_dc.DeleteDC();
  230. }
  231. void CGuiPanelWnd::OnMouseMove(UINT nFlags, CPoint point) 
  232. {
  233. // TODO: Add your message handler code here and/or call default
  234. CWnd::OnMouseMove(nFlags, point);
  235. }
  236. void CGuiPanelWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  237. {
  238. // TODO: Add your message handler code here and/or call default
  239. CWnd::OnLButtonDown(nFlags, point);
  240. }
  241. void CGuiPanelWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  242. {
  243. // TODO: Add your message handler code here and/or call default
  244. CWnd::OnLButtonUp(nFlags, point);
  245. }
  246. BOOL CGuiPanelWnd::OnEraseBkgnd(CDC* pDC) 
  247. {
  248. // TODO: Add your message handler code here and/or call default
  249. return CWnd::OnEraseBkgnd(pDC);
  250. }
  251. //en esta funci髇 se calcula el area cliente que podra ser utilizado
  252. //por ventanas que deriven esta clase.
  253. void CGuiPanelWnd::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
  254. {
  255. // adjust non-client area for border space
  256. lpncsp->rgrc[0].left +=5;
  257. lpncsp->rgrc[0].top +=nGapGripper+3;
  258. if (IsVert())
  259. lpncsp->rgrc[0].right -=5;
  260. else
  261. lpncsp->rgrc[0].right -=3;
  262. lpncsp->rgrc[0].bottom -=3;
  263. }
  264. void CGuiPanelWnd::OnSize(UINT nType, int cx, int cy) 
  265. {
  266. CWnd::OnSize(nType, cx, cy);
  267. CRect rc;
  268. GetClientRect(rc);
  269. m_pWin->MoveWindow(rc,TRUE);
  270. // TODO: Add your message handler code here
  271. }
  272. BOOL CGuiPanelWnd::Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, UINT nAling) 
  273. {
  274. //gran parte del codigo se tomo como guia de clases MFC
  275. ASSERT_VALID(pParentWnd);   // must have a parent
  276. //en esta linea se verifica que la ventana debe disponer de un estilo fijo o dinamico
  277. //pero no los dos.el estilo Dynamic permite cambiar el tama駉 dela ventana mientras flota
  278. //pero no cuando esta docking, el estilo fijo determina las columnas en que se disponen los
  279. //componentes y permance asi.
  280. ASSERT(!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC)));
  281. // save the style
  282. //en dwStyle debe asignarse un tipo de alineaci髇 por ejemplo CBRS_TOP,etc de lo contrario
  283. //se generase un ASSERT al acambiar el Style
  284. dwStyle|=CBRS_TOP;
  285. DWORD m_dwStyle = (dwStyle & CBRS_ALL);//save the original style
  286. dwStyle &= ~CBRS_ALL;
  287. m_nLastAlingDocking=nAling;
  288. //en la siguiente instruccion el proposito que se busca es evitar el parpadeo 
  289. //cuando se refresca la ventana.
  290. //WS_CLIPCHILDREN : recorta el area de las ventanas hijas cuando se dibuja sobre 
  291. //  la ventana que la contiene.
  292. //WS_CLIPSIBLING : cuando se recibe el mensaje paint se recorta el area de las otras ventanas
  293. //    hijas superpuestas, que estan fuera de la region.
  294. dwStyle |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
  295. //con el estilo CS_DBLCLKS, lo que se busca es que al recibir un doble clic
  296. //la ventana reaccione,ojo el problema es que esto lo hace solo con el area cliente. 
  297. LPCTSTR lpszClassName=::AfxRegisterWndClass(CS_DBLCLKS,
  298. ::LoadCursor(NULL,IDC_ARROW),
  299. ::GetSysColorBrush(COLOR_BTNFACE),
  300. NULL);
  301. BOOL bResp= CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID,NULL);
  302. if (!bResp) return FALSE;
  303. return TRUE;
  304. }