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

对话框与窗口

开发平台:

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. // GuiControlBar.cpp : implementation file
  23. #include "stdafx.h"
  24. #include "GuiControlBar.h"
  25. #include "GuiDockContext.h"
  26. #include "GuiDrawLayer.h"
  27. #include "GuiToolBarWnd.h"
  28. #include "menuBar.h"
  29. #include "GuiMDIFrame.h"
  30. #include "GuiFrameWnd.h"
  31. #include "GuiMiniFrameWnd.h"
  32. #define  GUI_SCROLLON   10
  33. #define  GUI_SCROLLOFF  11
  34. #define  GUI_NUMITER 5
  35. #define  HTPIN 323
  36. // CGuiControlBar
  37. #pragma warning( disable : 4244 )
  38. IMPLEMENT_DYNAMIC(CGuiControlBar, CControlBar)
  39. CGuiControlBar::CGuiControlBar()
  40. {
  41. nGapGripper=20;
  42. m_bActive=FALSE;
  43. m_bOldActive=FALSE;
  44. m_sizeMinFloating=m_sizeVert=m_sizeHorz=CSize(200,100);
  45. m_sizeMinFloating1=m_sizeMinFloating;
  46. m_sizeHorzt=CSize(200,100);
  47. m_sizeVertt=CSize(600,100);
  48. m_pos=0;
  49. m_Last=0;
  50. m_bTracking=FALSE;
  51. m_rcBorder=CRect(0,0,0,0);
  52. m_rcOldBorder=CRect(0,0,0,0);
  53. m_ptOld=CPoint(0,0);
  54. m_sizeMinV=CSize(28,28);
  55. m_sizeMinH=CSize(28,28);
  56. m_Initialize=FALSE;
  57. m_First=-1;
  58. m_bForcepaint=FALSE;
  59. m_stateBtn=NORMAL;
  60. m_stateAHBtn=NORMAL;
  61. m_bSupportMultiView=FALSE;
  62. m_MenuContext=NULL;
  63. m_StyleDisplay=GUISTYLE_XP;
  64. m_clrFondo=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  65. m_bAutoHide=FALSE;
  66. Porc=0.0;
  67. m_bComplete=TRUE;
  68. m_IsLoadDocking=TRUE;
  69. m_hIcon=NULL;
  70. }
  71. CGuiControlBar::~CGuiControlBar()
  72. {
  73. }
  74. BEGIN_MESSAGE_MAP(CGuiControlBar, CControlBar)
  75. ON_WM_CREATE()
  76. ON_WM_LBUTTONDOWN()
  77. ON_WM_RBUTTONDOWN()
  78. ON_WM_LBUTTONUP()
  79. ON_WM_NCLBUTTONDOWN()
  80. ON_WM_NCRBUTTONDOWN()
  81. ON_WM_NCLBUTTONUP()
  82. ON_WM_MOUSEMOVE()
  83. ON_WM_NCPAINT()
  84. ON_WM_NCCALCSIZE()
  85. ON_WM_WINDOWPOSCHANGED()
  86. ON_WM_PAINT()
  87. ON_WM_LBUTTONDBLCLK()
  88. ON_WM_NCLBUTTONDBLCLK()
  89. ON_WM_NCHITTEST()
  90. ON_WM_SETCURSOR()
  91. ON_WM_SIZE()
  92. ON_WM_NCMOUSEMOVE()
  93. ON_WM_TIMER()
  94. ON_COMMAND(ID_GUI_SHOWTITLE, OnShowTitle)
  95. ON_WM_SYSCOLORCHANGE()
  96. END_MESSAGE_MAP()
  97. // CGuiControlBar message handlers
  98. void CGuiControlBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)
  99. {
  100. CWnd* pFocus = GetFocus();
  101. m_bOldActive=(pFocus->GetSafeHwnd() && IsChild(pFocus));
  102. m_bForcepaint=TRUE;
  103. if (!m_bActive && m_bOldActive)
  104. OnActiveWindow();
  105. m_bForcepaint=FALSE;
  106. }
  107. void CGuiControlBar::OnSysColorChange( )
  108. {
  109. m_clrFondo=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  110. CControlBar::OnSysColorChange( );
  111. }
  112. BOOL CGuiControlBar::Create(LPCTSTR lpszWindowName, DWORD dwStyle,CWnd* pParentWnd, UINT nID)
  113. {
  114. // TODO: Add your specialized code here and/or call the base class
  115. //gran parte del codigo se tomo como guia de clases MFC
  116. ASSERT_VALID(pParentWnd);   // must have a parent
  117. //en esta linea se verifica que la ventana debe disponer de un estilo fijo o dinamico
  118. //pero no los dos.el estilo Dynamic permite cambiar el tama駉 dela ventana mientras flota
  119. //pero no cuando esta docking, el estilo fijo determina las columnas en que se disponen los
  120. //componentes y permance asi.
  121. ASSERT(!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC)));
  122. // save the style
  123. //en dwStyle debe asignarse un tipo de alineaci髇 por ejemplo CBRS_TOP,etc de lo contrario
  124. //se generase un ASSERT al acambiar el Style
  125. dwStyle|=CBRS_TOP;
  126. m_dwStyle = (dwStyle & CBRS_ALL);//save the original style
  127. dwStyle &= ~CBRS_ALL;
  128. //en la siguiente instruccion el proposito que se busca es evitar el parpadeo
  129. //cuando se refresca la ventana.
  130. //WS_CLIPCHILDREN : recorta el area de las ventanas hijas cuando se dibuja sobre
  131. //  la ventana que la contiene.
  132. //WS_CLIPSIBLING : cuando se recibe el mensaje paint se recorta el area de las otras ventanas
  133. //    hijas superpuestas, que estan fuera de la region.
  134. dwStyle |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
  135. pMf=pParentWnd;
  136. //con el estilo CS_DBLCLKS, lo que se busca es que al recibir un doble clic
  137. //la ventana reaccione,ojo el problema es que esto lo hace solo con el area cliente.
  138. LPCTSTR lpszClassName=::AfxRegisterWndClass(CS_DBLCLKS,
  139. ::LoadCursor(NULL,IDC_ARROW),
  140. ::GetSysColorBrush(COLOR_BTNFACE),
  141. NULL);
  142. //poque no se llama a CControlBar::Create, bueno, da igual llamar a cualquiera, CWnd o CControlBar
  143. //esto debido a que CControlbar se deriva de CWnd y porque ademas CControlBar no sobrecarga el
  144. //metodo Create, nosotros si porque tenemos que particularizar, cosas.
  145. BOOL bResp= CWnd::Create(lpszClassName, lpszWindowName, dwStyle, CRect(0,0,0,0), pParentWnd, nID);
  146. if (!bResp) return FALSE;
  147. return TRUE;
  148. }
  149. int CGuiControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  150. {
  151. if (CControlBar::OnCreate(lpCreateStruct) == -1)
  152. return -1;
  153. // TODO:  Add your specialized creation code here
  154. //aqui es cuando llamamos a nuestra clase CGuiDockContext, de esta manera
  155. //sobrecargamos el clase original que para nuestros propositos no nos sirve.
  156. //porque ?, bueno porque me interesa que no se pegen las toolbar en el interior
  157. //de las ventanas.
  158. if (m_pDockContext==NULL)
  159. m_pDockContext=new CGuiDockContext(this);
  160. ASSERT(m_pDockContext);
  161. m_CloseBtn.SetData(6,_T("Close"));
  162. m_CloseBtn.SetImageList(IDB_GUI_DOCKBAR,9,10,RGB(255,0,255));
  163. m_AutoHideBtn.SetData(12,_T("Auto Hide"));
  164. m_AutoHideBtn.SetImageList(IDB_GUI_DOCKBAR,9,15,RGB(255,0,255));
  165. return 0;
  166. }
  167. void CGuiControlBar::OnShowTitle()
  168. {
  169. ActiveCaption();
  170. SendMessage(WM_NCPAINT);
  171. }
  172. CSize CGuiControlBar::CalcWinPos()
  173. {
  174. POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition();
  175. DWORD dwDockStyle = m_dwDockStyle;
  176. dwDockStyle &= CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI;
  177. CRect rect;
  178. GetWindowRect(&rect);
  179. while (pos != NULL)
  180. {
  181. CDockBar* pDockBar = (CDockBar*)m_pDockSite->m_listControlBars.GetNext(pos);
  182. if (pDockBar->IsDockBar() && pDockBar->IsWindowVisible() &&
  183. (pDockBar->m_dwStyle & dwDockStyle & CBRS_ALIGN_ANY) &&
  184. (!pDockBar->m_bFloating ||
  185. (dwDockStyle & pDockBar->m_dwStyle & CBRS_FLOAT_MULTI)))
  186. {
  187. CRect rectBar;
  188. pDockBar->GetWindowRect(&rectBar);
  189. if (rectBar.Width() == 0)
  190. rectBar.right++;
  191. if (rectBar.Height() == 0)
  192. rectBar.bottom++;
  193. if (rectBar.IntersectRect(rectBar, rect))
  194. {
  195. int nSize=pDockBar->m_arrBars.GetSize();
  196. int iCont=0;
  197. UINT m_nDockBarID; 
  198. for (int i=0;i <nSize;  i++)
  199. {
  200. m_nDockBarID = pDockBar->GetDlgCtrlID();
  201. CControlBar* pBar;
  202. pBar = (CControlBar*) pDockBar->m_arrBars[i];
  203. if (HIWORD(pBar) == 0) continue; // placeholder
  204. if (!pBar->IsVisible()) continue;
  205. iCont++;
  206. }
  207. m_pDockSite->GetControlBar(m_nDockBarID)->GetWindowRect(rectBar);
  208. if((pDockBar->m_dwStyle & dwDockStyle) ==CBRS_ALIGN_LEFT)
  209. {
  210. if (iCont==0)
  211. return CSize(m_sizeMinFloating.cx,(rectBar.Height()-4));
  212. else if(iCont>0)
  213. return CSize(m_sizeMinFloating.cx,(rectBar.Height()/iCont));
  214. }
  215. else
  216. {
  217. if (iCont==0)
  218. return CSize((rectBar.Width()-4),m_sizeMinFloating.cy);
  219. else if(iCont>0)
  220. return CSize((rectBar.Width()/iCont),m_sizeMinFloating.cy);
  221. }
  222. }
  223. }
  224. }
  225. /* if (i==1)
  226. return CSize(m_sizeMinFloating.cx,(rcWin.Height()-4));
  227. else if(i>1)
  228. return CSize(m_sizeMinFloating.cx,(rcWin.Height()/i));
  229. else*/
  230. return m_sizeMinFloating;
  231. }
  232. //esta funcion calcula el tama駉 horizontal de la ventana,no importa si esta
  233. //docking a izquierda o derecha o arriba o abajo.Debemos disponer de un espacio equitativo entre todas
  234. //ventanas que se encuentren docking ya sea en una fila o columna.
  235. CSize CGuiControlBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  236. {
  237. //la funcion original toma el ancho o alto dependiendo del sentido que nos
  238. //indica bHorz.
  239. ASSERT_VALID(this);
  240. //se modifica esta rutina para que se ajuste correctamente las ventanas docking
  241. if (IsFloating())
  242. return m_sizeMinFloating;//CalcWinPos();
  243. else
  244. {
  245. //si bStrerch es TRUE significa que esta ventana no se puede hacer
  246. //Docking
  247. if (bStretch)
  248. {
  249. if (bHorz)
  250. return CSize(32767, m_sizeHorz.cy);
  251. else
  252. return CSize(m_sizeVert.cx, 32767);
  253. }
  254. }
  255. int Len=GetHiWid();
  256. //call from GuiDockContext
  257. if (Len==0)
  258. {
  259. if (IsHorz())
  260. return  m_sizeHorz;
  261. else
  262. return  m_sizeVert;
  263. }
  264. int nWidth = GetWidthMax();
  265. int nMinSpace=0;//minimo espacio requerido con lo tama駉s normales
  266. int nMinimo=0;  //minimo espacio de los tama駉s minimos
  267. int nRealBars=0;
  268. int m_First=GetFirstPos();
  269. for (int nPos = m_First; nPos <= m_Last; nPos++)
  270. {
  271. CGuiControlBar* pBar = GetGuiControlBar(nPos,TRUE);
  272. if (pBar== NULL) continue;
  273. if (!pBar->IsVisible()) continue;
  274. if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar)))
  275. {
  276. CPoint pt(GetMessagePos());
  277. CGuiFrameWnd* mFrame=(CGuiFrameWnd*)m_pDockSite;
  278. if (IsLeft())
  279. mFrame->DockControlBar(pBar,mFrame->m_dockLeft);
  280. if(IsTop())
  281. mFrame->DockControlBar(pBar,mFrame->m_dockTop);
  282. if(IsBottom())
  283. mFrame->DockControlBar(pBar,mFrame->m_dockBottom);
  284. if(IsRight())
  285. mFrame->DockControlBar(pBar,mFrame->m_dockRight);
  286. continue;
  287. }
  288. if (IsVert())
  289.  pBar->m_sizeVert.cx=nWidth;
  290. else
  291. pBar->m_sizeHorz.cy=nWidth; //todas se hacen con el mismo ancho
  292. nMinSpace+=IsVert() ? pBar->m_sizeVert.cy:pBar->m_sizeHorz.cx; //minimo espacio para alinear las barras
  293. nRealBars++; //cuantas barras realmente existen
  294. }
  295. //si el tama駉 de las barras en la fila es mayor que
  296. //el espacio disponible, luego la solucion salomonica es
  297. //repartir el espacio entre todas.
  298. if (nRealBars == 1 )
  299. {
  300. if (bHorz)
  301. return m_sizeHorz= CSize(Len,m_sizeHorz.cy);
  302. else
  303. return m_sizeVert=CSize(m_sizeVert.cx,Len);
  304. }
  305. int niDif=(Len-nMinSpace);//sVert()?8:2);
  306. if (abs(niDif) !=0)
  307. {
  308. BOOL bGrow=FALSE;
  309. if (niDif > 0)
  310. bGrow=TRUE;
  311. niDif=abs(niDif);
  312. while(niDif > 0)
  313. {
  314. for (int nPos = m_First; nPos <= m_Last; nPos++)
  315. {
  316. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  317. if (pBar== NULL) continue;
  318. if(IsVert())
  319. {
  320. if(bGrow)
  321. pBar->m_sizeVert.cy+=1;
  322. else
  323. {
  324. if (pBar->m_sizeVert.cy-1 < 26)
  325. {
  326. niDif--; //bug fixed
  327. continue;
  328. }
  329. pBar->m_sizeVert.cy-=1;
  330. }
  331. }
  332. else
  333. {
  334. if(bGrow)
  335. pBar->m_sizeHorz.cx+=1;
  336. else
  337. {
  338. if (pBar->m_sizeHorz.cx-1 < 26)
  339. {
  340. niDif--; //bug fixed
  341. continue;
  342. }
  343. pBar->m_sizeHorz.cx-=1;
  344. }
  345. }
  346. niDif--;
  347. if(niDif==0) break;
  348. }
  349. }
  350. }
  351.    //--reubicar las ventanas, sin esta rutina nada funciona
  352.   RecalWindowPos();
  353. if (IsHorz())
  354. return  m_sizeHorz;
  355. else
  356. return  m_sizeVert;
  357. }
  358. //esta rutina dispone de la posici髇 en el Dockbar de la pila de  ventanas
  359. void CGuiControlBar::RecalWindowPos()
  360. {
  361. int m_First=GetFirstPos();
  362. int m_Last=GetLastPos();
  363. int m_This=m_pDockBar->FindBar(this);
  364. AFX_SIZEPARENTPARAMS layout;
  365. layout.hDWP =::BeginDeferWindowPos( m_Last);
  366. CRect rcWin=GetDockRect();
  367. int m_VertPos=0;
  368. for(int i=m_First; i<= m_Last; i++)
  369. {
  370. CGuiControlBar* pBar = GetGuiControlBar(i);
  371. if (pBar == NULL) continue;
  372. CRect rcBar;
  373. pBar->GetWindowRect(rcBar);
  374. rcBar.OffsetRect(-rcWin.TopLeft());
  375. if (IsVert())
  376. {
  377.    if (i==m_First)
  378.  {
  379. rcBar.top=0;
  380.  }
  381.  else
  382.   rcBar.top=m_VertPos;
  383. }
  384. else
  385. {
  386. if (i==m_First)
  387. rcBar.left=0;
  388. else
  389.   rcBar.left=m_VertPos;
  390. }
  391. //AfxRepositionWindow(&layout,pBar->m_hWnd,&rcBar);
  392. if (IsVert())
  393. rcBar.bottom=m_VertPos+pBar->m_sizeVert.cy;
  394. else
  395. rcBar.right=m_VertPos+pBar->m_sizeHorz.cx;
  396. pBar->MoveWindow(rcBar,TRUE);
  397. if (IsVert())
  398. m_VertPos+=rcBar.Height();
  399. else
  400. m_VertPos+=rcBar.Width();
  401. }
  402. ASSERT( layout.hDWP != NULL );
  403. if( layout.hDWP != NULL )
  404. {
  405. VERIFY( ::EndDeferWindowPos(layout.hDWP) );
  406. }
  407. //m_pDockSite->DelayRecalcLayout();
  408. }
  409. CRect CGuiControlBar::GetDockRect()
  410. {
  411. CRect rcWin;
  412. if(!m_bAutoHide)
  413. {
  414. if (IsVert())
  415. if (IsLeft())
  416. {
  417. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  418. CRect rc11;
  419. m_pDockSite->GetControlBar(CBRS_ALIGN_LEFT)->GetWindowRect(rc11);
  420. }
  421. else
  422. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetWindowRect(rcWin);
  423. else
  424. if(IsBottom())
  425. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcWin);
  426. else
  427. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  428. }
  429. else
  430. {
  431. if (IsHideVert())
  432. if (IsHideLeft())
  433. {
  434. m_pDockSite->GetControlBar(CBRS_ALIGN_LEFT)->GetWindowRect(rcWin);
  435. CRect rc11;
  436. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc11);
  437. }
  438. else
  439. m_pDockSite->GetControlBar(CBRS_ALIGN_RIGHT)->GetWindowRect(rcWin);
  440. else
  441. if(IsHideBottom())
  442. m_pDockSite->GetControlBar(CBRS_ALIGN_BOTTOM)->GetWindowRect(rcWin);
  443. else
  444. m_pDockSite->GetControlBar(CBRS_ALIGN_TOP)->GetWindowRect(rcWin);
  445. }
  446. return rcWin;
  447. }
  448. CRect CGuiControlBar::GetDockRectBck()
  449. {
  450. CRect rcWin=CRect(0,0,0,0);
  451. if (m_nLastAlingDockingBck==AFX_IDW_DOCKBAR_LEFT)
  452. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  453. else if(m_nLastAlingDockingBck==AFX_IDW_DOCKBAR_RIGHT)
  454. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetWindowRect(rcWin);
  455. else if(m_nLastAlingDockingBck==AFX_IDW_DOCKBAR_BOTTOM)
  456. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcWin);
  457. else if(m_nLastAlingDockingBck==AFX_IDW_DOCKBAR_TOP)
  458. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  459. return rcWin;
  460. }
  461. int CGuiControlBar::GetWidthMax()
  462. {
  463. m_pos=m_pDockBar->FindBar(this);
  464. m_Last=GetLastPos();
  465. int nWidth=0;
  466. for (int nPos = GetFirstPos(); nPos <= m_Last; nPos++)
  467. {
  468. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  469. if (pBar== NULL) continue;
  470. nWidth=max(nWidth,IsVert() ? pBar->m_sizeVert.cx:pBar->m_sizeHorz.cy);
  471. }
  472. return nWidth;
  473. }
  474. CGuiControlBar* CGuiControlBar::GetGuiControlBar(int nPos,BOOL bAll) const
  475. {
  476. CGuiControlBar* pResult = (CGuiControlBar*)m_pDockBar->m_arrBars[nPos];
  477. if (bAll==FALSE)
  478. {
  479. if (HIWORD(pResult) == NULL) return NULL;
  480. else if (!pResult->IsVisible()) return NULL;
  481. else if (!pResult->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) return NULL;
  482. }
  483. else
  484. {
  485. if (HIWORD(pResult) == NULL)
  486. return NULL;
  487. }
  488. return pResult;
  489. }
  490. //En esta funci髇 se calcula el tama駉 de la ventana cuando esta flotando
  491. //y gestionar cuando el mouse es presionado en las esquinas.
  492. //#define HTTOPLEFT           13
  493. //#define HTTOPRIGHT          14
  494. //#define HTBOTTOMLEFT        16
  495. //#define HTBOTTOMRIGHT       17
  496. CSize CGuiControlBar::CalcDynamicLayout(int nLength, DWORD nMode)
  497. {
  498. // m_pDockSite->DelayRecalcLayout();
  499. if (IsFloating() && !m_bAutoHide)
  500. {
  501. // Enable diagonal arrow cursor for resizing
  502. //m_sizeVert=m_sizeHorz=CSize(200,200);
  503. GetParent()->GetParent()->ModifyStyle(MFS_4THICKFRAME/*|WS_CAPTION*/,0);
  504. }
  505. if (nMode & (LM_HORZDOCK | LM_VERTDOCK) )
  506. {
  507. m_pDockSite->DelayRecalcLayout();
  508. //obligar a reposicionar  la ventana, de lo contrario cuando vuelva de un doble click
  509. //desde la ventana CMiniFrameWnd queda sin area cliente
  510. if (!m_bAutoHide)
  511. {
  512. SetWindowPos(NULL, 0, 0, 0, 0,
  513. SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
  514. SWP_NOACTIVATE | SWP_FRAMECHANGED|SWP_NOREDRAW);
  515. }
  516.   return CControlBar::CalcDynamicLayout(nLength, nMode);
  517. }
  518. if (nMode & LM_MRUWIDTH && !m_bAutoHide)
  519. return  m_sizeMinFloating;
  520. if (nMode & LM_COMMIT && !m_bAutoHide)
  521. return  m_sizeMinFloating ;
  522. if (m_bAutoHide)
  523. {
  524. CRect rcW;
  525. CRect rcC;
  526. CRect rcFrameClient;
  527. GetClientRect(rcC);
  528. if (m_nLastAlingDocking ==CBRS_ALIGN_LEFT)
  529. {
  530. m_pDockSite->GetControlBar(CBRS_ALIGN_LEFT)->GetWindowRect(rcW);
  531. m_sizeMinFloating.cy=rcW.Height();
  532. }
  533. if (m_nLastAlingDocking == CBRS_ALIGN_RIGHT)
  534. {
  535. m_pDockSite->GetControlBar(CBRS_ALIGN_RIGHT)->GetWindowRect(rcW);
  536. m_sizeMinFloating.cy=rcW.Height();
  537. }
  538. if (m_nLastAlingDocking == CBRS_ALIGN_TOP)
  539. {
  540. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcW);
  541. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcFrameClient);
  542. m_sizeMinFloating.cx=rcFrameClient.Width();
  543. }
  544. if (m_nLastAlingDocking == CBRS_ALIGN_BOTTOM)
  545. {
  546. m_pDockSite->GetControlBar(CBRS_ALIGN_BOTTOM)->GetWindowRect(rcW);
  547. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcFrameClient);
  548. m_sizeMinFloating.cx=rcFrameClient.Width();
  549. }
  550. return m_sizeMinFloating;
  551. }
  552. if (IsFloating() && !m_bAutoHide)
  553. {
  554. CRect rcWin;
  555. POINT cpt;
  556. GetCursorPos(&cpt);
  557. GetParent()->GetParent()->GetWindowRect(&rcWin);
  558. int nXOffset=0;int nYOffset=0;
  559. switch (m_pDockContext->m_nHitTest)
  560. {
  561. //------------------------------------------------------------------
  562. case HTLEFT:
  563. m_pDockContext->m_rectFrameDragHorz= rcWin;
  564. m_pDockContext->m_rectFrameDragHorz.left = cpt.x;
  565. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4 ;
  566. m_sizeMinFloating.cy = max((rcWin.bottom -rcWin.top)-nGapGripper-5,32)+2 ;
  567. return m_sizeMinFloating;
  568. break;
  569. case HTTOP:
  570. m_pDockContext->m_rectFrameDragHorz=rcWin;
  571. m_pDockContext->m_rectFrameDragHorz.top = cpt.y;
  572. m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
  573. m_sizeMinFloating.cy = max((rcWin.bottom -nGapGripper-cpt.y-3),32) ;
  574. return m_sizeMinFloating;
  575. break;
  576. case HTRIGHT:
  577. m_pDockContext->m_rectFrameDragHorz=rcWin;
  578. m_pDockContext->m_rectFrameDragHorz.right = cpt.x;
  579. m_sizeMinFloating.cy = max(rcWin.bottom -rcWin.top-nGapGripper-3,32) ;
  580. m_sizeMinFloating.cx = max(cpt.x-rcWin.left-4,32);
  581. return m_sizeMinFloating;
  582. break;
  583. case HTBOTTOM:
  584. m_pDockContext->m_rectFrameDragHorz=rcWin;
  585. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper-3,32) ;
  586. m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
  587. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-4;
  588. return m_sizeMinFloating;
  589. break;
  590. case HTTOPLEFT:
  591. //---------------------------------------------------------
  592. //En este caso crece la ventana a izquierda y hacia arriba
  593. //izquierda incrementa cx y top incrementa cy
  594. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-3 ;
  595. m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
  596. m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
  597. m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
  598. return m_sizeMinFloating;
  599. break;
  600. case HTTOPRIGHT:
  601. m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32)-4 ;
  602. m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
  603. m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
  604. m_pDockContext->m_rectFrameDragHorz.right = cpt.x-2;
  605. return m_sizeMinFloating;
  606. break;
  607. case HTBOTTOMLEFT:
  608. m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4;
  609. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32)-2 ;
  610. m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
  611. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-1;
  612. m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
  613. return m_sizeMinFloating;
  614. break;
  615. case HTBOTTOMRIGHT:
  616. m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32);
  617. m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32) ;
  618. m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
  619. m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y+1;
  620. m_pDockContext->m_rectFrameDragHorz.right = cpt.x+2;
  621. return m_sizeMinFloating;
  622. break;
  623. }
  624. }
  625. if(nMode & LM_LENGTHY)
  626.  m_sizeMinFloating.cy = max(nLength,32);
  627. else
  628.      m_sizeMinFloating.cx = max(nLength,32);
  629. return m_sizeMinFloating;
  630. }
  631. void CGuiControlBar::ScrollOff()
  632. {
  633. ScrollOnEfect(FALSE);
  634. GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  635. }
  636. void CGuiControlBar::ScrollOn()
  637. {
  638. m_sizeMinFloating1=m_sizeMinFloating;
  639. GetDockingFrame()->ShowControlBar(this, TRUE, TRUE);
  640. if (m_nLastAlingDocking ==CBRS_ALIGN_LEFT || m_nLastAlingDocking == CBRS_ALIGN_RIGHT)
  641. {
  642. m_nSizeMed= m_sizeMinFloating.cx/GUI_NUMITER;
  643. m_sizeMinFloating.cx=0;
  644. }
  645. else
  646. {
  647. m_nSizeMed= m_sizeMinFloating.cy/GUI_NUMITER;
  648. m_sizeMinFloating.cy=0;
  649. }
  650. ScrollOnEfect(TRUE);
  651. }
  652. void CGuiControlBar::ScrollOnEfect(BOOL on)
  653. {
  654. CRect rcW;
  655. CRect rcC;
  656. CRect rcFrameClient;
  657. CRect rcWinScroll;
  658. GetClientRect(rcC);
  659. GetWindowRect(rcWinScroll);
  660. CDockBar* pDockBar = m_pDockBar;
  661. CMiniDockFrameWnd* pDockFrame = (CMiniDockFrameWnd*)pDockBar->GetParent();
  662. CFrameWnd* pFrame = reinterpret_cast<CFrameWnd*>(AfxGetMainWnd());
  663. CRect rc1;
  664. m_bComplete=FALSE;
  665. long iWidth80;
  666. long iWidth20;
  667. long iGUI_NUMITER=GUI_NUMITER;
  668. if (IsHideVert())
  669. {
  670. iWidth80=m_sizeMinFloating1.cx/iGUI_NUMITER;
  671. iWidth20=m_sizeMinFloating1.cx/iGUI_NUMITER;
  672. }
  673. else
  674. {
  675. iWidth80=m_sizeMinFloating1.cy/iGUI_NUMITER;
  676. iWidth20=m_sizeMinFloating1.cy/iGUI_NUMITER;
  677. }
  678. for(int i=0; i< iGUI_NUMITER; i++)
  679. {
  680. if (IsHideVert())
  681. {
  682. if (IsHideLeft())
  683. m_pDockSite->GetControlBar(CBRS_ALIGN_LEFT)->GetWindowRect(rcW);
  684. else
  685. m_pDockSite->GetControlBar(CBRS_ALIGN_RIGHT)->GetWindowRect(rcW);
  686. }
  687. else
  688. {
  689. if(IsHideBottom())
  690. {
  691. m_pDockSite->GetControlBar(CBRS_ALIGN_BOTTOM)->GetWindowRect(rcW);
  692. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcFrameClient);
  693. m_sizeMinFloating.cx=rcFrameClient.Width();
  694. }
  695. else
  696. {
  697. m_pDockSite->GetControlBar(CBRS_ALIGN_TOP)->GetWindowRect(rcW);
  698. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcFrameClient);
  699. m_sizeMinFloating.cx=rcFrameClient.Width();
  700. }
  701. }
  702. if (on)
  703. {
  704. if (IsHideVert())
  705. m_sizeMinFloating.cx+=(long)iWidth80;
  706. else
  707. m_sizeMinFloating.cy+=(long)iWidth80;
  708. }
  709. else
  710. {
  711. if (IsHideVert())
  712. m_sizeMinFloating.cx-=(long)iWidth80;
  713. else
  714. m_sizeMinFloating.cy-=(long)iWidth80;
  715. }
  716. if (IsHideVert())
  717. m_sizeMinFloating.cy=rcW.Height()-(rcW.Height()+m_pDockSite->GetControlBar(CBRS_ALIGN_TOP)->IsVisible()?24:0);
  718. if (IsHideVert())
  719. {
  720. if (IsHideLeft())
  721. rc1.left=rcW.right+24;
  722. else
  723. rc1.left=rcW.left-(m_sizeMinFloating.cx+26);
  724. rc1.top=rcW.top;
  725. rc1.right=rc1.left+m_sizeMinFloating.cx;
  726. rc1.bottom=rc1.top+m_sizeMinFloating.cy;
  727. }
  728. else
  729. {
  730. if (IsHideBottom())
  731. rc1.top=rcW.top-(m_sizeMinFloating.cy+26);
  732. else
  733. rc1.top=rcW.bottom+26;
  734. rc1.left=rcFrameClient.left;
  735. rc1.right=rc1.left+m_sizeMinFloating.cx;
  736. rc1.bottom=rc1.top+m_sizeMinFloating.cy;
  737. }
  738. pDockFrame->SetWindowPos(reinterpret_cast<CWnd*>(HWND_TOP),rc1.left,rc1.top, rc1.Width(),rc1.Height(),SWP_HIDEWINDOW);
  739. CRect rcInvalidateClient(rc1);
  740. MapWindowPoints(NULL,&rcInvalidateClient);
  741. pDockFrame->RecalcLayout(TRUE);
  742. pDockFrame->UpdateWindow();
  743. pDockFrame->SetWindowPos(reinterpret_cast<CWnd*>(HWND_TOP), rc1.left,rc1.top, rc1.Width(),rc1.Height(),
  744. SWP_SHOWWINDOW|SWP_NOACTIVATE);
  745. RedrawWindow(&rcInvalidateClient,NULL, RDW_UPDATENOW);
  746. if(!on)
  747. {
  748. pFrame->RecalcLayout(TRUE);
  749. pFrame->UpdateWindow();
  750. pFrame->RedrawWindow(&rcInvalidateClient,NULL,RDW_UPDATENOW);
  751. }
  752. //Sleep(10);
  753. }
  754. m_bComplete=TRUE;
  755. m_sizeMinFloating=m_sizeMinFloating1;
  756. if (!on)
  757. {
  758. pDockFrame->SetWindowPos(reinterpret_cast<CWnd*>(HWND_TOP),rc1.left,rc1.top, rc1.Width(),rc1.Height(),SWP_HIDEWINDOW);
  759. }
  760. else
  761. {
  762. pDockFrame->RecalcLayout(TRUE);
  763. pDockFrame->UpdateWindow();
  764. }
  765. }
  766. void CGuiControlBar::OnTimer(UINT nIDEvent)
  767. {
  768. // TODO: Add your message handler code here and/or call default
  769. if (nIDEvent == 1)
  770. {
  771. if (m_stateBtn==NORMAL) return;
  772. CRect rc;
  773. CPoint pt(GetMessagePos());
  774. CRect rcT=m_rcCloseBtn;
  775. ClientToScreen(rcT);
  776. pt.y+=23;
  777. pt.x+=5;
  778. if (!rcT.PtInRect(pt))
  779. {
  780. m_stateBtn=NORMAL;
  781. KillTimer(1);
  782. SendMessage(WM_NCPAINT);
  783. }
  784. }
  785. if (nIDEvent == 2)
  786. {
  787. if (m_stateAHBtn==NORMAL) return;
  788. CRect rc;
  789. CPoint pt(GetMessagePos());
  790. CRect rcT=m_rcAutoHideBtn;
  791. ClientToScreen(rcT);
  792. pt.y+=23;
  793. pt.x+=5;
  794. if (!rcT.PtInRect(pt))
  795. {
  796. m_stateAHBtn=NORMAL;
  797. KillTimer(2);
  798. SendMessage(WM_NCPAINT);
  799. }
  800. }
  801. CControlBar::OnTimer(nIDEvent);
  802. }
  803. void CGuiControlBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  804. {
  805. // TODO: Add your message handler code here and/or call default
  806. if(m_pDockBar != NULL)
  807. {
  808. ActiveCaption();
  809. // m_pDockContext->ToggleDocking();
  810. }
  811. else
  812. CWnd::OnLButtonDblClk(nFlags, point);
  813. }
  814. void CGuiControlBar::OnLButtonDown(UINT nFlags, CPoint point)
  815. {
  816. // TODO: Add your message handler code here and/or call default
  817. if (m_pDockBar != NULL)
  818.     {
  819.         // start the drag
  820.         ClientToScreen(&point);
  821.        // m_pDockContext->StartDrag(point);
  822.     }
  823.     else
  824. CControlBar::OnLButtonDown(nFlags, point);
  825. }
  826. void CGuiControlBar::OnRButtonDown(UINT nFlags, CPoint point)
  827. {
  828. // TODO: Add your message handler code here and/or call default
  829. if (m_pDockBar != NULL)
  830.     {
  831.         // start the drag
  832.         ReleaseCapture();
  833.         m_pDockSite->UnlockWindowUpdate();
  834.     }
  835.     else
  836. CControlBar::OnLButtonDown(nFlags, point);
  837. }
  838. void CGuiControlBar::OnMouseMove( UINT nHitTest, CPoint point)
  839. {
  840. if(m_bTracking)
  841. {
  842. if (GetCapture() != this)
  843. {
  844. //StopTracking(FALSE);
  845. m_bTracking=FALSE;
  846. }
  847. OnInvertTracker(m_rcBorder);
  848. //nuevos tama駉s de la ventana
  849. if (IsVert() || IsHideVert())
  850. {
  851. if (m_SideMove==HTLEFT || m_SideMove==HTRIGHT)
  852. {
  853. m_rcBorder.left=point.x;
  854. m_rcBorder.right=m_rcBorder.left+4;
  855. }
  856. else
  857. {
  858. m_rcBorder.top=point.y+26;
  859. m_rcBorder.bottom=m_rcBorder.top+4;
  860. }
  861. }
  862. else
  863. {
  864. if (m_SideMove==HTBOTTOM || m_SideMove==HTTOP)
  865. {
  866. m_rcBorder.top=point.y+26;
  867. m_rcBorder.bottom=m_rcBorder.top+4;
  868. }
  869. else
  870. {
  871. m_rcBorder.left=point.x;
  872. m_rcBorder.right=m_rcBorder.left+4;
  873. }
  874. }
  875. //--------------------------------------------------
  876. //se hacen iguales todos los tama駉s
  877. //if(!m_bAutoHide)
  878. {
  879. ClientToScreen(&point);
  880. m_pDockSite->ScreenToClient(&point);
  881. }
  882. m_ptActualPos=point;
  883. OnInvertTracker(m_rcBorder);
  884. //SetEqualWidth();
  885. //-----------------------------------------------
  886. }
  887. }
  888. //depende de la posicion se hace igual el tamanio del ancho o alto
  889. void CGuiControlBar::SetEqualWidth()
  890. {
  891. int nFirstPos=GetFirstPos();
  892. for (int nPos = nFirstPos; nPos <= m_Last; nPos++)
  893. {
  894. CGuiControlBar* pBar = GetGuiControlBar(nPos);
  895. if (pBar== NULL) continue;
  896. if (IsHorz())
  897. pBar->m_sizeHorz.cy=m_sizeHorz.cy;//rcDockBar.Height();
  898. else
  899. pBar->m_sizeVert.cx=m_sizeVert.cx;
  900. }
  901. }
  902. int CGuiControlBar::GetHiWid()
  903. {
  904. CRect rcWin;
  905. CMenuDockBar* pDock=(CMenuDockBar*)m_pDockBar;
  906. rcWin=pDock->m_rectLayout; //the real size
  907. if(IsVert())
  908. return rcWin.Height();
  909. else
  910. return rcWin.Width();
  911. }
  912. //espero que funcione el truco
  913. //la idea es trabajar con coordenadas screen las dimensiones de los bordes del
  914. //dockBar, mas no con los movimientos internos.
  915. void CGuiControlBar::OnLButtonUp(UINT nFlags, CPoint point)
  916. {
  917. // TODO: Add your message handler code here and/or call default
  918. CPoint ptTemp=point;
  919. ClientToScreen(&ptTemp);
  920. CRect rcFrame;
  921. CDockBar* pDockBar = m_pDockBar;
  922. BOOL isMDI=FALSE;
  923. if (GetParentFrame()->IsKindOf(RUNTIME_CLASS(CGuiMDIFrame)))
  924. isMDI=TRUE;
  925.     
  926. if (m_bAutoHide)
  927. {
  928. if (isMDI)
  929.  ((CGuiMDIFrame*)GetParentFrame())->GetParent()->GetClientRect(rcFrame);
  930. else 
  931.  ((CGuiFrameWnd*)GetParentFrame())->GetParent()->GetClientRect(rcFrame);
  932. }
  933. else
  934. {
  935. if (isMDI)
  936.  ((CGuiMDIFrame*)GetParentFrame())->GetClientRect(rcFrame);
  937. else 
  938.  ((CGuiFrameWnd*)GetParentFrame())->GetClientRect(rcFrame);
  939. }
  940. if (m_bTracking)
  941. {
  942. ReleaseCapture();
  943. m_bTracking=FALSE;
  944. OnInvertTracker(m_rcBorder);
  945. m_pDockSite->UnlockWindowUpdate();
  946. if (ptTemp ==m_ptStartPos) return;
  947. if (IsVert())
  948. {
  949. if (m_SideMove==HTLEFT)
  950. m_sizeVert.cx-=point.x;
  951. else if(m_SideMove==HTRIGHT)
  952. m_sizeVert.cx=point.x;
  953. else if(m_SideMove==HTTOP)
  954. AjustReDinSize(point);
  955. }
  956. else if (IsHorz())
  957. {
  958.    if (m_SideMove==HTBOTTOM)
  959.    {
  960. if (point.y < 0)
  961. m_sizeHorz.cy+=abs(point.y);
  962. else
  963. m_sizeHorz.cy=point.y;
  964. }
  965.    else if (m_SideMove==HTTOP)
  966.    {
  967.   if (point.y < 0)
  968.   m_sizeHorz.cy+=abs(point.y)-12;
  969.   else
  970.   m_sizeHorz.cy-=abs(point.y)+12;
  971.    }
  972. else if (m_SideMove==HTRIGHT)
  973.        AjustReDinSize(point);
  974. }
  975. if (IsHideVert()== TRUE)
  976. {
  977. if (IsHideRight())
  978. {
  979. if(point.x<0)
  980.    m_sizeMinFloating.cx+=abs(point.x);
  981. else
  982.    m_sizeMinFloating.cx-=point.x;
  983. if (m_sizeMinFloating.cx < (rcFrame.Width()-50) && m_sizeMinFloating.cx > 20)
  984. m_sizeMinFloating1=m_sizeMinFloating;
  985. else
  986. {
  987. m_sizeMinFloating=m_sizeMinFloating1;
  988. return;
  989. }
  990. CRect rc1;
  991. CMiniDockFrameWnd* pDockFrame = (CMiniDockFrameWnd*)pDockBar->GetParent();
  992. pDockFrame->GetWindowRect(rc1);
  993. if(point.x<0)
  994. rc1.right+=point.x;
  995. else
  996. rc1.right-=point.x;
  997. ClientToScreen(&point);
  998. pDockFrame->SetWindowPos(reinterpret_cast<CWnd*>(HWND_TOP),point.x-5,rc1.top, rc1.Width(),rc1.Height(),NULL);
  999. }
  1000. else
  1001. {
  1002. m_sizeMinFloating.cx=point.x+8;
  1003. if (m_sizeMinFloating.cx < (rcFrame.Width()-50) && m_sizeMinFloating.cx > 20)
  1004. m_sizeMinFloating1=m_sizeMinFloating;
  1005. else
  1006. m_sizeMinFloating=m_sizeMinFloating1;
  1007. m_sizeMinFloating1=m_sizeMinFloating;
  1008. GetParentFrame()->RecalcLayout(TRUE);
  1009. }
  1010. return ;
  1011. }
  1012. if (IsHideTop() || IsHideBottom())
  1013. {
  1014. if(IsHideTop())
  1015. {
  1016. m_sizeMinFloating.cy=point.y+25;
  1017. if (m_sizeMinFloating.cy < (rcFrame.Height()-100) && m_sizeMinFloating.cy > 20)
  1018. m_sizeMinFloating1=m_sizeMinFloating;
  1019. else
  1020. {
  1021. m_sizeMinFloating=m_sizeMinFloating1;
  1022. return;
  1023. }
  1024. m_pDockSite->RecalcLayout();
  1025. GetParentFrame()->RecalcLayout(TRUE);
  1026. }
  1027. else
  1028. {
  1029. if(point.y<0)
  1030.    m_sizeMinFloating.cy+=abs(point.y);
  1031. else
  1032.    m_sizeMinFloating.cy-=point.y;
  1033. if (m_sizeMinFloating.cy < (rcFrame.Height()-100) && m_sizeMinFloating.cy > 20)
  1034. m_sizeMinFloating1=m_sizeMinFloating;
  1035. else
  1036. {
  1037. m_sizeMinFloating=m_sizeMinFloating1;
  1038. return ;
  1039. }
  1040. CRect rc1;
  1041. CDockBar* pDockBar = m_pDockBar;
  1042. CMiniDockFrameWnd* pDockFrame = (CMiniDockFrameWnd*)pDockBar->GetParent();
  1043. pDockFrame->GetWindowRect(rc1);
  1044. if(point.y<0)
  1045. rc1.top+=abs(point.y);
  1046. else
  1047. rc1.top-=point.y;
  1048. ClientToScreen(&point);
  1049. //m_sizeMinFloating.cx=rc1.Width();
  1050. //GetDockingFrame()->FloatControlBar(this,rc1.TopLeft());
  1051. pDockFrame->SetWindowPos(reinterpret_cast<CWnd*>(HWND_TOP),rc1.left,point.y, rc1.Width(),rc1.Height(),NULL);
  1052. }
  1053. return;
  1054. }
  1055. if (!m_bAutoHide)
  1056. SetEqualWidth();
  1057. }
  1058. if(!m_bAutoHide)
  1059. m_pDockSite->RecalcLayout();
  1060. }
  1061. //ajusta las ventanas a redimencionarlas verticalmente
  1062. //se decrementa las anteriores ventanas a la actual y se
  1063. //incrementan las posteriores.
  1064. void CGuiControlBar::AjustReDinSize(CPoint point)
  1065. {
  1066. int nFirstPos=GetFirstPos();
  1067. int nLastPos=GetLastPos();
  1068. int m_ThisPos=m_pDockBar->FindBar(this);
  1069. ClientToScreen(&point);
  1070. //si la diferencia es negativa esta barra crece la anterior a esta disminuye
  1071. int nDif=0;
  1072. BOOL bGrow=FALSE;
  1073. if (IsVert())
  1074. {
  1075.  nDif=m_ptStartPos.y- point.y;
  1076.  if (nDif > 0)
  1077. bGrow=TRUE;
  1078.  if (bGrow)
  1079.                 m_sizeVert.cy+=abs(nDif)+4;
  1080.  else
  1081. m_sizeVert.cy-=abs(nDif);
  1082.    if (nFirstPos == m_ThisPos)
  1083. return;
  1084. }
  1085. else
  1086. {
  1087.  nDif=m_ptStartPos.x- point.x;
  1088.  if (nDif < 0)
  1089. bGrow=TRUE;
  1090.  if (bGrow)
  1091. m_sizeHorz.cx+=abs(nDif);
  1092. else
  1093. m_sizeHorz.cx-=abs(nDif);
  1094.          if (nLastPos == m_ThisPos)
  1095. return;
  1096. }
  1097. if (IsVert())
  1098. AjustVert(bGrow,nDif);
  1099. else
  1100. AjustHorz(bGrow,nDif);
  1101. RecalWindowPos();
  1102. }
  1103. void CGuiControlBar::AjustVert(BOOL bGrow,int nDif)
  1104. {
  1105. int nFirstPos=GetFirstPos();
  1106. int nLastPos=GetLastPos();
  1107. int m_ThisPos=m_pDockBar->FindBar(this);
  1108. if(m_SideMove==HTTOP)
  1109. {
  1110. //Esta ventana crece las anteriores reducen su tama駉
  1111. if (bGrow)
  1112. {
  1113. for (int i=m_ThisPos-1; i > 0; i--)
  1114. {
  1115. CGuiControlBar* pBar = GetGuiControlBar(i);
  1116. if (pBar== NULL) return;
  1117. if(IsVert())
  1118. {
  1119. if (pBar->m_sizeVert.cy-abs(nDif) < pBar->m_sizeMinV.cy)
  1120. {
  1121. pBar->m_sizeVert.cy=pBar->m_sizeMinV.cy;
  1122. continue;
  1123. }
  1124. else
  1125. {
  1126. pBar->m_sizeVert.cy-=abs(nDif);
  1127. break;
  1128. }
  1129. }
  1130. }//for
  1131. }//bGrow
  1132. else //este disminuye la anterior crece
  1133. {
  1134. if (m_ThisPos-1 > 0)
  1135. {
  1136. CGuiControlBar* pBar = GetGuiControlBar(m_ThisPos-1);
  1137. if (pBar== NULL) return;
  1138. pBar->m_sizeVert.cy+=abs(nDif);
  1139. if(m_sizeVert.cy > m_sizeMinV.cy)
  1140. return;
  1141. else
  1142.   pBar->m_sizeVert.cy-=m_sizeMinV.cy;
  1143. }
  1144. for (int i=m_ThisPos+1; i >= m_Last; i++)
  1145. {
  1146. CGuiControlBar* pBar = GetGuiControlBar(i);
  1147. if (pBar== NULL) return;
  1148. if(IsVert())
  1149. {
  1150. if (pBar->m_sizeVert.cy-abs(nDif) < pBar->m_sizeMinV.cy)
  1151. continue;
  1152. else
  1153. {
  1154. pBar->m_sizeVert.cy-=abs(nDif);
  1155. return;
  1156. }
  1157. }
  1158. }//for
  1159. }
  1160. }
  1161. }
  1162. void CGuiControlBar::AjustHorz(BOOL bGrow,int nDif)
  1163. {
  1164. int nFirstPos=GetFirstPos();
  1165. int nLastPos=GetLastPos();
  1166. int m_ThisPos=m_pDockBar->FindBar(this);
  1167. if(m_SideMove==HTRIGHT)
  1168. {
  1169. //Esta ventana crece las anteriores reducen su tama駉
  1170. if (bGrow)
  1171. {
  1172. for (int i=m_ThisPos+1; i <= nLastPos; i++)
  1173. {
  1174. CGuiControlBar* pBar = GetGuiControlBar(i);
  1175. if (pBar== NULL) return;
  1176. if(IsHorz())
  1177. {
  1178. if (pBar->m_sizeHorz.cx-abs(nDif) < pBar->m_sizeMinH.cx)
  1179. {
  1180. pBar->m_sizeHorz.cx=pBar->m_sizeMinH.cx;
  1181. continue;
  1182. }
  1183. else
  1184. {
  1185. pBar->m_sizeHorz.cx-=abs(nDif);
  1186. break;
  1187. }
  1188. }
  1189. }//for
  1190. }//bGrow
  1191. else //este disminuye la anterior crece
  1192. {
  1193.    if (m_ThisPos+1 <= m_Last)
  1194. {
  1195. CGuiControlBar* pBar = GetGuiControlBar(m_ThisPos+1);
  1196. if (pBar== NULL) return;
  1197. pBar->m_sizeHorz.cx+=abs(nDif);
  1198. if(m_sizeHorz.cx > m_sizeMinH.cx)
  1199. return;
  1200. else
  1201.   pBar->m_sizeHorz.cx+=abs(nDif);
  1202. }
  1203. for (int i=m_ThisPos-1; i >0; i--)
  1204. {
  1205. CGuiControlBar* pBar = GetGuiControlBar(i);
  1206. if (pBar== NULL) return;
  1207. if(IsHorz())
  1208. {
  1209. if (pBar->m_sizeHorz.cx-abs(nDif) < pBar->m_sizeMinH.cx)
  1210. continue;
  1211. else
  1212. {
  1213. pBar->m_sizeHorz.cx-=abs(nDif);
  1214. return;
  1215. }
  1216. }
  1217. }//for
  1218. }
  1219. }
  1220. }
  1221. //----------------------------------------------------
  1222. //OnActiveWindow retira o asigna el foco a la ventana
  1223. void CGuiControlBar::OnActiveWindow()
  1224. {
  1225. POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition();
  1226. while (pos != NULL)
  1227. {
  1228. CDockBar* pDockBar = (CDockBar*)m_pDockSite->m_listControlBars.GetNext(pos);
  1229. if (pDockBar->IsDockBar() && pDockBar->IsWindowVisible() &&
  1230. (!pDockBar->m_bFloating || m_bAutoHide))
  1231. {
  1232. int nNumBars=(int)pDockBar->m_arrBars.GetSize();
  1233. for(int i=0; i< nNumBars;i++)
  1234. {
  1235. CGuiControlBar* pBar = (CGuiControlBar*) pDockBar->m_arrBars[i];
  1236. if (HIWORD(pBar) == NULL) continue;
  1237. if (!pBar->IsVisible()) continue;
  1238. if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) continue;
  1239. if (pBar != this)
  1240. {
  1241. pBar->m_bOldActive=FALSE;
  1242. pBar->m_bActive=FALSE;
  1243. pBar->m_bForcepaint=TRUE;
  1244. pBar->SendMessage(WM_NCPAINT);
  1245. pBar->m_bForcepaint=FALSE;
  1246. }
  1247. else
  1248. {
  1249. m_bOldActive=m_bActive;
  1250. m_bActive=TRUE;
  1251. m_bForcepaint=TRUE;
  1252. SendMessage(WM_NCPAINT);
  1253. m_bForcepaint=FALSE;
  1254. }
  1255. }
  1256. }
  1257. }
  1258. }
  1259. void CGuiControlBar::ActiveCaption()
  1260. {
  1261. CWnd* pFocus=SetFocus();
  1262. if(pFocus->GetSafeHwnd())
  1263. IsChild(pFocus);
  1264. m_bForcepaint=TRUE;
  1265. OnActiveWindow();
  1266. m_bForcepaint=FALSE;
  1267. }
  1268. void CGuiControlBar::OnNcRButtonDown(UINT nHitTest, CPoint point)
  1269. {
  1270. // TODO: Add your message handler code here and/or call default
  1271. if (m_bTracking /*|| IsFloating()*/)
  1272.         return;
  1273. // ScreenToScreen (&point);
  1274. CMenu m_menu;
  1275. if (m_MenuContext!=NULL)
  1276. {
  1277. m_menu.LoadMenu(m_MenuContext);
  1278. CMenu* m_SubMenu = m_menu.GetSubMenu(0);
  1279. m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
  1280. point.x, point.y-2, AfxGetMainWnd());
  1281. Invalidate();
  1282. UpdateWindow();
  1283. }
  1284. CWnd::OnNcLButtonDown(nHitTest, point);
  1285. }
  1286. void CGuiControlBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
  1287. {
  1288. // TODO: Add your message handler code here and/or call default
  1289. if (m_bTracking /*|| IsFloating()*/)
  1290.         return;
  1291. m_ptStartPos=point;
  1292. if( nHitTest == HTCAPTION || nHitTest == HTCLOSE || nHitTest == HTPIN)
  1293. ActiveCaption();
  1294. //---------para el boton----
  1295. if( nHitTest == HTCLOSE)
  1296. {
  1297. m_stateBtn=PRESS;
  1298. SendMessage(WM_NCPAINT);
  1299. /*SetTimer(1,100,0);
  1300. CRect rc;
  1301. CGuiMiniFrameWnd* p = new CGuiMiniFrameWnd;
  1302. if (!p->Create(this,this,CRect(100,100,300,400),
  1303. _T("Title"),300))
  1304. {
  1305. }*/
  1306. return;
  1307. }
  1308. if( nHitTest == HTPIN)
  1309. {
  1310. m_stateAHBtn=PRESS;
  1311. SendMessage(WM_NCPAINT);
  1312. /*SetTimer(1,100,0);
  1313. CRect rc;
  1314. CGuiMiniFrameWnd* p = new CGuiMiniFrameWnd;
  1315. if (!p->Create(this,this,CRect(100,100,300,400),
  1316. _T("Title"),300))
  1317. {
  1318. }*/
  1319. return;
  1320. }
  1321. //--------------------------
  1322. if (m_pDockBar != NULL )
  1323. {
  1324. if (HTCAPTION == nHitTest && !m_bAutoHide)
  1325. {
  1326. m_pDockContext->StartDrag(point);
  1327. m_sizeHorzt=m_sizeHorz;
  1328. m_sizeVertt=m_sizeVert;
  1329. }
  1330. if(!m_bTracking)
  1331. {
  1332. if(m_rcBorder.PtInRect(point))
  1333. {
  1334. m_pDockSite->LockWindowUpdate();
  1335. OnInvertTracker(m_rcBorder);
  1336. m_ptStartPos=point;
  1337. SetCapture();
  1338. SetFocus();
  1339. m_bTracking=TRUE;
  1340. m_sizeHorzt=m_sizeHorz;
  1341. m_sizeVertt=m_sizeVert;
  1342. }
  1343. }
  1344. }
  1345. //other bug fixed
  1346. // CWnd::OnNcLButtonDown(nHitTest, point);
  1347. }
  1348. void CGuiControlBar::InitAutoHide()
  1349. {
  1350. if (m_bAutoHide==TRUE)
  1351. {
  1352. m_stateBtn=NORMAL;
  1353. m_sizeMinFloatingBck=m_sizeMinFloating;
  1354. Porc=0.0;
  1355. KillTimer(1);
  1356. CGuiMDIFrame* pB=(CGuiMDIFrame*)pMf;
  1357. pB->FloatControlBar(this,CPoint(400,400));
  1358. if(IsHideRight())
  1359. {
  1360. m_nLastAlingDocking=CBRS_ALIGN_RIGHT;
  1361.   pB->m_dockHideRight.AddToolBars(this);
  1362. }
  1363. if(IsHideLeft())
  1364. {
  1365. m_nLastAlingDocking=CBRS_ALIGN_LEFT;
  1366. pB->m_dockHideLeft.AddToolBars(this);
  1367. }
  1368. if(IsHideTop())
  1369. {
  1370. m_nLastAlingDocking=CBRS_ALIGN_TOP;
  1371. pB->m_dockHideTop.AddToolBars(this);
  1372. }
  1373. if(IsHideBottom())
  1374. {
  1375. m_nLastAlingDocking=CBRS_ALIGN_BOTTOM;
  1376. pB->m_dockHideBottom.AddToolBars(this);
  1377. }
  1378. GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  1379. GetDockingFrame()->FloatControlBar(this,CPoint(400,400));
  1380. GetParent()->GetParent()->ModifyStyle(WS_CAPTION,0);
  1381. }
  1382. else
  1383. m_IsLoadDocking=FALSE;
  1384. }
  1385. void CGuiControlBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
  1386. {
  1387. // TODO: Add your message handler code here and/or call default
  1388. CRect rc;
  1389. //------------------ para el boton
  1390. CRect rcT=m_rcCloseBtn;
  1391. ClientToScreen(rcT);
  1392. point.y+=23;
  1393. point.x+=5;
  1394. if (rcT.PtInRect(point))
  1395. {
  1396. if (m_stateBtn ==PRESS)
  1397. {
  1398. m_stateBtn=NORMAL;
  1399. KillTimer(1);
  1400. if (m_bAutoHide)
  1401. {
  1402. m_bAutoHide=FALSE;
  1403. GetParent()->GetParent()->ModifyStyle(WS_CAPTION,1);
  1404. CGuiMDIFrame* pB;
  1405. CGuiFrameWnd* pB1;
  1406. BOOL isMDI=FALSE;
  1407. if (pMf->IsKindOf(RUNTIME_CLASS(CGuiMDIFrame)))
  1408. isMDI=TRUE;
  1409. if (isMDI)
  1410.  pB=(CGuiMDIFrame*)pMf;
  1411. else 
  1412.  pB1= (CGuiFrameWnd*)pMf;
  1413. if(m_nLastAlingDocking==CBRS_ALIGN_RIGHT)
  1414. {
  1415. if (isMDI)
  1416. {
  1417. pB->m_dockHideRight.DeleteToolBars(this);
  1418. pB->DockControlBar(this, AFX_IDW_DOCKBAR_RIGHT);
  1419. }
  1420. else
  1421. {
  1422. pB1->m_dockHideRight.DeleteToolBars(this);
  1423. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_RIGHT);
  1424. }
  1425. }
  1426. if(m_nLastAlingDocking==CBRS_ALIGN_LEFT)
  1427. {
  1428. if (isMDI)
  1429. {
  1430. pB->m_dockHideLeft.DeleteToolBars(this);
  1431. pB->DockControlBar(this, AFX_IDW_DOCKBAR_LEFT);
  1432. }
  1433. else
  1434. {
  1435. pB1->m_dockHideLeft.DeleteToolBars(this);
  1436. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_LEFT);
  1437. }
  1438. }
  1439. if(m_nLastAlingDocking==CBRS_ALIGN_TOP)
  1440. {
  1441. if (isMDI)
  1442. {
  1443. pB->m_dockHideTop.DeleteToolBars(this);
  1444. pB->DockControlBar(this, AFX_IDW_DOCKBAR_TOP);
  1445. }
  1446. else
  1447. {
  1448. pB1->m_dockHideTop.DeleteToolBars(this);
  1449. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_TOP);
  1450. }
  1451. }
  1452. if(m_nLastAlingDocking==CBRS_ALIGN_BOTTOM)
  1453. {
  1454. if (isMDI)
  1455. {
  1456. pB->m_dockHideBottom.DeleteToolBars(this);
  1457. pB->DockControlBar(this, AFX_IDW_DOCKBAR_BOTTOM);
  1458. }
  1459. else
  1460. {
  1461. pB1->m_dockHideBottom.DeleteToolBars(this);
  1462. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_BOTTOM);
  1463. }
  1464. }
  1465. m_nLastAlingDocking=0;
  1466. // SendMessage(WM_NCLBUTTONDBLCLK);
  1467. }
  1468. //--------------------------------------------------------------
  1469. GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  1470. }
  1471. SendMessage(WM_NCPAINT);
  1472. m_pDockSite->RecalcLayout();
  1473. return;
  1474. }
  1475. //ojo guardar el aling de la ventana
  1476. rcT=m_rcAutoHideBtn;
  1477. ClientToScreen(rcT);
  1478. if (rcT.PtInRect(point))
  1479. {
  1480. if (m_stateAHBtn ==PRESS)
  1481. {
  1482. if (m_bAutoHide)
  1483. {
  1484. CGuiMDIFrame* pB;
  1485. CGuiFrameWnd* pB1;
  1486. BOOL isMDI=FALSE;
  1487. m_bAutoHide=FALSE;
  1488. m_sizeMinFloating=m_sizeMinFloatingBck;
  1489. GetParent()->GetParent()->ModifyStyle(WS_CAPTION,1);
  1490. pB=(CGuiMDIFrame*)pMf;
  1491. if (pMf->IsKindOf(RUNTIME_CLASS(CGuiMDIFrame)))
  1492. isMDI=TRUE;
  1493. if (isMDI)
  1494.  pB=(CGuiMDIFrame*)pMf;
  1495. else 
  1496.  pB1= (CGuiFrameWnd*)pMf;
  1497. if(m_nLastAlingDocking==CBRS_ALIGN_RIGHT)
  1498. {
  1499. if (isMDI)
  1500. {
  1501. pB->m_dockHideRight.DeleteToolBars(this);
  1502. pB->DockControlBar(this, AFX_IDW_DOCKBAR_RIGHT);
  1503. }
  1504. else
  1505. {
  1506. pB1->m_dockHideRight.DeleteToolBars(this);
  1507. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_RIGHT);
  1508. }
  1509. }
  1510. if(m_nLastAlingDocking==CBRS_ALIGN_LEFT)
  1511. {
  1512. if (isMDI)
  1513. {
  1514. pB->m_dockHideLeft.DeleteToolBars(this);
  1515. pB->DockControlBar(this, AFX_IDW_DOCKBAR_LEFT);
  1516. }
  1517. else
  1518. {
  1519. pB1->m_dockHideLeft.DeleteToolBars(this);
  1520. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_LEFT);
  1521. }
  1522. }
  1523. if(m_nLastAlingDocking==CBRS_ALIGN_TOP)
  1524. {
  1525. if (isMDI)
  1526. {
  1527. pB->m_dockHideTop.DeleteToolBars(this);
  1528. pB->DockControlBar(this, AFX_IDW_DOCKBAR_TOP);
  1529. }
  1530. else
  1531. {
  1532. pB1->m_dockHideTop.DeleteToolBars(this);
  1533. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_TOP);
  1534. }
  1535. }
  1536. if(m_nLastAlingDocking==CBRS_ALIGN_BOTTOM)
  1537. {
  1538. if (isMDI)
  1539. {
  1540. pB->m_dockHideBottom.DeleteToolBars(this);
  1541. pB->DockControlBar(this, AFX_IDW_DOCKBAR_BOTTOM);
  1542. }
  1543. else
  1544. {
  1545. pB1->m_dockHideBottom.DeleteToolBars(this);
  1546. pB1->DockControlBar(this, AFX_IDW_DOCKBAR_BOTTOM);
  1547. }
  1548. }
  1549. GetDockingFrame()->ShowControlBar(this, TRUE, TRUE);
  1550. m_nLastAlingDocking=0;
  1551. // SendMessage(WM_NCLBUTTONDBLCLK);
  1552. }
  1553. else
  1554. {
  1555. m_sizeMinFloatingBck=m_sizeMinFloating;
  1556. m_stateBtn=NORMAL;
  1557. m_bAutoHide=TRUE;
  1558. Porc=0.0;
  1559. KillTimer(1);
  1560. CGuiMDIFrame* pB;
  1561. CGuiFrameWnd* pB1;
  1562. pMf=GetParentFrame();
  1563. BOOL isMDI=FALSE;
  1564. if (pMf->IsKindOf(RUNTIME_CLASS(CGuiMDIFrame)))
  1565. isMDI=TRUE;
  1566. if (isMDI)
  1567.  pB=(CGuiMDIFrame*)pMf;
  1568. else 
  1569.  pB1= (CGuiFrameWnd*)pMf;
  1570. if(IsRight())
  1571. {
  1572. m_nLastAlingDocking=CBRS_ALIGN_RIGHT;
  1573. if (isMDI)
  1574. pB->m_dockHideRight.AddToolBars(this);
  1575. else
  1576. pB1->m_dockHideRight.AddToolBars(this);
  1577. }
  1578. if(IsLeft())
  1579. {
  1580. m_nLastAlingDocking=CBRS_ALIGN_LEFT;
  1581. if (isMDI)
  1582. pB->m_dockHideLeft.AddToolBars(this);
  1583. else
  1584. pB1->m_dockHideLeft.AddToolBars(this);
  1585. }
  1586. if(IsTop())
  1587. {
  1588. m_nLastAlingDocking=CBRS_ALIGN_TOP;
  1589. if (isMDI)
  1590. pB->m_dockHideTop.AddToolBars(this);
  1591. else
  1592. pB1->m_dockHideTop.AddToolBars(this);
  1593. }
  1594. if(IsBottom())
  1595. {
  1596. m_nLastAlingDocking=CBRS_ALIGN_BOTTOM;
  1597. if (isMDI)
  1598. pB->m_dockHideBottom.AddToolBars(this);
  1599. else
  1600. pB1->m_dockHideBottom.AddToolBars(this);
  1601. }
  1602. // if (isMDI)
  1603. {
  1604. GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
  1605. GetDockingFrame()->FloatControlBar(this,CPoint(400,400));
  1606. }
  1607. /* else
  1608. {
  1609. pB1->ShowControlBar(this, FALSE, FALSE);
  1610. pB1->FloatControlBar(this,CPoint(400,400));
  1611. }*/
  1612. GetParent()->GetParent()->ModifyStyle(WS_CAPTION,0);
  1613. }
  1614. }
  1615. SendMessage(WM_NCPAINT);
  1616. m_pDockSite->RecalcLayout();
  1617. return;
  1618. }
  1619. //-------------------para el boton
  1620. m_pDockSite->RecalcLayout();
  1621. }
  1622. void CGuiControlBar::OnNcPaint()
  1623. {
  1624. // TODO: Add your message handler code here
  1625. // Do not call CControlBar::OnNcPaint() for painting messages
  1626. // Tomo la misma rutina que se desarrolla para la clase
  1627. // CGuiToolBarWnd.
  1628. CRect rcWindow;
  1629. CRect rcClient;
  1630. CWindowDC dc(this);
  1631. CDC m_dc; //contexto de dispositivo en memoria
  1632. CBitmap m_bitmap;
  1633. //la idea es tomar el area de la ventana y area  cliente , luego debemos
  1634. //igualar el area de coordenadas de ventana al cliente
  1635. GetWindowRect(&rcWindow);
  1636. GetClientRect(&rcClient);
  1637. ScreenToClient(rcWindow);
  1638.     rcClient.OffsetRect(-rcWindow.TopLeft());
  1639.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  1640. m_dc.CreateCompatibleDC(&dc);
  1641. m_bitmap.CreateCompatibleBitmap(&dc,rcWindow.Width(),rcWindow.Height());
  1642. CBitmap *m_OldBitmap=m_dc.SelectObject(&m_bitmap);
  1643. //aqui debe utilizarse la brocha que define GuiDrawLayer, si no hacemos la siguiente
  1644. //linea usted vera un horrible color negro, a cambio del dibujo.
  1645. CBrush cb;
  1646. cb.CreateSolidBrush(m_clrFondo);
  1647. m_dc.FillRect(rcWindow, &cb);
  1648. DrawGripper(&m_dc,&rcWindow);
  1649. dc.IntersectClipRect(rcWindow);
  1650.     dc.ExcludeClipRect(rcClient);//asi evitamos el parpadeo
  1651. dc.BitBlt(rcWindow.left,rcWindow.top,rcWindow.Width(),rcWindow.Height(),&m_dc,0,0,SRCCOPY);
  1652. //ReleaseDC(&dc);  //TODO--PAUL
  1653. //::ReleaseDC(m_hWnd, dc.Detach());
  1654. m_dc.SelectObject(m_OldBitmap);
  1655. m_bitmap.DeleteObject();
  1656. m_dc.DeleteDC();
  1657. }
  1658. void CGuiControlBar::DrawGripper(CDC* pDC,CRect* rc)
  1659. {
  1660. CRect gripper = rc;
  1661. gripper.top =3;
  1662. gripper.left+=4;
  1663. if (IsVert())
  1664. gripper.right-=!IsFloating()?!IsRight()?6:3:2;
  1665. else
  1666. gripper.right-=3;
  1667. if(m_StyleDisplay == GUISTYLE_XP)
  1668. gripper.bottom =gripper.top +nGapGripper-3;
  1669. if(m_StyleDisplay == GUISTYLE_2003)
  1670. gripper.bottom =gripper.top +nGapGripper+1;
  1671. //si la ventana esta activa pintamos el caption o el area del titulo de color azul
  1672. if (m_bAutoHide)
  1673. m_bActive=FALSE;
  1674. else if (IsFloating() )
  1675. m_bActive=TRUE;
  1676. if(!m_bActive)
  1677. {
  1678. if (m_StyleDisplay == GUISTYLE_2003)
  1679. {
  1680. CGradient M(CSize(gripper.Width(),gripper.Height()));
  1681. M.PrepareVertical(pDC,m_StyleDisplay);
  1682. M.Draw(pDC,4,0,0,0,gripper.Width(),gripper.Height(),SRCCOPY);
  1683. }
  1684. if (m_StyleDisplay == GUISTYLE_XP)
  1685. {
  1686. CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW));
  1687. CPen* cpold=pDC->SelectObject(&cp);
  1688. //linea superior
  1689. pDC->MoveTo(gripper.left+1,gripper.top);
  1690. pDC->LineTo(gripper.right,gripper.top);
  1691. //linea izquierda
  1692. pDC->MoveTo(gripper.left,gripper.top+1);
  1693. pDC->LineTo(gripper.left,gripper.bottom);
  1694. //linea inferior
  1695. pDC->MoveTo(gripper.left+1,gripper.bottom);
  1696. pDC->LineTo(gripper.right,gripper.bottom);
  1697. //linea derecha
  1698. pDC->MoveTo(gripper.right,gripper.top+1);
  1699. pDC->LineTo(gripper.right,gripper.bottom);
  1700. pDC->SelectObject(cpold);
  1701. }
  1702. }
  1703. else
  1704. {
  1705. if (m_StyleDisplay == GUISTYLE_XP)
  1706. {
  1707. CBrush cb;
  1708. cb.CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION));//GuiDrawLayer::GetRGBCaptionXP());
  1709. pDC->FillRect(gripper,&cb);
  1710. cb.DeleteObject();
  1711. }
  1712. if (m_StyleDisplay == GUISTYLE_2003)
  1713. {
  1714. CGradient M(CSize(gripper.Width(),gripper.Height()));
  1715. M.PrepareCaption(pDC,m_StyleDisplay);
  1716. M.Draw(pDC,4,0,0,0,gripper.Width(),gripper.Height(),SRCCOPY);
  1717. }
  1718. }
  1719. if(m_StyleDisplay == GUISTYLE_2003) //no es XP
  1720. {
  1721. CRect rcWin=gripper;
  1722. //rcWin.left= gripper.left;
  1723. rcWin.top+=5;
  1724. rcWin.left+=5;
  1725. rcWin.right=rcWin.left+2;
  1726. rcWin.bottom-=4;
  1727. CRect rcBlack;
  1728. for (int i=0; i < rcWin.Height(); i+=4)
  1729. {
  1730. CRect rcWindow;
  1731. CBrush cb;
  1732. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNHIGHLIGHT));
  1733. rcWindow=rcWin;
  1734. rcWindow.top=rcWin.top+i;
  1735. rcWindow.bottom=rcWindow.top+2;
  1736. pDC->FillRect(rcWindow,&cb);
  1737. rcBlack=rcWindow;
  1738. rcBlack.left-=1;
  1739. rcBlack.top=(rcWin.top+i)-1;
  1740. rcBlack.bottom=rcBlack.top+2;
  1741. rcBlack.right=rcBlack.left+2;
  1742. cb.DeleteObject();
  1743. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));
  1744. pDC->FillRect(rcBlack,&cb);
  1745. }
  1746. }
  1747. gripper.DeflateRect(1, 1);
  1748. CString m_caption;
  1749. GetWindowText(m_caption);
  1750. CFont m_cfont;
  1751. m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,_T("Verdana"));
  1752. CFont* m_fontOld=pDC->SelectObject(&m_cfont);
  1753. int nMode = pDC->SetBkMode(TRANSPARENT);
  1754. CString m_cadBreak=m_caption;
  1755. CSize SizeCad=pDC->GetTextExtent(m_cadBreak,m_cadBreak.GetLength());
  1756. CRect rCText=gripper;
  1757. rCText.top=6;
  1758. rCText.bottom =rCText.top+14;
  1759. int cont=m_cadBreak.GetLength();
  1760. if (SizeCad.cx > (gripper.Width()-30))
  1761. {
  1762. while(cont > 1 )
  1763. {
  1764. CString m_scadtemp=m_cadBreak+"...";
  1765. CSize coor=pDC->GetTextExtent(m_scadtemp,m_scadtemp.GetLength());
  1766. if(coor.cx > (gripper.Width()-30))
  1767. {
  1768. m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1);
  1769. }
  1770. else
  1771. break;
  1772. cont--;
  1773. }
  1774. m_cadBreak+=_T("...");
  1775. }
  1776. if (gripper.Width() > 0 )
  1777. if (!m_bActive)
  1778. pDC->TextOut(rCText.left+8,rCText.top,m_cadBreak);
  1779. else
  1780. {
  1781. if (GuiDrawLayer::m_Style == GUISTYLE_XP)
  1782. pDC->SetTextColor(RGB(255,255,255));
  1783. pDC->TextOut(rCText.left+8,rCText.top,m_cadBreak);
  1784. }
  1785. //CRect gripper;
  1786. //------------------------------------------------
  1787. GetWindowRect( gripper );
  1788. ScreenToClient( gripper );
  1789. gripper.OffsetRect( -gripper.left, -gripper.top );
  1790. gripper.left=gripper.right-20;
  1791. gripper.right-=7;
  1792. gripper.top+=6;
  1793. gripper.bottom=gripper.top+13;
  1794. m_rcAutoHideBtn=gripper;
  1795. m_rcAutoHideBtn.right-=14;
  1796. m_rcAutoHideBtn.left-=14;
  1797. m_rcCloseBtn=gripper;
  1798. //m_rcCloseBtn.left-=4;
  1799. //ClientToScreen(m_rcCloseBtn);
  1800. if(!m_bAutoHide)
  1801. m_AutoHideBtn.SetData(12,_T("Auto Hide"));
  1802. else
  1803. m_AutoHideBtn.SetData(14,_T("Auto Hide"));
  1804. m_CloseBtn.Paint(pDC,m_stateBtn,gripper,NULL_BRUSH,m_bActive && GuiDrawLayer::m_Style != GUISTYLE_2003);
  1805. m_AutoHideBtn.Paint(pDC,m_stateAHBtn,m_rcAutoHideBtn,NULL_BRUSH,m_bActive && GuiDrawLayer::m_Style != GUISTYLE_2003);
  1806. //------------------------------------------------
  1807.   pDC->SetBkMode(nMode);
  1808. pDC->SelectObject(m_fontOld);
  1809. }
  1810. //en esta funci髇 se calcula el area cliente que podra ser utilizado
  1811. //por ventanas que deriven esta clase.
  1812. void CGuiControlBar::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
  1813. {
  1814. // adjust non-client area for border space
  1815. lpncsp->rgrc[0].left +=!IsFloating() || m_bAutoHide ?5:2;
  1816. lpncsp->rgrc[0].top +=!IsFloating() || m_bAutoHide ?nGapGripper+3:3;
  1817. if (IsVert())
  1818. lpncsp->rgrc[0].right -=!IsFloating() || m_bAutoHide?!IsRight()?5:2:2;
  1819. else
  1820. lpncsp->rgrc[0].right -=3;
  1821. lpncsp->rgrc[0].bottom -=!IsFloating()||m_bAutoHide?3:2;
  1822. }
  1823. //Aqui la idea es verificar que si se da clic sobre otra ventana de este tipo
  1824. //automaticamente emita un mensaje eliminando el caption que la identifica como
  1825. //ventana default.
  1826. void CGuiControlBar::OnWindowPosChanged(WINDOWPOS* lpwndpos)
  1827. {
  1828. CRect rc;
  1829. GetClientRect(rc);
  1830. nDockBarAling = GetParent()->GetDlgCtrlID();
  1831. if(!IsFloating())
  1832. m_nLastAlingDockingBck=nDockBarAling;
  1833. //envie un recalculo del area cliente solo si el tama駉 ha sido
  1834. //cambiado, de lo contrario permanezca igual
  1835. lpwndpos->flags |= SWP_FRAMECHANGED;
  1836. CControlBar::OnWindowPosChanged(lpwndpos);
  1837. CWnd* pWnd = GetWindow(GW_CHILD);
  1838. if (!m_bSupportMultiView)
  1839. {
  1840.         if (pWnd != NULL)
  1841.         {
  1842.             pWnd->MoveWindow(rc);
  1843. ASSERT(pWnd->GetWindow(GW_HWNDNEXT) == NULL);
  1844. }
  1845. }
  1846. else
  1847. {
  1848. while (pWnd != NULL)
  1849.         {
  1850.             if (pWnd->IsWindowVisible())
  1851. {
  1852. pWnd->MoveWindow(rc);
  1853. break;
  1854. }
  1855.             pWnd=pWnd->GetWindow(GW_HWNDNEXT);
  1856. }
  1857. }
  1858. }
  1859. //este conjunto de clases nos indican el estado de la ventana
  1860. //en un momento determinado
  1861. BOOL CGuiControlBar::IsHideVert()
  1862. {
  1863. if (m_nLastAlingDocking ==CBRS_ALIGN_LEFT || m_nLastAlingDocking == CBRS_ALIGN_RIGHT)
  1864. return TRUE;
  1865. return FALSE;
  1866. }
  1867. BOOL CGuiControlBar::IsHideLeft()
  1868. {
  1869. if (m_nLastAlingDocking ==CBRS_ALIGN_LEFT) return TRUE;
  1870. return FALSE;
  1871. }
  1872. BOOL CGuiControlBar::IsHideRight()
  1873. {
  1874. if (m_nLastAlingDocking == CBRS_ALIGN_RIGHT) return TRUE;
  1875. return FALSE;
  1876. }
  1877. BOOL CGuiControlBar::IsHideTop()
  1878. {
  1879. if (m_nLastAlingDocking == CBRS_ALIGN_TOP) return TRUE;
  1880. return FALSE;
  1881. }
  1882. BOOL CGuiControlBar::IsHideBottom()
  1883. {
  1884. if (m_nLastAlingDocking == CBRS_ALIGN_BOTTOM) return TRUE;
  1885. return FALSE;
  1886. }
  1887. BOOL CGuiControlBar::IsLeft()
  1888. {
  1889. if (nDockBarAling == AFX_IDW_DOCKBAR_LEFT) return TRUE;
  1890. return FALSE;
  1891. }
  1892. BOOL CGuiControlBar::IsRight()
  1893. {
  1894. if (nDockBarAling == AFX_IDW_DOCKBAR_RIGHT) return TRUE;
  1895. return FALSE;
  1896. }
  1897. BOOL CGuiControlBar::IsTop()
  1898. {
  1899. if (nDockBarAling == AFX_IDW_DOCKBAR_TOP) return TRUE;
  1900. return FALSE;
  1901. }
  1902. BOOL CGuiControlBar::IsBottom()
  1903. {
  1904. if (nDockBarAling == AFX_IDW_DOCKBAR_BOTTOM) return TRUE;
  1905. return FALSE;
  1906. }
  1907. BOOL CGuiControlBar::IsVert()
  1908. {
  1909. if (IsLeft() || IsRight()) return TRUE;
  1910. return FALSE;
  1911. }
  1912. BOOL CGuiControlBar::IsHorz()
  1913. {
  1914. if (IsTop() || IsBottom()) return TRUE;
  1915. return FALSE;
  1916. }
  1917. BOOL CGuiControlBar::IsFloating()
  1918. {
  1919. if (nDockBarAling == AFX_IDW_DOCKBAR_FLOAT) return TRUE;
  1920. return FALSE;
  1921. }
  1922. void CGuiControlBar::OnPaint()
  1923. {
  1924. CPaintDC dc(this); // device context for painting
  1925. m_pDockSite->RecalcLayout();//si quita esto se tiene problemas
  1926. // TODO: Add your message handler code here
  1927. // Do not call CControlBar::OnPaint() for painting messages
  1928. }
  1929. UINT CGuiControlBar::OnNcHitTest(CPoint point)
  1930. {
  1931. // TODO: Add your message handler code here and/or call default
  1932. CRect rcWindow;
  1933. //no se convierte las coordenadas de pantalla porque el punto
  1934. //entregado por esta funci髇 esta dado en el mismo sentido.
  1935. GetWindowRect(rcWindow);
  1936. int it=0;
  1937. // if (IsFloating())
  1938. //        return CControlBar::OnNcHitTest(point);
  1939. CRect rcT=m_rcCloseBtn;
  1940. ClientToScreen(rcT);
  1941. CPoint pt=point;
  1942. pt.y+=23;
  1943. pt.x+=5;
  1944. //pt.Offset(-rcT.left,-rcT.top);
  1945. if (rcT.PtInRect(pt))
  1946. return HTCLOSE;
  1947. rcT=m_rcAutoHideBtn;
  1948. ClientToScreen(rcT);
  1949. pt=point;
  1950. pt.y+=23;
  1951. pt.x+=5;
  1952. if (rcT.PtInRect(pt))
  1953. return HTPIN;
  1954. CRect rcTemp;
  1955. for (int i=0; i< 4; i++)
  1956. {
  1957. rcTemp=rcWindow;
  1958. if (i== 0) //left
  1959. {
  1960. it= rcTemp.left;
  1961. it+=4;
  1962. rcTemp.right=it;
  1963. m_rcBorder=rcTemp;
  1964. if (rcTemp.PtInRect(point))
  1965. if(IsLegal(HTLEFT)) return m_SideMove=HTLEFT;
  1966. }
  1967. if (i==1)  //top
  1968. {
  1969. it= rcTemp.top;
  1970. it+=4;
  1971. rcTemp.bottom=it;
  1972. m_rcBorder=rcTemp;
  1973. if (rcTemp.PtInRect(point))
  1974.  if(IsLegal(HTTOP)) return m_SideMove=HTTOP ;
  1975. }
  1976. if (i==2)  //right
  1977. {
  1978. it= rcTemp.right;
  1979. it-=4;
  1980. rcTemp.left=it;
  1981. m_rcBorder=rcTemp;
  1982. if (rcTemp.PtInRect(point))
  1983. if (IsLegal(HTRIGHT)) return m_SideMove=HTRIGHT;
  1984. }
  1985. if (i==3)  //bottom
  1986. {
  1987. it= rcTemp.bottom;
  1988. it-=4;
  1989. rcTemp.top=it;
  1990. m_rcBorder=rcTemp;
  1991. if (rcTemp.PtInRect(point))
  1992. if (IsLegal(HTBOTTOM))return m_SideMove=HTBOTTOM;
  1993. }
  1994. }
  1995. it=0;
  1996. rcTemp=rcWindow;
  1997. it= rcTemp.top+nGapGripper;
  1998. rcTemp.bottom=it;
  1999. if (rcTemp.PtInRect(point))
  2000. {
  2001. SetCursor(::LoadCursor(NULL,IDC_ARROW));
  2002. return m_SideMove=HTCAPTION;
  2003. }
  2004. return CControlBar::OnNcHitTest(point);
  2005. }
  2006. //-----------------------------------------------------------
  2007. //aqui se verifica que las coordenadas de cambio de tama駉
  2008. //sean las correctas
  2009. BOOL CGuiControlBar::IsLegal(UINT uAlin)
  2010. {
  2011. m_First=GetFirstPos();
  2012. // if (IsFloating()) return FALSE;
  2013. switch(uAlin)
  2014. {
  2015. case HTLEFT:
  2016. if(!m_bAutoHide)
  2017. {
  2018. if (IsHorz() && m_pos >0 && (m_pos != m_Last && m_pos != m_First)) return TRUE;
  2019. if (IsVert() && m_pos <= m_Last && IsRight() ) return TRUE;
  2020. }
  2021. else
  2022. {
  2023. if (!IsHideVert() && m_pos >0 && (m_pos != m_Last && m_pos != m_First)) return TRUE;
  2024. if (IsHideVert() && m_pos <= m_Last && IsHideRight() ) return TRUE;
  2025. }
  2026. return FALSE;
  2027. break;
  2028. case HTTOP:
  2029. if(!m_bAutoHide)
  2030. {
  2031. if (m_pos != m_First && IsVert()) return TRUE;
  2032. if (IsHorz() && m_pos <= m_Last && IsBottom() ) return TRUE;
  2033. }
  2034. else
  2035. {
  2036. if (m_pos != m_First && IsHideVert()) return TRUE;
  2037. if (!IsHideVert() && m_pos <= m_Last && IsHideBottom() ) return TRUE;
  2038. }
  2039. return FALSE;
  2040. break;
  2041. case HTRIGHT:
  2042. if(!m_bAutoHide)
  2043. {
  2044. if (m_pos <= m_Last && IsVert() && IsLeft() ) return TRUE;
  2045. if (IsHorz() && m_pos >0 &&  m_pos != m_Last) return TRUE;
  2046. }
  2047. else
  2048. {
  2049. if (m_pos <= m_Last && IsHideVert() && IsHideLeft() ) return TRUE;
  2050. if (!IsHideVert() && m_pos >0 &&  m_pos != m_Last) return TRUE;
  2051. }
  2052. return FALSE;
  2053. case HTBOTTOM:
  2054. if(!m_bAutoHide)
  2055. {
  2056. if ((m_pos != m_Last && m_pos != m_First) && IsHorz() && IsBottom()) return TRUE;
  2057. if (m_pos <= m_Last && IsHorz() && IsTop()) return TRUE;
  2058. }
  2059. else
  2060. {
  2061. if ((m_pos != m_Last && m_pos != m_First) && !IsHideVert() && IsHideBottom()) return TRUE;
  2062. if (m_pos <= m_Last && !IsHideVert() && IsHideTop()) return TRUE;
  2063. }
  2064. //if (IsVert() && m_pos >0 ) return TRUE;
  2065. return FALSE;
  2066. break;
  2067. }
  2068. return FALSE;
  2069. }
  2070. //----------------------------------------------
  2071. //debemos obtener cuantas barras existen en esta columnas
  2072. //porque si intentamos obtener el conteo con la funciones de dockbar
  2073. //siempre obtendremos nuestra actual barra mas otra de otra fila, por lo que
  2074. //el conteo es incorrecto, luego despues de nuestra barra la siguiente nula
  2075. //es el final de esta fila.
  2076. int CGuiControlBar::GetLastPos()
  2077. {
  2078. int nNumBars=(int)m_pDockBar->m_arrBars.GetSize();
  2079. int m_pos=m_pDockBar->FindBar(this);
  2080. for(int i=m_pos+1; i< nNumBars;i++)
  2081. {
  2082. if (m_pDockBar->m_arrBars[i]== NULL)
  2083.     return i-1;
  2084. }
  2085. return -1;
  2086. }
  2087. //--------------------------------------------
  2088. //esta rutina funciona algo parecido a la anterior
  2089. //con la diferencia que ahora se parte desde la posicion
  2090. //que indetifica m_pos hacia atraz hasta encontrar el nulo
  2091. int CGuiControlBar::GetFirstPos()
  2092. {
  2093. int m_pos=m_pDockBar->FindBar(this);
  2094. for(int i=m_pos; i>=0;i--)
  2095. {
  2096. if (m_pDockBar->m_arrBars[i]== NULL)
  2097.     return i+1;
  2098. }
  2099. return -1;
  2100. }
  2101. //------------------------------------------------------------------------
  2102. BOOL CGuiControlBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  2103. {
  2104. // TODO: Add your message handler code here and/or call default
  2105. if (IsFloating() && !m_bAutoHide) return 0;
  2106. CPoint ptCursor;
  2107. ::GetCursorPos (&ptCursor);
  2108. if(nHitTest == HTLEFT ||nHitTest == HTRIGHT)
  2109. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_HSPLITBAR));
  2110. else if(nHitTest == HTTOP ||nHitTest == HTBOTTOM)
  2111. SetCursor(AfxGetApp ()->LoadCursor (AFX_IDC_VSPLITBAR));
  2112. else
  2113. return CControlBar::OnSetCursor(pWnd, nHitTest, message);
  2114. return 1;
  2115. }
  2116. void CGuiControlBar::OnInvertTracker(const CRect& rect)
  2117. {
  2118. ASSERT_VALID(this);
  2119. ASSERT(!rect.IsRectEmpty());
  2120. CRect rcWin=GetDockRect();
  2121. CDC *pDC = m_pDockSite->GetDCEx(NULL,
  2122.         DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE);
  2123. CRect rcBar;
  2124. GetWindowRect(rcBar);
  2125. if (m_bAutoHide)
  2126. rcWin=rcBar;
  2127. if (IsVert()|| IsHideVert())  //el sentido de las barras es vertical
  2128. {
  2129. if (m_SideMove==HTLEFT || m_SideMove==HTRIGHT) //el mouse esta en el borde izquierdo o derecho
  2130. {
  2131. rcWin.OffsetRect(-rect.left,-rect.top);
  2132. rcWin.top+=10;
  2133. rcWin.left=rect.left+2;
  2134. rcWin.right=rect.right+2;
  2135. }
  2136. else  //el mouse esta el borde de arriba pero de una barra vertical
  2137. {
  2138. rcBar.OffsetRect(-rect.TopLeft());
  2139. rcBar.OffsetRect(CPoint(0,9));
  2140. rcWin=rcBar;
  2141. if (IsLeft() || IsRight())   //a la izquierda
  2142. {
  2143. rcWin.top=rect.top;
  2144. rcWin.bottom=rect.bottom;
  2145. }
  2146. //
  2147. }
  2148. }
  2149. else  //el sentido de las barras es horizontal
  2150. {
  2151. if (m_SideMove==HTTOP || m_SideMove==HTBOTTOM) //el mouse esta en el borde de arriba o abajo
  2152. {
  2153. rcWin.OffsetRect(-rect.left,-rect.top);
  2154. rcWin.top=rect.top-2;
  2155. rcWin.bottom=rect.bottom;
  2156. }
  2157. else //el mouse esta en el borde derecho
  2158. {
  2159. rcBar.OffsetRect(-rect.TopLeft());
  2160. rcBar.OffsetRect(CPoint(0,8));
  2161. rcWin=rcBar;
  2162. if ((IsBottom()|| IsHideBottom()) || (IsTop()|| IsHideTop())) //abajo
  2163. {
  2164. rcWin.left=rect.left+2;
  2165. rcWin.right=rect.right+2;
  2166. }
  2167. }
  2168. }
  2169. ClientToScreen(&rcWin);
  2170. m_pDockSite->ScreenToClient(&rcWin);
  2171. // invert the brush pattern (looks just like frame window sizing)
  2172. CBrush* pBrush = CDC::GetHalftoneBrush();
  2173. HBRUSH hOldBrush = NULL;
  2174. if (pBrush != NULL)
  2175. hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
  2176. pDC->PatBlt(rcWin.left, rcWin.top, rcWin.Width(), rcWin.Height(), PATINVERT);
  2177. if (hOldBrush != NULL)
  2178. SelectObject(pDC->m_hDC, hOldBrush);
  2179. m_pDockSite->ReleaseDC(pDC);
  2180. }
  2181. /*void CGuiControlBar::OnInvertTracker(const CRect& rect)
  2182. {
  2183. ASSERT_VALID(this);
  2184. ASSERT(!rect.IsRectEmpty());
  2185. CRect rcWin=GetDockRect();
  2186. CDC *pDC = m_pDockSite->GetDCEx(NULL,
  2187.         DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE);
  2188. CRect rcBar;
  2189. GetParent()->GetWindowRect(rcBar);
  2190. if (m_bAutoHide)
  2191. rcWin=rcBar;
  2192. if (IsVert()|| IsHideVert())  //el sentido de las barras es vertical
  2193. {
  2194. if (m_SideMove==HTLEFT || m_SideMove==HTRIGHT) //el mouse esta en el borde izquierdo o derecho
  2195. {
  2196. rcWin.OffsetRect(-rect.left,-rect.top);
  2197. rcWin.top+=10;
  2198. rcWin.left=rect.left+2;
  2199. rcWin.right=rect.right+2;
  2200. }
  2201. else  //el mouse esta el borde de arriba pero de una barra vertical
  2202. {
  2203. rcBar.OffsetRect(-rect.TopLeft());
  2204. rcBar.OffsetRect(CPoint(0,9));
  2205. rcWin=rcBar;
  2206. if (IsLeft() || IsRight())   //a la izquierda
  2207. {
  2208. rcWin.top=rect.top;
  2209. rcWin.bottom=rect.bottom;
  2210. }
  2211. //
  2212. }
  2213. }
  2214. else  //el sentido de las barras es horizontal
  2215. {
  2216. if (m_SideMove==HTTOP || m_SideMove==HTBOTTOM) //el mouse esta en el borde de arriba o abajo
  2217. {
  2218. rcWin.OffsetRect(-rect.left,-rect.top);
  2219. rcWin.top=rect.top-2;
  2220. rcWin.bottom=rect.bottom-2;
  2221. }
  2222. else //el mouse esta en el borde derecho
  2223. {
  2224. rcBar.OffsetRect(-rect.TopLeft());
  2225. rcBar.OffsetRect(CPoint(0,8));
  2226. rcWin=rcBar;
  2227. if ((IsBottom()|| IsHideBottom()) || (IsTop()|| IsHideTop())) //abajo
  2228. {
  2229. rcWin.left=rect.left+2;
  2230. rcWin.right=rect.right+2;
  2231. }
  2232. }
  2233. }
  2234. ClientToScreen(&rcWin);
  2235. GetParentFrame()->ScreenToClient(&rcWin);
  2236. // invert the brush pattern (looks just like frame window sizing)
  2237. CBrush* pBrush = CDC::GetHalftoneBrush();
  2238. HBRUSH hOldBrush = NULL;
  2239. if (pBrush != NULL)
  2240. hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
  2241. pDC->PatBlt(rcWin.left, rcWin.top, rcWin.Width(), rcWin.Height(), PATINVERT);
  2242. if (hOldBrush != NULL)
  2243. SelectObject(pDC->m_hDC, hOldBrush);
  2244. m_pDockSite->ReleaseDC(pDC);
  2245. }
  2246. */
  2247. void CGuiControlBar::OnSize(UINT nType, int cx, int cy)
  2248. {
  2249. // CControlBar::OnSize(nType, cx, cy);
  2250. CWnd* pWnd = GetWindow(GW_CHILD);
  2251. if (!m_bSupportMultiView)
  2252. {
  2253.         if (pWnd != NULL)
  2254.         {
  2255.             pWnd->MoveWindow(0, 0, cx, cy);
  2256.             ASSERT(pWnd->GetWindow(GW_HWNDNEXT) == NULL);
  2257. }
  2258. }
  2259. else
  2260. {
  2261. while (pWnd != NULL)
  2262.         {
  2263.             if (pWnd->IsWindowVisible())
  2264. {
  2265. pWnd->MoveWindow(0, 0, cx, cy);
  2266. break;
  2267. }
  2268.             pWnd=pWnd->GetWindow(GW_HWNDNEXT);
  2269. }
  2270. }
  2271. // TODO: Add your message handler code here
  2272. }
  2273. void CGuiControlBar::SetColorFondo(COLORREF clrFondo)
  2274. {
  2275. m_clrFondo=clrFondo;
  2276. }
  2277. //enum State{NORMAL=0,OVER=1,PRESS=2};
  2278. void CGuiControlBar::LoadStateBar(CString sProfile)
  2279. {
  2280. CWinApp* pApp = AfxGetApp();
  2281. TCHAR szSection[256] = {0};
  2282. wsprintf(szSection, _T("%s-Bar%d"),sProfile,GetDlgCtrlID());
  2283. m_sizeHorz.cx=pApp->GetProfileInt(szSection, _T("sizeHorz.cx"),200 );
  2284. m_sizeHorz.cy=pApp->GetProfileInt(szSection, _T("sizeHorz.cy"),100 );
  2285. m_sizeVert.cx=pApp->GetProfileInt(szSection, _T("sizeVert.cx"),200 );
  2286. m_sizeVert.cy=pApp->GetProfileInt(szSection, _T("sizeVert.cy"),100 );
  2287. m_bAutoHide=pApp->GetProfileInt(szSection, _T("AutoHide"),0 );
  2288. m_nLastAlingDocking=pApp->GetProfileInt(szSection, _T("Aling"),0 );
  2289. if (m_bAutoHide)
  2290. InitAutoHide();
  2291. else
  2292. m_nLastAlingDocking=0;
  2293. }
  2294. void CGuiControlBar::SaveBar(CString sProfile)
  2295. {
  2296. CWinApp* pApp = AfxGetApp();
  2297. TCHAR szSection[256] = {0};
  2298. wsprintf(szSection, _T("%s-Bar%d"), sProfile,GetDlgCtrlID());
  2299. pApp->WriteProfileString(szSection, NULL, NULL);
  2300. pApp->WriteProfileInt(szSection, _T("sizeHorz.cx"), m_sizeHorz.cx);
  2301. pApp->WriteProfileInt(szSection, _T("sizeHorz.cy"), m_sizeHorz.cy);
  2302. pApp->WriteProfileInt(szSection, _T("sizeVert.cx"), m_sizeVert.cx);
  2303. pApp->WriteProfileInt(szSection, _T("sizeVert.cy"), m_sizeVert.cy);
  2304. pApp->WriteProfileInt(szSection, _T("AutoHide"), m_bAutoHide);
  2305. pApp->WriteProfileInt(szSection, _T("Aling"), m_nLastAlingDocking);
  2306. }
  2307. void CGuiControlBar::OnNcMouseMove(UINT nHitTest, CPoint point)
  2308. {
  2309. // TODO: Add your message handler code here and/or call default
  2310. if (nHitTest == HTCLOSE)
  2311. if (m_stateBtn != NORMAL) return;
  2312. if (nHitTest == HTPIN)
  2313. if (m_stateAHBtn != NORMAL) return;
  2314. if (nHitTest == HTCLOSE)
  2315. {
  2316. m_stateBtn=OVER;
  2317. SetTimer(1,100,0);
  2318. }
  2319. if (nHitTest == HTPIN)
  2320. {
  2321. m_stateAHBtn=OVER;
  2322. SetTimer(2,100,0);
  2323. }
  2324. SendMessage(WM_NCPAINT);
  2325. CControlBar::OnNcMouseMove(nHitTest, point);
  2326. }
  2327. void CGuiControlBar::OnNcLButtonDblClk(UINT nFlags, CPoint point)
  2328. {
  2329. if(m_pDockBar != NULL && !m_bAutoHide)
  2330. {
  2331. m_pDockContext->ToggleDocking();
  2332. m_rcOldBorder=CRect(0,0,0,0);
  2333. }
  2334. }