Exemple #1
0
void CGuiToolBarWnd::SetRealSize()
{
	CRect rcWinFrame;
	CRect rcThisBar;
	
	int nVisibles=0;
	
	int nThis = m_pDockBar->FindBar(this);
	int nFirst= GetFirstPos();
	int nLast=  GetLastPos();
	UINT m_nDockBarID = m_pDockBar->GetDlgCtrlID();
	int  nMaxlen=GetHiWid();
    int  nLen=0; 
	for (int i=nFirst;i <nLast;  i++)
	{
		
		CGuiToolBarWnd* pBar;
		pBar = (CGuiToolBarWnd*) m_pDockBar->m_arrBars[i];
		if (HIWORD(pBar) == 0) continue; 
		if (!pBar->IsVisible()) continue;
		
		CRect rc;
		pBar->GetWindowRect(rc);
		if (IsVert())
			nLen+=rc.Height() ;
		else
			nLen+= rc.Width() ;
		nVisibles++;
	}
	
	if ( nLen > nMaxlen)
	{
		int nDif=nLen-nMaxlen;
		

	}
	


/*	if (rcThisBar.Width() > nAfterThis)
	{
		if (nVisibles > 0)
			nAfterThis/=nVisibles;
		

	}
*/		
}
Exemple #2
0
//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;
}