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

金融证券系统

开发平台:

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. // GuiControlBar.cpp : implementation file
  14. #include "stdafx.h"
  15. #include "GuiControlBar.h"
  16. #include "GuiDockContext.h"
  17. #include "guicontrolbar.h"
  18. #include "GuiDrawLayer.h"
  19. #include "resource.h"
  20. #include "..headerguicontrolbar.h"
  21. // CGuiControlBar
  22. IMPLEMENT_DYNAMIC(CGuiControlBar, CControlBar)
  23. CGuiControlBar::CGuiControlBar()
  24. {
  25. nGapGripper=20;
  26. m_bActive=FALSE;
  27. m_bOldActive=FALSE;
  28. /*Modified By SunZhenyu 2003/6/21
  29. m_sizeMinFloating=m_sizeVert=m_sizeHorz=CSize(200,100);
  30. m_sizeHorzt=CSize(200,100);
  31. m_sizeVertt=CSize(200,100);
  32. */
  33. m_sizeMinFloating=m_sizeVert=m_sizeHorz=CSize(210,400);
  34. m_sizeHorzt=CSize(210,400);
  35. m_sizeVertt=CSize(210,400);
  36. m_pos=0;
  37. m_Last=0;
  38. m_bTracking=FALSE;
  39. m_rcBorder=CRect(0,0,0,0);
  40. m_rcOldBorder=CRect(0,0,0,0);
  41. m_ptOld=CPoint(0,0);
  42. m_sizeMinV=CSize(28,28);
  43. m_sizeMinH=CSize(28,28);
  44. m_Initialize=FALSE;
  45. m_First=-1;
  46. m_bForcepaint=FALSE;
  47. m_stateBtn=NORMAL;
  48. m_clrFondo=GuiDrawLayer::GetRGBColorFace();
  49. m_bSupportMultiView=FALSE;
  50. }
  51. CGuiControlBar::~CGuiControlBar()
  52. {
  53. }
  54. BEGIN_MESSAGE_MAP(CGuiControlBar, CControlBar)
  55. ON_WM_CREATE()
  56. ON_WM_LBUTTONDOWN()
  57. ON_WM_LBUTTONUP()
  58. ON_WM_NCLBUTTONDOWN()
  59. ON_WM_NCLBUTTONUP()
  60. ON_WM_MOUSEMOVE()
  61. ON_WM_NCPAINT()
  62. ON_WM_NCCALCSIZE()
  63. ON_WM_WINDOWPOSCHANGED()
  64. ON_WM_PAINT()
  65. ON_WM_LBUTTONDBLCLK()
  66. ON_WM_NCLBUTTONDBLCLK()
  67. ON_WM_NCHITTEST()
  68. ON_WM_SETCURSOR()
  69. ON_WM_SIZE()
  70. ON_WM_NCMOUSEMOVE()
  71. ON_WM_TIMER()
  72. ON_COMMAND(WM_SHOWTITLE, OnShowTitle)
  73. ON_WM_SYSCOLORCHANGE()
  74. END_MESSAGE_MAP()
  75. // CGuiControlBar message handlers
  76. void CGuiControlBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)
  77. {
  78. CWnd* pFocus = GetFocus();
  79. m_bOldActive=(pFocus->GetSafeHwnd() && IsChild(pFocus));
  80. m_bForcepaint=TRUE;
  81. if (!m_bActive && m_bOldActive)
  82. OnActiveWindow();
  83. m_bForcepaint=FALSE;
  84. }
  85. void CGuiControlBar::OnSysColorChange( )
  86. {
  87. m_clrFondo=GuiDrawLayer::GetRGBColorFace();
  88. CControlBar::OnSysColorChange( );
  89. }
  90. BOOL CGuiControlBar::Create(LPCTSTR lpszWindowName, DWORD dwStyle,CWnd* pParentWnd, UINT nID)
  91. {
  92. // TODO: Add your specialized code here and/or call the base class
  93. //gran parte del codigo se tomo como guia de clases MFC
  94. ASSERT_VALID(pParentWnd);   // must have a parent
  95. //en esta linea se verifica que la ventana debe disponer de un estilo fijo o dinamico
  96. //pero no los dos.el estilo Dynamic permite cambiar el tama駉 dela ventana mientras flota
  97. //pero no cuando esta docking, el estilo fijo determina las columnas en que se disponen los
  98. //componentes y permance asi.
  99. ASSERT(!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC)));
  100. // save the style
  101. //en dwStyle debe asignarse un tipo de alineaci髇 por ejemplo CBRS_TOP,etc de lo contrario
  102. //se generase un ASSERT al acambiar el Style
  103. dwStyle|=CBRS_TOP;
  104. m_dwStyle = (dwStyle & CBRS_ALL);//save the original style
  105. dwStyle &= ~CBRS_ALL;
  106. //en la siguiente instruccion el proposito que se busca es evitar el parpadeo 
  107. //cuando se refresca la ventana.
  108. //WS_CLIPCHILDREN : recorta el area de las ventanas hijas cuando se dibuja sobre 
  109. //  la ventana que la contiene.
  110. //WS_CLIPSIBLING : cuando se recibe el mensaje paint se recorta el area de las otras ventanas
  111. //    hijas superpuestas, que estan fuera de la region.
  112. dwStyle |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
  113. //con el estilo CS_DBLCLKS, lo que se busca es que al recibir un doble clic
  114. //la ventana reaccione,ojo el problema es que esto lo hace solo con el area cliente. 
  115. LPCTSTR lpszClassName=::AfxRegisterWndClass(CS_DBLCLKS,
  116. ::LoadCursor(NULL,IDC_ARROW),
  117. ::GetSysColorBrush(COLOR_BTNFACE),
  118. NULL);
  119. //poque no se llama a CControlBar::Create, bueno, da igual llamar a cualquiera, CWnd o CControlBar
  120. //esto debido a que CControlbar se deriva de CWnd y porque ademas CControlBar no sobrecarga el 
  121. //metodo Create, nosotros si porque tenemos que particularizar, cosas.
  122. BOOL bResp= CWnd::Create(lpszClassName, lpszWindowName, dwStyle, CRect(0,0,0,0), pParentWnd, nID);
  123. if (!bResp) return FALSE;
  124. return TRUE;
  125. }
  126. int CGuiControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  127. {
  128. if (CControlBar::OnCreate(lpCreateStruct) == -1)
  129. return -1;
  130. // TODO:  Add your specialized creation code here
  131. //aqui es cuando llamamos a nuestra clase CGuiDockContext, de esta manera
  132. //sobrecargamos el clase original que para nuestros propositos no nos sirve.
  133. //porque ?, bueno porque me interesa que no se pegen las toolbar en el interior
  134. //de las ventanas.
  135. if (m_pDockContext==NULL)
  136. m_pDockContext=new CGuiDockContext(this);
  137. ASSERT(m_pDockContext);
  138. m_CloseBtn.SetData(6,"Close");
  139. m_CloseBtn.SetImageList(IDB_DOCKBAR,9,10,RGB(255,0,255));
  140. return 0;
  141. }
  142. void CGuiControlBar::OnShowTitle()
  143. {
  144. ActiveCaption();
  145. SendMessage(WM_NCPAINT);
  146. }
  147. //esta funcion calcula el tama駉 horizontal de la ventana,no importa si esta 
  148. //docking a izquierda o derecha o arriba o abajo.Debemos disponer de un espacio equitativo entre todas
  149. //ventanas que se encuentren docking ya sea en una fila o columna.
  150. CSize CGuiControlBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  151. {
  152. //la funcion original toma el ancho o alto dependiendo del sentido que nos 
  153. //indica bHorz.
  154. ASSERT_VALID(this);
  155. if (IsFloating())
  156. return m_sizeMinFloating;
  157. else
  158. {
  159. //si bStrerch es TRUE significa que esta ventana no se puede hacer
  160. //Docking
  161. if (bStretch) 
  162. {
  163. if (bHorz)
  164. return CSize(32767, m_sizeHorz.cy);
  165. else
  166. return CSize(m_sizeVert.cx, 32767);
  167. }
  168. }
  169. int Len=GetHiWid();
  170. int nWidth = GetWidthMax();
  171. int nMinSpace=0;//minimo espacio requerido con lo tama駉s normales
  172. int nMinimo=0;  //minimo espacio de los tama駉s minimos
  173. int nRealBars=0;
  174. int m_First=GetFirstPos();
  175. for (int nPos = m_First; nPos <= m_Last; nPos++)
  176. {
  177. CGuiControlBar* pBar = GetGuiControlBar(nPos,TRUE);
  178. if (pBar== NULL) continue;
  179. if (!pBar->IsVisible()) continue;
  180. if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  181. {
  182. CPoint pt(GetMessagePos());
  183. m_pDockSite->FloatControlBar(pBar,pt);
  184. continue;
  185. }
  186. if(IsVert())
  187. pBar->m_sizeVert.cx=nWidth;
  188. else
  189. pBar->m_sizeHorz.cy=nWidth; //todas se hacen con el mismo ancho
  190. nMinSpace+=IsVert() ? pBar->m_sizeVert.cy:pBar->m_sizeHorz.cx; //minimo espacio para alinear las barras
  191. nRealBars++; //cuantas barras realmente existen
  192. }
  193. //si el tama駉 de las barras en la fila es mayor que 
  194. //el espacio disponible, luego la solucion salomonica es 
  195. //repartir el espacio entre todas.
  196. if (nRealBars == 1 )
  197. {
  198. if (bHorz)
  199. return m_sizeHorz= CSize(Len,m_sizeHorz.cy);
  200. else
  201. return m_sizeVert=CSize(m_sizeVert.cx,Len);
  202. }
  203. int nDif=Len-nMinSpace;
  204. if (abs(nDif) !=0)
  205. {
  206. BOOL bGrow=FALSE;
  207. if (nDif > 0)
  208. bGrow=TRUE;
  209. nDif=abs(nDif);
  210. while(nDif > 0)
  211. {
  212. for (int nPos = m_First; nPos <= m_Last; nPos++)
  213. {
  214. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  215. if (pBar== NULL) continue;
  216. if(IsVert())
  217. {
  218. if(bGrow)
  219. pBar->m_sizeVert.cy+=1;
  220. else
  221. {
  222. if (pBar->m_sizeVert.cy-1 < pBar->m_sizeMinV.cy)
  223. continue;
  224. pBar->m_sizeVert.cy-=1;
  225. }
  226. }
  227. else
  228. {
  229. if(bGrow)
  230. pBar->m_sizeHorz.cx+=1;
  231. else
  232. {
  233. if (pBar->m_sizeHorz.cx-1 < pBar->m_sizeMinH.cx)
  234. continue;
  235. pBar->m_sizeHorz.cx-=1;
  236. }
  237. }
  238. nDif--;
  239. if(nDif==0) break;
  240. }
  241. }
  242. }
  243.    //--reubicar las ventanas, sin esta rutina nada funciona
  244.   RecalWindowPos();
  245.  
  246. if (IsHorz())
  247. return  m_sizeHorz;
  248. else
  249. return  m_sizeVert;
  250. }
  251. //esta rutina dispone de la posici髇 en el Dockbar de la pila de  ventanas 
  252. void CGuiControlBar::RecalWindowPos()
  253. {
  254. int m_First=GetFirstPos();
  255. int m_Last=GetLastPos();
  256. int m_This=m_pDockBar->FindBar(this);
  257. CRect rcWin=GetDockRect();
  258. int m_VertPos=0;
  259. for(int i=m_First; i<= m_Last; i++)
  260. {
  261. CGuiControlBar* pBar = GetGuiControlBar(i);
  262. if (pBar == NULL) continue;
  263. CRect rcBar;
  264. pBar->GetWindowRect(rcBar);
  265. rcBar.OffsetRect(-rcWin.TopLeft());
  266. if (IsVert())
  267. {
  268.    if (i==m_First) 
  269. rcBar.top=-2;
  270.  else
  271.   rcBar.top=m_VertPos;
  272. }
  273. else
  274. {
  275. if (i==m_First) 
  276. rcBar.left=-2;
  277. else
  278.   rcBar.left=m_VertPos;
  279. }
  280. pBar->MoveWindow(rcBar);
  281. m_VertPos+=IsVert()? rcBar.Height():rcBar.Width();
  282. }
  283. m_pDockSite->RecalcLayout();
  284. }
  285. CRect CGuiControlBar::GetDockRect()
  286. {
  287. CRect rcWin;
  288. if (IsVert())
  289. if (IsLeft())
  290. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  291. else
  292. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetWindowRect(rcWin);
  293. else
  294. if(IsBottom())
  295. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcWin);
  296. else
  297. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  298. return rcWin;
  299. }
  300. int CGuiControlBar::GetWidthMax()
  301. {
  302. m_pos=m_pDockBar->FindBar(this);
  303. m_Last=GetLastPos();
  304. int nWidth=0;
  305. for (int nPos = GetFirstPos(); nPos <= m_Last; nPos++)
  306. {
  307. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  308. if (pBar== NULL) continue;
  309. nWidth=max(nWidth,IsVert() ? pBar->m_sizeVert.cx:pBar->m_sizeHorz.cy);
  310. }
  311. return nWidth;
  312. }
  313. CGuiControlBar* CGuiControlBar::GetGuiControlBar(int nPos,BOOL bAll) const
  314. {
  315. CGuiControlBar* pResult = (CGuiControlBar*)m_pDockBar->m_arrBars[nPos];
  316. if (bAll==FALSE)
  317. {
  318. if (HIWORD(pResult) == NULL) return NULL;
  319. else if (!pResult->IsVisible()) return NULL;
  320. else if (!pResult->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) return NULL;
  321. }
  322. else
  323. {
  324. if (HIWORD(pResult) == NULL)
  325. return NULL;
  326. }
  327. return pResult;
  328. }
  329. //En esta funci髇 se calcula el tama駉 de la ventana cuando esta flotando
  330. //y gestionar cuando el mouse es presionado en las esquinas.
  331. //#define HTTOPLEFT           13
  332. //#define HTTOPRIGHT          14
  333. //#define HTBOTTOMLEFT        16
  334. //#define HTBOTTOMRIGHT       17
  335. CSize CGuiControlBar::CalcDynamicLayout(int nLength, DWORD nMode)
  336. {
  337. m_pDockSite->RecalcLayout();
  338. if (IsFloating())
  339. {
  340. // Enable diagonal arrow cursor for resizing
  341. //m_sizeVert=m_sizeHorz=CSize(200,200);
  342. GetParent()->GetParent()->ModifyStyle(MFS_4THICKFRAME|WS_CAPTION,0);
  343. if (nMode & (LM_HORZDOCK | LM_VERTDOCK)) 
  344. {
  345. m_pDockSite->DelayRecalcLayout();
  346. //obligar a reposicionar  la ventana, de lo contrario cuando vuelva de un doble click
  347. //desde la ventana CMiniFrameWnd queda sin area cliente
  348. SetWindowPos(NULL, 0, 0, 0, 0,
  349. SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
  350. SWP_NOACTIVATE | SWP_FRAMECHANGED|SWP_NOREDRAW);
  351.   return CControlBar::CalcDynamicLayout(nLength, nMode);
  352. }
  353. if (nMode & LM_MRUWIDTH)
  354.         return  m_sizeMinFloating;
  355.     if (nMode & LM_COMMIT)
  356.         return  m_sizeMinFloating ;
  357.     
  358. if (IsFloating())
  359. {
  360. CRect rcWin;
  361. POINT cpt;
  362. GetCursorPos(&cpt);
  363. GetParent()->GetParent()->GetWindowRect(&rcWin);
  364. int nXOffset=0;int nYOffset=0;
  365. switch (m_pDockContext->m_nHitTest)
  366. {
  367. //------------------------------------------------------------------
  368. case HTLEFT:
  369. m_pDockContext->m_rectFrameDragHorz= rcWin;
  370. m_pDockContext->m_rectFrameDragHorz.left = cpt.x;
  371. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4 ;
  372. m_sizeMinFloating.cy = max((rcWin.bottom -rcWin.top)-nGapGripper-5,32)+2 ;
  373. return m_sizeMinFloating;
  374. break;
  375. case HTTOP:
  376. m_pDockContext->m_rectFrameDragHorz=rcWin;
  377. m_pDockContext->m_rectFrameDragHorz.top = cpt.y;
  378. m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
  379. m_sizeMinFloating.cy = max((rcWin.bottom -nGapGripper-cpt.y-3),32) ;
  380. return m_sizeMinFloating;
  381. break;
  382. case HTRIGHT:
  383. m_pDockContext->m_rectFrameDragHorz=rcWin;
  384. m_pDockContext->m_rectFrameDragHorz.right = cpt.x;
  385. m_sizeMinFloating.cy = max(rcWin.bottom -rcWin.top-nGapGripper-3,32) ;
  386. m_sizeMinFloating.cx = max(cpt.x-rcWin.left-4,32);
  387. return m_sizeMinFloating;
  388. break;
  389. case HTBOTTOM:
  390. m_pDockContext->m_rectFrameDragHorz=rcWin;
  391. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper-3,32) ;
  392. m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
  393. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-4;
  394. return m_sizeMinFloating;
  395. break;
  396. case HTTOPLEFT:
  397. //---------------------------------------------------------
  398. //En este caso crece la ventana a izquierda y hacia arriba
  399. //izquierda incrementa cx y top incrementa cy
  400. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-3 ;
  401. m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
  402. m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
  403. m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
  404. return m_sizeMinFloating;
  405. break;
  406. case HTTOPRIGHT:
  407. m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32)-4 ;
  408. m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
  409. m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
  410. m_pDockContext->m_rectFrameDragHorz.right = cpt.x-2;
  411. return m_sizeMinFloating;
  412. break;
  413. case HTBOTTOMLEFT:
  414. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4;
  415. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32)-2 ;
  416. m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
  417. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-1;
  418. m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
  419. return m_sizeMinFloating;
  420. break;
  421. case HTBOTTOMRIGHT:
  422. m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32);
  423. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32) ;
  424. m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
  425. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y+1;
  426. m_pDockContext->m_rectFrameDragHorz.right = cpt.x+2;
  427. return m_sizeMinFloating;
  428. break;
  429. }
  430. }
  431. if(nMode & LM_LENGTHY)
  432.  m_sizeMinFloating.cy = max(nLength,32);
  433. else
  434.      m_sizeMinFloating.cx = max(nLength,32);
  435. return m_sizeMinFloating;
  436. }
  437. void CGuiControlBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  438. {
  439. // TODO: Add your message handler code here and/or call default
  440. if(m_pDockBar != NULL)
  441. m_pDockContext->ToggleDocking();
  442. else
  443. CWnd::OnLButtonDblClk(nFlags, point);
  444. }
  445. void CGuiControlBar::OnLButtonDown(UINT nFlags, CPoint point)
  446. {
  447. // TODO: Add your message handler code here and/or call default
  448. CControlBar::OnLButtonDown(nFlags, point);
  449. }
  450. void CGuiControlBar::OnMouseMove( UINT nHitTest, CPoint point)
  451. {
  452. if(m_bTracking)
  453. {
  454. if (GetCapture() != this)
  455. {
  456. //StopTracking(FALSE);
  457. m_bTracking=FALSE;
  458. }
  459. OnInvertTracker(m_rcBorder);
  460. //nuevos tama駉s de la ventana
  461. if (IsVert())
  462. {
  463. if (m_SideMove==HTLEFT || m_SideMove==HTRIGHT)
  464. {
  465. m_rcBorder.left=point.x;
  466. m_rcBorder.right=m_rcBorder.left+4;
  467. }
  468. else
  469. {
  470. m_rcBorder.top=point.y+26;
  471. m_rcBorder.bottom=m_rcBorder.top+4;
  472. }
  473. }
  474. else
  475. {
  476. if (m_SideMove==HTBOTTOM || m_SideMove==HTTOP)
  477. {
  478. m_rcBorder.top=point.y+26;
  479. m_rcBorder.bottom=m_rcBorder.top+4;
  480. }
  481. else
  482. {
  483. m_rcBorder.left=point.x;
  484. m_rcBorder.right=m_rcBorder.left+4;
  485. }
  486. }
  487. //--------------------------------------------------
  488. //se hacen iguales todos los tama駉s
  489. ClientToScreen(&point);
  490. GetParentFrame()->ScreenToClient(&point);
  491. m_ptActualPos=point;
  492. OnInvertTracker(m_rcBorder);
  493. //SetEqualWidth();
  494. //-----------------------------------------------
  495. }
  496. }
  497. //depende de la posicion se hace igual el tamanio del ancho o alto
  498. void CGuiControlBar::SetEqualWidth()
  499. {
  500. int nFirstPos=GetFirstPos();
  501. for (int nPos = nFirstPos; nPos <= m_Last; nPos++)
  502. {
  503. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  504. if (pBar== NULL) continue;
  505. if (IsHorz())
  506. pBar->m_sizeHorz.cy=m_sizeHorz.cy;//rcDockBar.Height();
  507. else
  508. pBar->m_sizeVert.cx=m_sizeVert.cx;
  509. }
  510. }
  511. int CGuiControlBar::GetHiWid()
  512. {
  513. CRect rcWin;
  514. rcWin=GetDockRect();
  515. if (IsVert())
  516. return rcWin.Height() ;
  517. else
  518. return rcWin.Width() ;
  519. }
  520. //espero que funcione el truco
  521. //la idea es trabajar con coordenadas screen las dimensiones de los bordes del
  522. //dockBar, mas no con los movimientos internos.
  523. void CGuiControlBar::OnLButtonUp(UINT nFlags, CPoint point)
  524. {
  525. // TODO: Add your message handler code here and/or call default
  526. CPoint ptTemp=point;
  527. ClientToScreen(&ptTemp);
  528. if (m_bTracking)
  529. {
  530. ReleaseCapture();
  531. m_bTracking=FALSE;
  532. OnInvertTracker(m_rcBorder);
  533. m_pDockSite->UnlockWindowUpdate();
  534. if (ptTemp ==m_ptStartPos) return;
  535. if (IsVert())
  536. {
  537. if (m_SideMove==HTLEFT)
  538. m_sizeVert.cx-=point.x;
  539. else if(m_SideMove==HTRIGHT)
  540. m_sizeVert.cx=point.x;
  541. else if(m_SideMove==HTTOP)
  542. AjustReDinSize(point);
  543. }
  544. else
  545. {
  546.    if (m_SideMove==HTBOTTOM)
  547.    {
  548. if (point.y < 0)
  549. m_sizeHorz.cy+=abs(point.y);
  550. else
  551. m_sizeHorz.cy=point.y;
  552. }
  553.  
  554.    else if (m_SideMove==HTTOP)
  555.    {
  556.   if (point.y < 0)
  557.   m_sizeHorz.cy+=abs(point.y)-12;
  558.   else
  559.   m_sizeHorz.cy-=abs(point.y)+12;
  560.    }
  561. else if (m_SideMove==HTRIGHT)
  562.        AjustReDinSize(point);
  563.     
  564. }
  565. SetEqualWidth();
  566. }
  567. m_pDockSite->RecalcLayout();
  568. }
  569. //ajusta las ventanas a redimencionarlas verticalmente
  570. //se decrementa las anteriores ventanas a la actual y se 
  571. //incrementan las posteriores.
  572. void CGuiControlBar::AjustReDinSize(CPoint point)
  573. {
  574. int nFirstPos=GetFirstPos();
  575. int nLastPos=GetLastPos();
  576. int m_ThisPos=m_pDockBar->FindBar(this);
  577. ClientToScreen(&point);
  578. //si la diferencia es negativa esta barra crece la anterior a esta disminuye
  579. int nDif=0;
  580. BOOL bGrow=FALSE;
  581. if (IsVert())
  582. {
  583.  nDif=m_ptStartPos.y- point.y;
  584.  if (nDif > 0)
  585. bGrow=TRUE;
  586.  
  587.  if (bGrow)
  588.                 m_sizeVert.cy+=abs(nDif)+4;
  589.  else
  590. m_sizeVert.cy-=abs(nDif);
  591.    if (nFirstPos == m_ThisPos) 
  592. return;
  593. }
  594. else
  595. {
  596.  nDif=m_ptStartPos.x- point.x;
  597.  if (nDif < 0)
  598. bGrow=TRUE;
  599.  if (bGrow)
  600. m_sizeHorz.cx+=abs(nDif);
  601. else
  602. m_sizeHorz.cx-=abs(nDif);
  603.          if (nLastPos == m_ThisPos) 
  604. return;
  605. }
  606. if (IsVert())
  607. AjustVert(bGrow,nDif);
  608. else
  609. AjustHorz(bGrow,nDif);
  610. RecalWindowPos();
  611. }
  612. void CGuiControlBar::AjustVert(BOOL bGrow,int nDif)
  613. {
  614. int nFirstPos=GetFirstPos();
  615. int nLastPos=GetLastPos();
  616. int m_ThisPos=m_pDockBar->FindBar(this);
  617. if(m_SideMove==HTTOP)
  618. {
  619. //Esta ventana crece las anteriores reducen su tama駉
  620. if (bGrow)
  621. {
  622. for (int i=m_ThisPos-1; i > 0; i--)
  623. {
  624. CGuiControlBar* pBar = GetGuiControlBar(i);
  625. if (pBar== NULL) return;
  626. if(IsVert())
  627. {
  628. if (pBar->m_sizeVert.cy-abs(nDif) < pBar->m_sizeMinV.cy)
  629. {
  630. pBar->m_sizeVert.cy=pBar->m_sizeMinV.cy;
  631. continue;
  632. }
  633. else
  634. {
  635. pBar->m_sizeVert.cy-=abs(nDif);
  636. break;
  637. }
  638. }
  639. }//for
  640. }//bGrow
  641. else //este disminuye la anterior crece
  642. {
  643. if (m_ThisPos-1 > 0)
  644. {
  645. CGuiControlBar* pBar = GetGuiControlBar(m_ThisPos-1);
  646. if (pBar== NULL) return;
  647. pBar->m_sizeVert.cy+=abs(nDif); 
  648. if(m_sizeVert.cy > m_sizeMinV.cy)
  649. return;
  650. else
  651.   pBar->m_sizeVert.cy-=m_sizeMinV.cy; 
  652. }
  653. for (int i=m_ThisPos+1; i >= m_Last; i++)
  654. {
  655. CGuiControlBar* pBar = GetGuiControlBar(i);
  656. if (pBar== NULL) return;
  657. if(IsVert())
  658. {
  659. if (pBar->m_sizeVert.cy-abs(nDif) < pBar->m_sizeMinV.cy)
  660. continue;
  661. else
  662. {
  663. pBar->m_sizeVert.cy-=abs(nDif);
  664. return;
  665. }
  666. }
  667. }//for
  668. }
  669. }
  670. }
  671. void CGuiControlBar::AjustHorz(BOOL bGrow,int nDif)
  672. {
  673. int nFirstPos=GetFirstPos();
  674. int nLastPos=GetLastPos();
  675. int m_ThisPos=m_pDockBar->FindBar(this);
  676. if(m_SideMove==HTRIGHT)
  677. {
  678. //Esta ventana crece las anteriores reducen su tama駉
  679. if (bGrow)
  680. {
  681. for (int i=m_ThisPos+1; i <= nLastPos; i++)
  682. {
  683. CGuiControlBar* pBar = GetGuiControlBar(i);
  684. if (pBar== NULL) return;
  685. if(IsHorz())
  686. {
  687. if (pBar->m_sizeHorz.cx-abs(nDif) < pBar->m_sizeMinH.cx)
  688. {
  689. pBar->m_sizeHorz.cx=pBar->m_sizeMinH.cx;
  690. continue;
  691. }
  692. else
  693. {
  694. pBar->m_sizeHorz.cx-=abs(nDif);
  695. break;
  696. }
  697. }
  698. }//for
  699. }//bGrow
  700. else //este disminuye la anterior crece
  701. {
  702.    if (m_ThisPos+1 <= m_Last)
  703. {
  704. CGuiControlBar* pBar = GetGuiControlBar(m_ThisPos+1);
  705. if (pBar== NULL) return;
  706. pBar->m_sizeHorz.cx+=abs(nDif); 
  707. if(m_sizeHorz.cx > m_sizeMinH.cx)
  708. return;
  709. else
  710.   pBar->m_sizeHorz.cx+=abs(nDif); 
  711. }
  712. for (int i=m_ThisPos-1; i >0; i--)
  713. {
  714. CGuiControlBar* pBar = GetGuiControlBar(i);
  715. if (pBar== NULL) return;
  716. if(IsHorz())
  717. {
  718. if (pBar->m_sizeHorz.cx-abs(nDif) < pBar->m_sizeMinH.cx)
  719. continue;
  720. else
  721. {
  722. pBar->m_sizeHorz.cx-=abs(nDif);
  723. return;
  724. }
  725. }
  726. }//for
  727. }
  728. }
  729. }
  730. //----------------------------------------------------
  731. //OnActiveWindow retira o asigna el foco a la ventana 
  732. void CGuiControlBar::OnActiveWindow()
  733. {
  734. POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition();
  735. while (pos != NULL)
  736. {
  737. CDockBar* pDockBar = (CDockBar*)m_pDockSite->m_listControlBars.GetNext(pos);
  738. if (pDockBar->IsDockBar() && pDockBar->IsWindowVisible() &&
  739. (!pDockBar->m_bFloating ))
  740. {
  741. int nNumBars=(int)pDockBar->m_arrBars.GetSize();
  742. for(int i=0; i< nNumBars;i++)
  743. {
  744. CGuiControlBar* pBar = (CGuiControlBar*) pDockBar->m_arrBars[i];
  745. if (HIWORD(pBar) == NULL) continue;
  746. if (!pBar->IsVisible()) continue;
  747. if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) continue;
  748. if (pBar != this)
  749. {
  750. pBar->m_bOldActive=FALSE;
  751. pBar->m_bActive=FALSE;
  752. pBar->m_bForcepaint=TRUE;
  753. pBar->SendMessage(WM_NCPAINT);
  754. pBar->m_bForcepaint=FALSE;
  755. }
  756. else
  757. {
  758. m_bOldActive=m_bActive;
  759. m_bActive=TRUE;
  760. m_bForcepaint=TRUE;
  761. SendMessage(WM_NCPAINT);
  762. m_bForcepaint=FALSE;
  763. }
  764. }
  765. }
  766. }
  767. }
  768. void CGuiControlBar::ActiveCaption()
  769. {
  770. CWnd* pFocus=SetFocus();
  771. if(pFocus->GetSafeHwnd())
  772. IsChild(pFocus);
  773. m_bForcepaint=TRUE;
  774. OnActiveWindow();
  775. m_bForcepaint=FALSE;
  776. }
  777. void CGuiControlBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
  778. {
  779. // TODO: Add your message handler code here and/or call default
  780. if (m_bTracking /*|| IsFloating()*/)
  781.         return;
  782.  
  783. m_ptStartPos=point;
  784. if( nHitTest == HTCAPTION || nHitTest == HTCLOSE)
  785. ActiveCaption();
  786. //---------para el boton----
  787. if( nHitTest == HTCLOSE)
  788. {
  789. m_stateBtn=PRESS;
  790. SendMessage(WM_NCPAINT);
  791. SetTimer(1,100,0);
  792. return;
  793. }
  794. //--------------------------
  795. if (m_pDockBar != NULL)
  796. {
  797. if (HTCAPTION == nHitTest)
  798. {
  799. m_pDockContext->StartDrag(point);
  800. m_sizeHorzt=m_sizeHorz;
  801. m_sizeVertt=m_sizeVert;
  802. }
  803. if(!m_bTracking)
  804. {
  805. if(m_rcBorder.PtInRect(point))
  806. {
  807. m_pDockSite->LockWindowUpdate();
  808. OnInvertTracker(m_rcBorder);
  809. m_ptStartPos=point;
  810. SetCapture();
  811. SetFocus();
  812. m_bTracking=TRUE;
  813. m_sizeHorzt=m_sizeHorz;
  814. m_sizeVertt=m_sizeVert;
  815. }
  816. }
  817. }
  818. CWnd::OnNcLButtonDown(nHitTest, point);
  819. }
  820. void CGuiControlBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
  821. {
  822. // TODO: Add your message handler code here and/or call default
  823. CRect rc;
  824. //------------------ para el boton
  825. CRect rcT=m_rcCloseBtn;
  826. ClientToScreen(rcT);
  827. point.y+=23;
  828. point.x+=5;
  829. if (rcT.PtInRect(point))
  830. {
  831. if (m_stateBtn ==PRESS)
  832. {
  833. m_stateBtn=NORMAL;
  834. KillTimer(1);
  835. GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  836. }
  837. //SendMessage(WM_NCPAINT);
  838. return;
  839. }
  840. //-------------------para el boton
  841. }
  842. void CGuiControlBar::OnNcPaint()
  843. {
  844. // TODO: Add your message handler code here
  845. // Do not call CControlBar::OnNcPaint() for painting messages
  846. // Tomo la misma rutina que se desarrolla para la clase 
  847. // CGuiToolBarWnd.
  848. CRect rcWindow;
  849. CRect rcClient;
  850. CWindowDC dc(this);
  851. CDC m_dc; //contexto de dispositivo en memoria
  852. CBitmap m_bitmap;
  853. //la idea es tomar el area de la ventana y area  cliente , luego debemos
  854. //igualar el area de coordenadas de ventana al cliente
  855. GetWindowRect(&rcWindow);
  856. GetClientRect(&rcClient);
  857. ScreenToClient(rcWindow);
  858.     rcClient.OffsetRect(-rcWindow.TopLeft());
  859.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  860.   
  861. m_dc.CreateCompatibleDC(&dc);
  862. m_bitmap.CreateCompatibleBitmap(&dc,rcWindow.Width(),rcWindow.Height());
  863. CBitmap *m_OldBitmap=m_dc.SelectObject(&m_bitmap);
  864. //aqui debe utilizarse la brocha que define GuiDrawLayer, si no hacemos la siguiente
  865. //linea usted vera un horrible color negro, a cambio del dibujo.
  866. CBrush cb;
  867. cb.CreateSolidBrush(m_clrFondo);
  868. m_dc.FillRect(rcWindow, &cb);
  869. DrawGripper(&m_dc,&rcWindow);
  870. dc.IntersectClipRect(rcWindow);
  871.     dc.ExcludeClipRect(rcClient);//asi evitamos el parpadeo
  872. dc.BitBlt(rcWindow.left,rcWindow.top,rcWindow.Width(),rcWindow.Height(),&m_dc,0,0,SRCCOPY);
  873. ReleaseDC(&dc);
  874. m_dc.SelectObject(m_OldBitmap);
  875. m_bitmap.DeleteObject();
  876. m_dc.DeleteDC();
  877. }
  878. void CGuiControlBar::DrawGripper(CDC* pDC,CRect* rc)
  879. {
  880. CRect gripper = rc;
  881. gripper.top =3;
  882. gripper.left+=4;
  883. gripper.right-=IsVert()?6:4;
  884. gripper.bottom =gripper.top +nGapGripper-3;
  885. //si la ventana esta activa pintamos el caption o el area del titulo de color azul 
  886. if (IsFloating())
  887. m_bActive=TRUE;
  888. /* Modified By SunZhenyu 2003/6/21, Add the following line*/
  889. m_bActive = FALSE;
  890. if(!m_bActive)
  891. {
  892. CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW));
  893. CPen* cpold=pDC->SelectObject(&cp);
  894. //linea superior
  895. pDC->MoveTo(gripper.left+1,gripper.top);
  896. pDC->LineTo(gripper.right,gripper.top);
  897. //linea izquierda
  898. pDC->MoveTo(gripper.left,gripper.top+1);
  899. pDC->LineTo(gripper.left,gripper.bottom);
  900. //linea inferior
  901. pDC->MoveTo(gripper.left+1,gripper.bottom);
  902. pDC->LineTo(gripper.right,gripper.bottom);
  903. //linea derecha
  904. pDC->MoveTo(gripper.right,gripper.top+1);
  905. pDC->LineTo(gripper.right,gripper.bottom);
  906. pDC->SelectObject(cpold);
  907. }
  908. else
  909. {
  910. CBrush cb;
  911. cb.CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION));//GuiDrawLayer::GetRGBCaptionXP());
  912. pDC->FillRect(gripper,&cb);
  913. }
  914. gripper.DeflateRect(1, 1);
  915. CString m_caption;
  916. GetWindowText(m_caption);
  917. CFont m_cfont;
  918. // Modified Bu SunZhenyu
  919. if( !m_cfont.CreateStockObject( DEFAULT_GUI_FONT ) )
  920. m_cfont.CreateStockObject( ANSI_VAR_FONT );
  921. // m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,"Verdana");
  922. CFont* m_fontOld=pDC->SelectObject(&m_cfont);
  923. int nMode = pDC->SetBkMode(TRANSPARENT);
  924. CSize SizeCad=pDC->GetTextExtent(m_caption);
  925. CRect rCText=gripper;
  926. rCText.top=6;
  927. rCText.bottom =rCText.top+14;
  928. int cont=SizeCad.cx;
  929. while(cont > 1 && gripper.Width() > 0)
  930. {
  931. CSize coor=pDC->GetTextExtent(m_caption,m_caption.GetLength());
  932. if(coor.cx > gripper.Width()-10)
  933. {
  934. m_caption=m_caption.Left(m_caption.GetLength()-1);
  935. }
  936. else
  937. break;
  938. cont--;
  939. }
  940. if (gripper.Width() > 0 )
  941. if (!m_bActive)
  942. pDC->TextOut(rCText.left+3,rCText.top,m_caption);
  943. else
  944. {
  945. pDC->SetTextColor(RGB(255,255,255));
  946. pDC->TextOut(rCText.left+3,rCText.top,m_caption);
  947. }
  948. //CRect gripper;
  949. //------------------------------------------------
  950. GetWindowRect( gripper );
  951. ScreenToClient( gripper );
  952. gripper.OffsetRect( -gripper.left, -gripper.top );
  953. gripper.left=gripper.right-20;
  954. gripper.right-=7;
  955. gripper.top+=6;
  956. gripper.bottom=gripper.top+13;
  957. m_rcCloseBtn=gripper;
  958. //m_rcCloseBtn.left-=4;
  959. //ClientToScreen(m_rcCloseBtn);
  960. if(!m_bActive)
  961.   m_CloseBtn.Paint(pDC,m_stateBtn,gripper,::GetSysColor(COLOR_BTNFACE));
  962. else
  963.   m_CloseBtn.Paint(pDC,m_stateBtn,gripper,::GetSysColor(COLOR_ACTIVECAPTION));
  964. //------------------------------------------------
  965.   pDC->SetBkMode(nMode);
  966. pDC->SelectObject(m_fontOld);
  967. }
  968. //en esta funci髇 se calcula el area cliente que podra ser utilizado
  969. //por ventanas que deriven esta clase.
  970. void CGuiControlBar::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
  971. {
  972. // adjust non-client area for border space
  973. lpncsp->rgrc[0].left +=!IsFloating()?5:2;
  974. lpncsp->rgrc[0].top +=nGapGripper+3;
  975. lpncsp->rgrc[0].right -=!IsFloating()?IsVert()?7:4:2;
  976. lpncsp->rgrc[0].bottom -=!IsFloating()?3:2;
  977. }
  978. //Aqui la idea es verificar que si se da clic sobre otra ventana de este tipo
  979. //automaticamente emita un mensaje eliminando el caption que la identifica como
  980. //ventana default.
  981. void CGuiControlBar::OnWindowPosChanged(WINDOWPOS* lpwndpos)
  982. {
  983. CRect rc;
  984. GetClientRect(rc);
  985. nDockBarAling = GetParent()->GetDlgCtrlID();
  986. //envie un recalculo del area cliente solo si el tama駉 ha sido 
  987. //cambiado, de lo contrario permanezca igual
  988. lpwndpos->flags |= SWP_FRAMECHANGED;
  989. CControlBar::OnWindowPosChanged(lpwndpos);
  990. CWnd* pWnd = GetWindow(GW_CHILD);
  991. if (!m_bSupportMultiView)
  992. {
  993.         if (pWnd != NULL)
  994.         {
  995.             pWnd->MoveWindow(rc);
  996.             ASSERT(pWnd->GetWindow(GW_HWNDNEXT) == NULL);
  997. }
  998. }
  999. else
  1000. {
  1001. while (pWnd != NULL)
  1002.         {
  1003.             if (pWnd->IsWindowVisible())
  1004. {
  1005. pWnd->MoveWindow(rc);
  1006. break;
  1007. }
  1008.             pWnd=pWnd->GetWindow(GW_HWNDNEXT);
  1009. }
  1010. }
  1011. }
  1012. //este conjunto de clases nos indican el estado de la ventana
  1013. //en un momento determinado
  1014. BOOL CGuiControlBar::IsLeft()
  1015. {
  1016. if (nDockBarAling == AFX_IDW_DOCKBAR_LEFT) return TRUE;
  1017. return FALSE;
  1018. }
  1019. BOOL CGuiControlBar::IsRight()
  1020. {
  1021. if (nDockBarAling == AFX_IDW_DOCKBAR_RIGHT) return TRUE;
  1022. return FALSE;
  1023. }
  1024. BOOL CGuiControlBar::IsTop()
  1025. {
  1026. if (nDockBarAling == AFX_IDW_DOCKBAR_TOP) return TRUE;
  1027. return FALSE;
  1028. }
  1029. BOOL CGuiControlBar::IsBottom()
  1030. {
  1031. if (nDockBarAling == AFX_IDW_DOCKBAR_BOTTOM) return TRUE;
  1032. return FALSE;
  1033. }
  1034. BOOL CGuiControlBar::IsVert()
  1035. {
  1036. if (IsLeft() || IsRight()) return TRUE;
  1037. return FALSE;
  1038. }
  1039. BOOL CGuiControlBar::IsHorz()
  1040. {
  1041. if (IsTop() || IsBottom()) return TRUE;
  1042. return FALSE;
  1043. }
  1044. BOOL CGuiControlBar::IsFloating()
  1045. {
  1046. if (nDockBarAling == AFX_IDW_DOCKBAR_FLOAT) return TRUE;
  1047. return FALSE;
  1048. }
  1049. void CGuiControlBar::OnPaint()
  1050. {
  1051. CPaintDC dc(this); // device context for painting
  1052. m_pDockSite->RecalcLayout();//si quita esto se tiene problemas    
  1053. // TODO: Add your message handler code here
  1054. // Do not call CControlBar::OnPaint() for painting messages
  1055. }
  1056. UINT CGuiControlBar::OnNcHitTest(CPoint point)
  1057. {
  1058. // TODO: Add your message handler code here and/or call default
  1059. CRect rcWindow;
  1060. //no se convierte las coordenadas de pantalla porque el punto
  1061. //entregado por esta funci髇 esta dado en el mismo sentido.
  1062. GetWindowRect(rcWindow);
  1063. int it=0;
  1064. // if (IsFloating())
  1065. //        return CControlBar::OnNcHitTest(point);
  1066. CRect rcT=m_rcCloseBtn;
  1067. ClientToScreen(rcT);
  1068. CPoint pt=point;
  1069. pt.y+=23;
  1070. pt.x+=5;
  1071. //pt.Offset(-rcT.left,-rcT.top);
  1072. if (rcT.PtInRect(pt))
  1073. return HTCLOSE;
  1074. CRect rcTemp;
  1075. for (int i=0; i< 4; i++)
  1076. {
  1077. rcTemp=rcWindow;
  1078. if (i== 0) //left
  1079. {
  1080. it= rcTemp.left;
  1081. it+=4;
  1082. rcTemp.right=it;
  1083. m_rcBorder=rcTemp;
  1084. if (rcTemp.PtInRect(point))
  1085. if(IsLegal(HTLEFT)) return m_SideMove=HTLEFT;
  1086. }
  1087. if (i==1)  //top
  1088. {
  1089. it= rcTemp.top;
  1090. it+=4;
  1091. rcTemp.bottom=it;
  1092. m_rcBorder=rcTemp;
  1093. if (rcTemp.PtInRect(point))
  1094.  if(IsLegal(HTTOP)) return m_SideMove=HTTOP ;
  1095. }
  1096. if (i==2)  //right
  1097. {
  1098. it= rcTemp.right;
  1099. it-=4;
  1100. rcTemp.left=it;
  1101. m_rcBorder=rcTemp;
  1102. if (rcTemp.PtInRect(point))
  1103. if (IsLegal(HTRIGHT)) return m_SideMove=HTRIGHT;
  1104. }
  1105. if (i==3)  //bottom
  1106. {
  1107. it= rcTemp.bottom;
  1108. it-=4;
  1109. rcTemp.top=it;
  1110. m_rcBorder=rcTemp;
  1111. if (rcTemp.PtInRect(point))
  1112. if (IsLegal(HTBOTTOM))return m_SideMove=HTBOTTOM;
  1113. }
  1114. }
  1115. it=0;
  1116. rcTemp=rcWindow;
  1117. it= rcTemp.top+nGapGripper;
  1118. rcTemp.bottom=it;
  1119. if (rcTemp.PtInRect(point))
  1120. return m_SideMove=HTCAPTION;
  1121. return CControlBar::OnNcHitTest(point);
  1122. }
  1123. //-----------------------------------------------------------
  1124. //aqui se verifica que las coordenadas de cambio de tama駉
  1125. //sean las correctas
  1126. BOOL CGuiControlBar::IsLegal(UINT uAlin)
  1127. {
  1128. m_First=GetFirstPos();
  1129. // if (IsFloating()) return FALSE;
  1130. switch(uAlin)
  1131. {
  1132. case HTLEFT:
  1133. if (IsHorz() && m_pos >0 && (m_pos != m_Last && m_pos != m_First)) return TRUE;
  1134. if (IsVert() && m_pos <= m_Last && IsRight() ) return TRUE;
  1135. return FALSE;
  1136. break;
  1137. case HTTOP:
  1138. if (m_pos != m_First && IsVert()) return TRUE;
  1139. if (IsHorz() && m_pos <= m_Last && IsBottom() ) return TRUE;
  1140. return FALSE;
  1141. break;
  1142. case HTRIGHT:
  1143. if (m_pos <= m_Last && IsVert() && IsLeft() ) return TRUE;
  1144. if (IsHorz() && m_pos >0 &&  m_pos != m_Last) return TRUE;
  1145. return FALSE;
  1146. case HTBOTTOM:
  1147. if ((m_pos != m_Last && m_pos != m_First) && IsHorz() && IsBottom()) return TRUE;
  1148. if (m_pos <= m_Last && IsHorz() && IsTop()) return TRUE;
  1149. //if (IsVert() && m_pos >0 ) return TRUE;
  1150. return FALSE;
  1151. break;
  1152. }
  1153. return FALSE;
  1154. }
  1155. //----------------------------------------------
  1156. //debemos obtener cuantas barras existen en esta columnas
  1157. //porque si intentamos obtener el conteo con la funciones de dockbar
  1158. //siempre obtendremos nuestra actual barra mas otra de otra fila, por lo que
  1159. //el conteo es incorrecto, luego despues de nuestra barra la siguiente nula
  1160. //es el final de esta fila.
  1161. int CGuiControlBar::GetLastPos()
  1162. {
  1163. int nNumBars=(int)m_pDockBar->m_arrBars.GetSize();
  1164. int m_pos=m_pDockBar->FindBar(this);
  1165. for(int i=m_pos+1; i< nNumBars;i++)
  1166. {
  1167. if (m_pDockBar->m_arrBars[i]== NULL)
  1168.     return i-1;
  1169. }
  1170. return -1;
  1171. }
  1172. //--------------------------------------------
  1173. //esta rutina funciona algo parecido a la anterior
  1174. //con la diferencia que ahora se parte desde la posicion
  1175. //que indetifica m_pos hacia atraz hasta encontrar el nulo
  1176. int CGuiControlBar::GetFirstPos()
  1177. {
  1178. int m_pos=m_pDockBar->FindBar(this);
  1179. for(int i=m_pos; i>=0;i--)
  1180. {
  1181. if (m_pDockBar->m_arrBars[i]== NULL)
  1182.     return i+1;
  1183. }
  1184. return -1;
  1185. }
  1186. //------------------------------------------------------------------------
  1187. BOOL CGuiControlBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  1188. {
  1189. // TODO: Add your message handler code here and/or call default
  1190. if (IsFloating()) return 0;
  1191. CPoint ptCursor;
  1192. ::GetCursorPos (&ptCursor);
  1193. if(nHitTest == HTLEFT ||nHitTest == HTRIGHT)
  1194. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_HSPLITBAR));
  1195. else if(nHitTest == HTTOP ||nHitTest == HTBOTTOM)
  1196. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_VSPLITBAR));
  1197. else
  1198. return CControlBar::OnSetCursor(pWnd, nHitTest, message);
  1199. return 1;
  1200. }
  1201. void CGuiControlBar::OnInvertTracker(const CRect& rect)
  1202. {
  1203. ASSERT_VALID(this);
  1204. ASSERT(!rect.IsRectEmpty());
  1205. CRect rcWin=GetDockRect();
  1206. CDC *pDC = m_pDockSite->GetDCEx(NULL,
  1207.         DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE);
  1208. CRect rcBar;
  1209. GetWindowRect(rcBar);
  1210. if (IsVert())  //el sentido de las barras es vertical
  1211. {
  1212. if (m_SideMove==HTLEFT || m_SideMove==HTRIGHT) //el mouse esta en el borde izquierdo o derecho
  1213. {
  1214. rcWin.OffsetRect(-rect.left,-rect.top);
  1215. rcWin.top+=10;
  1216. rcWin.left=rect.left+2;
  1217. rcWin.right=rect.right+2;
  1218. }
  1219. else  //el mouse esta el borde de arriba pero de una barra vertical
  1220. {
  1221. rcBar.OffsetRect(-rect.TopLeft());
  1222. rcWin=rcBar;
  1223. if (IsLeft() || IsRight())   //a la izquierda
  1224. {
  1225. rcWin.top=rect.top-2;
  1226. rcWin.bottom=rect.bottom-2;
  1227. }
  1228. //
  1229. }
  1230. }
  1231. else  //el sentido de las barras es horizontal
  1232. {
  1233. if (m_SideMove==HTTOP || m_SideMove==HTBOTTOM) //el mouse esta en el borde de arriba o abajo
  1234. {
  1235. rcWin.OffsetRect(-rect.left,-rect.top);
  1236. rcWin.top=rect.top-2;
  1237. rcWin.bottom=rect.bottom-2;
  1238. }
  1239. else //el mouse esta en el borde derecho
  1240. {
  1241. rcBar.OffsetRect(-rect.TopLeft());
  1242. rcWin=rcBar;
  1243. if (IsBottom() || IsTop()) //abajo
  1244. {
  1245. rcWin.left=rect.left+2;
  1246. rcWin.right=rect.right+2;
  1247. }
  1248. }
  1249. }
  1250. ClientToScreen(&rcWin);
  1251. GetParentFrame()->ScreenToClient(&rcWin);
  1252. // invert the brush pattern (looks just like frame window sizing)
  1253. CBrush* pBrush = CDC::GetHalftoneBrush();
  1254. HBRUSH hOldBrush = NULL;
  1255. if (pBrush != NULL)
  1256. hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
  1257. pDC->PatBlt(rcWin.left, rcWin.top, rcWin.Width(), rcWin.Height(), PATINVERT);
  1258. if (hOldBrush != NULL)
  1259. SelectObject(pDC->m_hDC, hOldBrush);
  1260. m_pDockSite->ReleaseDC(pDC);
  1261. }
  1262. void CGuiControlBar::OnSize(UINT nType, int cx, int cy)
  1263. {
  1264. // CControlBar::OnSize(nType, cx, cy);
  1265. CWnd* pWnd = GetWindow(GW_CHILD);
  1266. if (!m_bSupportMultiView)
  1267. {
  1268.         if (pWnd != NULL)
  1269.         {
  1270.             pWnd->MoveWindow(0, 0, cx, cy);
  1271.             ASSERT(pWnd->GetWindow(GW_HWNDNEXT) == NULL);
  1272. }
  1273. }
  1274. else
  1275. {
  1276. while (pWnd != NULL)
  1277.         {
  1278.             if (pWnd->IsWindowVisible())
  1279. {
  1280. pWnd->MoveWindow(0, 0, cx, cy);
  1281. break;
  1282. }
  1283.             pWnd=pWnd->GetWindow(GW_HWNDNEXT);
  1284. }
  1285. }
  1286. //m_pDockSite->RecalcLayout();
  1287. // TODO: Add your message handler code here
  1288. }
  1289. void CGuiControlBar::SetColorFondo(COLORREF clrFondo)
  1290. {
  1291. m_clrFondo=clrFondo;
  1292. }
  1293. //enum State{NORMAL=0,OVER=1,PRESS=2};
  1294. CGuiControlBarButton::CGuiControlBarButton()
  1295. {
  1296. bTypeButton=GUINORMAL;
  1297. m_bEnabled=TRUE;
  1298. }
  1299. CGuiControlBarButton::~CGuiControlBarButton()
  1300. {
  1301. }
  1302. void CGuiControlBarButton::SetTypeButton(GuiType bTypeb)
  1303. {
  1304. bTypeButton=bTypeb;
  1305. }
  1306. void CGuiControlBarButton::SetEnabled(BOOL bEnabled)
  1307. {
  1308. m_bEnabled=bEnabled;
  1309. }
  1310. void CGuiControlBarButton::Paint(CDC* pDC,int st,CRect rc,COLORREF clrFondo)
  1311. {
  1312. CBrush cb;
  1313. if(bTypeButton==GUINORMAL) 
  1314. cb.CreateSolidBrush(clrFondo);
  1315. else
  1316. {
  1317. if (m_bEnabled)
  1318. if (st == OVER)
  1319. cb.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  1320. else if(st == PRESS)
  1321. cb.CreateSolidBrush(GuiDrawLayer::GetRGBPressBXP());
  1322. else
  1323. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());
  1324. }
  1325. if (m_bEnabled)
  1326. {
  1327. pDC->FillRect(rc,&cb);
  1328. if (st == OVER)
  1329. pDC->Draw3dRect(rc,bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNHIGHLIGHT):GuiDrawLayer::GetRGBCaptionXP(),
  1330.    bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNSHADOW):GuiDrawLayer::GetRGBCaptionXP());
  1331. if (st == PRESS)
  1332. pDC->Draw3dRect(rc,bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNSHADOW):GuiDrawLayer::GetRGBCaptionXP(),
  1333. bTypeButton==GUINORMAL?::GetSysColor(COLOR_BTNHIGHLIGHT):GuiDrawLayer::GetRGBCaptionXP());
  1334. }
  1335. if(bTypeButton==GUINORMAL) 
  1336. m_imgList.Draw(pDC,clrFondo == ::GetSysColor(COLOR_ACTIVECAPTION)? m_nIcon+1:m_nIcon, 
  1337. CPoint(rc.left+1,rc.top+2), ILD_TRANSPARENT);
  1338. else
  1339. {
  1340. if (m_bEnabled)
  1341. m_imgList.Draw(pDC,m_nIcon, CPoint(rc.left+1,rc.top+1), ILD_TRANSPARENT);
  1342. else
  1343. {
  1344. HICON m_Icon=m_imgList.ExtractIcon(m_nIcon);
  1345. ICONINFO bm;
  1346. ZeroMemory(&bm, sizeof(ICONINFO));
  1347. ::GetIconInfo(m_Icon,&bm);
  1348. CSize m_SizeImage =CSize((BYTE)(bm.xHotspot*2),(BYTE)(bm.yHotspot*2));
  1349. pDC->DrawState(CPoint(rc.left+1,rc.top+1),m_SizeImage,m_Icon,DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  1350. }
  1351. }
  1352. }
  1353. void CGuiControlBarButton::SetData(int nIcon,LPCTSTR lpMsg)
  1354. {
  1355. m_nIcon=nIcon;
  1356. m_lpMsg=lpMsg;
  1357. }
  1358. void  CGuiControlBarButton::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
  1359. {
  1360. CBitmap cbmp;
  1361. BITMAP bmp;
  1362. m_imgList.Create(nBitmapID,cx,nGrow,crMask);
  1363. cbmp.LoadBitmap(nBitmapID);
  1364. cbmp.GetBitmap(&bmp);
  1365. m_imgList.Add(&cbmp,crMask);
  1366. }
  1367. void CGuiControlBar::OnNcMouseMove(UINT nHitTest, CPoint point)
  1368. {
  1369. // TODO: Add your message handler code here and/or call default
  1370. if (m_stateBtn != NORMAL) return;
  1371. if (nHitTest == HTCLOSE)
  1372. {
  1373. m_stateBtn=OVER;
  1374. SetTimer(1,100,0);
  1375. }
  1376. SendMessage(WM_NCPAINT);
  1377. CControlBar::OnNcMouseMove(nHitTest, point);
  1378. }
  1379. void CGuiControlBar::OnTimer(UINT nIDEvent)
  1380. {
  1381. // TODO: Add your message handler code here and/or call default
  1382. if (m_stateBtn==NORMAL) return;
  1383. CRect rc;
  1384. CPoint pt(GetMessagePos());
  1385. CRect rcT=m_rcCloseBtn;
  1386. ClientToScreen(rcT);
  1387. pt.y+=23;
  1388. pt.x+=5;
  1389. if (!rcT.PtInRect(pt))
  1390. {
  1391. m_stateBtn=NORMAL;
  1392. KillTimer(1);
  1393. SendMessage(WM_NCPAINT); 
  1394. }
  1395. CControlBar::OnTimer(nIDEvent);
  1396. }
  1397. void CGuiControlBar::OnNcLButtonDblClk(UINT nFlags, CPoint point)
  1398. {
  1399. if(m_pDockBar != NULL)
  1400. {
  1401. m_pDockContext->ToggleDocking();
  1402. m_rcOldBorder=CRect(0,0,0,0);
  1403. }
  1404. }