CGuiControlBar* CGuiControlBar::GetGuiControlBar(int nPos,BOOL bAll) const { CGuiControlBar* pResult = (CGuiControlBar*)m_pDockBar->m_arrBars[nPos]; if (bAll==FALSE) { if (HIWORD(pResult) == NULL) return NULL; else if (!pResult->IsVisible()) return NULL; else if (!pResult->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) return NULL; } else { if (HIWORD(pResult) == NULL) return NULL; } return pResult; }
void CGuiControlBar::OnActiveWindow() { POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition(); while (pos != NULL) { CDockBar* pDockBar = (CDockBar*)m_pDockSite->m_listControlBars.GetNext(pos); if (pDockBar->IsDockBar() && pDockBar->IsWindowVisible() && (!pDockBar->m_bFloating )) { int nNumBars=(int)pDockBar->m_arrBars.GetSize(); for(int i=0; i< nNumBars;i++) { CGuiControlBar* pBar = (CGuiControlBar*) pDockBar->m_arrBars[i]; if (HIWORD(pBar) == NULL) continue; if (!pBar->IsVisible()) continue; if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) continue; if (pBar != this) { pBar->m_bOldActive=FALSE; pBar->m_bActive=FALSE; pBar->m_bForcepaint=TRUE; pBar->SendMessage(WM_NCPAINT); pBar->m_bForcepaint=FALSE; } else { m_bOldActive=m_bActive; m_bActive=TRUE; m_bForcepaint=TRUE; SendMessage(WM_NCPAINT); m_bForcepaint=FALSE; } } } } }
//esta funcion calcula el tamaño horizontal de la ventana,no importa si esta //docking a izquierda o derecha o arriba o abajo.Debemos disponer de un espacio equitativo entre todas //ventanas que se encuentren docking ya sea en una fila o columna. CSize CGuiControlBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz) { //la funcion original toma el ancho o alto dependiendo del sentido que nos //indica bHorz. ASSERT_VALID(this); if (IsFloating()) return m_sizeMinFloating; else { //si bStrerch es TRUE significa que esta ventana no se puede hacer //Docking if (bStretch) { if (bHorz) return CSize(32767, m_sizeHorz.cy); else return CSize(m_sizeVert.cx, 32767); } } int Len=GetHiWid(); int nWidth = GetWidthMax(); int nMinSpace=0;//minimo espacio requerido con lo tamaños normales int nMinimo=0; //minimo espacio de los tamaños minimos int nRealBars=0; int m_First=GetFirstPos(); for (int nPos = m_First; nPos <= m_Last; nPos++) { CGuiControlBar* pBar = GetGuiControlBar(nPos,TRUE); if (pBar== NULL) continue; if (!pBar->IsVisible()) continue; if (!pBar->IsKindOf(RUNTIME_CLASS(CGuiControlBar))) { CPoint pt(GetMessagePos()); m_pDockSite->FloatControlBar(pBar,pt); continue; } if(IsVert()) pBar->m_sizeVert.cx=nWidth; else pBar->m_sizeHorz.cy=nWidth; //todas se hacen con el mismo ancho nMinSpace+=IsVert() ? pBar->m_sizeVert.cy:pBar->m_sizeHorz.cx; //minimo espacio para alinear las barras nRealBars++; //cuantas barras realmente existen } //si el tamaño de las barras en la fila es mayor que //el espacio disponible, luego la solucion salomonica es //repartir el espacio entre todas. if (nRealBars == 1 ) { if (bHorz) return m_sizeHorz= CSize(Len,m_sizeHorz.cy); else return m_sizeVert=CSize(m_sizeVert.cx,Len); } int nDif=Len-nMinSpace; if (abs(nDif) !=0) { BOOL bGrow=FALSE; if (nDif > 0) bGrow=TRUE; nDif=abs(nDif); while(nDif > 0) { for (int nPos = m_First; nPos <= m_Last; nPos++) { CGuiControlBar* pBar = GetGuiControlBar(nPos); if (pBar== NULL) continue; if(IsVert()) { if(bGrow) pBar->m_sizeVert.cy+=1; else { if (pBar->m_sizeVert.cy-1 < pBar->m_sizeMinV.cy) continue; pBar->m_sizeVert.cy-=1; } } else { if(bGrow) pBar->m_sizeHorz.cx+=1; else { if (pBar->m_sizeHorz.cx-1 < pBar->m_sizeMinH.cx) continue; pBar->m_sizeHorz.cx-=1; } } nDif--; if(nDif==0) break; } } } //--reubicar las ventanas, sin esta rutina nada funciona RecalWindowPos(); if (IsHorz()) return m_sizeHorz; else return m_sizeVert; }