www.pudn.com > clking_src.rar > GuiWorkTab.cpp


//-----------------------------------------------------------------------// 
// This is a part of the GuiLib MFC Extention.							 //	 
// Autor  :  Francisco Campos											 // 
// (C) 2002 Francisco Campos  All rights reserved     // 
// This code is provided "as is", with absolutely no warranty expressed  // 
// or implied. Any use is at your own risk.								 //		 
// You must obtain the author's consent before you can include this code // 
// in a software library.												 // 
// If the source code in  this file is used in any application			 // 
// then acknowledgement must be made to the author of this program		 //	 
// fcampos@tutopia.com													 // 
//-----------------------------------------------------------------------// 
 
 
 
#include "stdafx.h" 
#include "GuiWorkTab.h" 
#include "GuiBaseTab.h" 
#include "resource.h" 
#include "GuiToolButton.h" 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
#define ID_WTABSPIN		501 
#define ID_SCROLLWINDOW 502 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
#define MIN_SCROLL ::GetSystemMetrics(SM_CXHSCROLL)*2 
 
CGuiWorkTab::CGuiWorkTab() 
{ 
	SetStyle(CGuiTabWnd::SHADOW); 
	// Modified By SunZhenyu 
	if( !m_cfont.CreateStockObject( DEFAULT_GUI_FONT ) ) 
		m_cfont.CreateStockObject( ANSI_VAR_FONT ); 
	// m_cfont.CreateFont(14,0,0,0,400,0,0,0,0,1,2,1,34,"Arial"); 
	m_deplaza=0; 
	m_btndesplaza.SetRectEmpty(); 
	bIniciaArrastre=FALSE; 
	m_EnableL=FALSE; 
	m_EnableR=FALSE; 
} 
 
CGuiWorkTab::~CGuiWorkTab() 
{ 
 
} 
 
 
BEGIN_MESSAGE_MAP(CGuiWorkTab,CGuiTabWnd) 
	ON_WM_HSCROLL() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_SETCURSOR() 
	ON_WM_SYSCOLORCHANGE() 
	ON_COMMAND(ID_SPINIZ,OnSpiNiz) 
	ON_COMMAND(ID_SPINDE,OnSpiNde)	 
END_MESSAGE_MAP() 
 
 
void CGuiWorkTab::PintaSeparador(CDC* dc) 
{ 
	CRect m_rClient=m_rectTab; 
		//se pinta el boton de desplazamiento 
	if (m_btndesplaza.IsRectNull()) 
	{ 
		   /*Modified By SunZhenyu 2003/6/21 
		   m_rClient.left=m_rClient.Width()/2; 
		   */ 
		   m_rClient.left=5*m_rClient.Width()/6; 
		   m_rClient.top-=3; 
		   m_rClient.left-=5; 
		   m_rClient.right=m_rClient.left+5;	 
		   m_rClient.bottom-=1; 
		   m_btndesplaza=m_rClient; 
		   m_scroll.SetWindowPos(NULL,m_btndesplaza.right ,m_rectTab.top,m_rectTab.right-(m_rClient.left+5),m_rectTab.Height()-1,SWP_NOACTIVATE|SWP_NOCOPYBITS);	         
  		   m_scroll.Invalidate(); 
		   m_scroll.UpdateWindow(); 
		   return; 
	} 
	else 
	{ 
		CRect rcCli; 
		GetClientRect(&rcCli); 
     	if (m_btndesplaza.left+40 > rcCli.right) 
		{ 
			m_btndesplaza.left=	rcCli.right-40; 
			m_btndesplaza.right=m_btndesplaza.left+5; 
		} 
		m_btndesplaza.top=m_rectTab.top; 
		m_btndesplaza.bottom=m_rectTab.bottom; 
		m_rClient=m_btndesplaza; 
	} 
	if (!bIniciaArrastre) 
	{ 
		 
		dc->Draw3dRect(m_rClient, ::GetSysColor(BLACK_PEN), 
					  ::GetSysColor(COLOR_BTNHIGHLIGHT)); 
		m_rClient.DeflateRect(1,1); 
		dc->Draw3dRect(m_rClient, ::GetSysColor(COLOR_BTNHIGHLIGHT), 
								  ::GetSysColor(COLOR_BTNSHADOW)); 
	} 
} 
 
void CGuiWorkTab::OnSpiNiz() 
{ 
	if(m_EnableL==TRUE) 
	{ 
		 m_PresLeft=TRUE; 
		 m_PresRight=FALSE; 
		 m_deplaza+=20; 
		 CClientDC dc(this); 
		 Drawtabs(&dc); 
	} 
} 
void CGuiWorkTab::OnSpiNde() 
{ 
	if(m_EnableR==TRUE) 
	{ 
		m_PresLeft=FALSE; 
		m_PresRight=TRUE; 
		m_deplaza-=20; 	 
		CClientDC dc(this); 
		Drawtabs(&dc);	 
	} 
} 
 
// Modified By SunZhenyu, 2003/10/28, add the next function 
void CGuiWorkTab::ResetDeplaza( ) 
{ 
	m_btndesplaza.SetRectEmpty(); 
} 
 
void CGuiWorkTab::Drawtabs(CDC* dc) 
{ 
	int m_StrPos=0; 
	BOOL m_ViewAlltab=TRUE; 
	CRect m_rClient; 
	CBrush cbr; 
	CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW)); 
	int m_ianchoScroll=::GetSystemMetrics (SM_CXHSCROLL) * 2; 
	m_EnableR=TRUE; 
	m_EnableL=TRUE; 
	cbr.CreateSolidBrush(m_wd.GetRGBColorXP()); 
	GetClientRect(m_rClient); 
	CRect rectT=m_rectTab; 
	rectT.right=m_btndesplaza.left; 
	rectT.right+=4; 
	dc->FillRect(rectT,&cbr); 
	CPen *pOldPen = dc->SelectObject(&cp); 
	dc->MoveTo(m_rectTab.left,m_rectTab.top); 
	dc->LineTo(m_btndesplaza.right+1,m_rectTab.top); 
	dc->Draw3dRect(m_rClient, ::GetSysColor(COLOR_BTNSHADOW), 
				                  ::GetSysColor(COLOR_BTNHIGHLIGHT)); 
	if (!::IsWindow(m_mSpin.GetSafeHwnd())) 
	{ 
		CRect r=m_rectTab; 
		r.right=r.left+35; 
		r.top+=1; 
		r.bottom-=1; 
		if (!m_mSpin.Create(_T(""),WS_VISIBLE | WS_CHILD |SS_OWNERDRAW,  
						r, this)) 
		m_mSpin.AlingButtons(CGuiMiniTool::ALIGN_LEFT); 
		m_mSpin.SetColor(GuiDrawLayer::GetRGBColorFace()); 
		m_mSpin.SetImageList(IDB_DOCKBAR, 9,10, RGB(255,0,255)); 
		m_mSpin.AddButton(4,ID_SPINIZ,NULL,_T(""),"Left"); 
		m_mSpin.AddButton(2,ID_SPINDE,NULL,_T(""),"Right"); 
		m_mSpin.AutoSize(TRUE); 
		m_mSpin.SetBorder(CGuiMiniTool::STYLEFRAME); 
		CGuiToolButton* btn=m_mSpin.GetButton(ID_SPINIZ); 
		btn->ShowDark(FALSE); 
		btn=m_mSpin.GetButton(ID_SPINDE); 
		btn->ShowDark(FALSE); 
 
	} 
	 
	if (!::IsWindow(m_scroll.GetSafeHwnd())) 
	{ 
		m_scroll.Create(WS_VISIBLE|WS_CHILD|UDS_HORZ,m_rectTab,this,ID_SCROLLWINDOW); 
		 
	} 
	 
	CRect rcSpin; 
	m_mSpin.GetClientRect(rcSpin);m_StrPos=rcSpin.Width(); 
	if ((m_btndesplaza.left < rcSpin.right) && ! m_btndesplaza.IsRectEmpty()) 
	{ 
		m_btndesplaza.left=rcSpin.right+5; 
		m_btndesplaza.right=m_btndesplaza.left+5; 
	} 
	PintaSeparador(dc); 
	int m_Space=8; 
	int m_Pos=10; 
	int m_right=m_StrPos; 
	if (m_iMinValRec-26 > m_btndesplaza.left) //No existe suficioente espacio para los tabs 
		{ 
			m_ViewAlltab=FALSE; 
			//m_spin.EnableScrollBar(); 
			if (m_PresLeft==TRUE) 
				m_right+=m_deplaza; 
			if (m_PresRight==TRUE) 
				m_right+=m_deplaza; 
			if (m_deplaza == 0) 
			{ 
				m_EnableL=FALSE; 
				m_EnableR=TRUE; 
				;//m_spin.EnableScrollBar(ESB_DISABLE_LTUP); 
			} 
			if ((m_iMinValRec+m_deplaza)-26 <= m_btndesplaza.left) 
			{ 
				;//m_spin.EnableScrollBar(ESB_DISABLE_RTDN); 
				m_EnableR=FALSE; 
				m_EnableL=TRUE; 
			} 
		 
		} 
		else 
		{ 
			m_EnableL=FALSE; 
			m_EnableR=FALSE; 
			//m_spin.EnableScrollBar(ESB_DISABLE_BOTH); 
			m_ViewAlltab=TRUE; 
			m_deplaza=0; 
		} 
	CRect rectScroll;  
	CRgn reg;	 
	CRect rectRecorte; 
	rectRecorte.left=m_rectTab.left+m_ianchoScroll; 
	rectRecorte.top=m_rectTab.top; 
	rectRecorte.bottom=m_rectTab.bottom; 
	rectRecorte.right=m_btndesplaza.left; 
	reg.CreateRectRgnIndirect(rectRecorte); 
	dc->SelectClipRgn(®); 
	for ( int iCont=0; iCont< m_Numtabs;iCont++) 
	{	 
 
		//; 
		CGuiTab* ctb=(CGuiTab*)m_pArray[iCont]; 
		CRect mrt=ctb->rect;		 
		int ancho=mrt.Width(); 
		mrt.left=m_right; 
		mrt.right=mrt.left+ancho; 
		CPoint Coor[4]; 
			//dibujar la hoja seleccionada 
			if (iCont == 0 ) 
			{ 
 
				 
				dc->MoveTo(mrt.left,mrt.top); 
				dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
				dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
				dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
				dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
				if (m_iSelectTab ==iCont) 
					dc->LineTo(mrt.right-2,mrt.top+2); 
				else 
					dc->LineTo((mrt.right)-3,mrt.top+(m_rectTab.Height()/2)); 
				 
				m_right=mrt.right; 
				 
			} 
			else 
			{ 
				//Se dibuja la hoja siguiente a la seleccionada 
				//no se dibuja toda la diagonal y no es la ultima hoja 
				 
				if (iCont-1 == m_iSelectTab )  
				{	 
 
					 
					dc->MoveTo(mrt.left+(m_rectTab.Height()/4)+1,mrt.top+m_rectTab.Height()/2); 
					dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
					dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
					dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
					dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
					if (iCont == m_Numtabs-1) 
						dc->LineTo((mrt.right-2),mrt.top+2); 
					else 
						dc->LineTo((mrt.right)-3,mrt.top+(m_rectTab.Height()/2)); 
 
				} 
				else 
				{ 
					 
					dc->MoveTo(mrt.left,mrt.top); 
					dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
					dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1); 
					dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
					dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1); 
					if (iCont == m_iSelectTab || iCont == m_Numtabs-1 ) 
						dc->LineTo((mrt.right-2),mrt.top+2); 
					else 
						dc->LineTo((mrt.right)-3,mrt.top+3+(m_rectTab.Height()/2)); 
					 
				} 
				m_right=mrt.right; 
			} 
			if (iCont == m_iSelectTab ) 
			{ 
				 
				Coor[0].x=mrt.left; 
				Coor[0].y=mrt.top; 
				Coor[1].x=(mrt.left)+m_rectTab.Height()/2; 
				Coor[1].y=mrt.bottom-1; 
				Coor[2].x=(mrt.right)-m_rectTab.Height()/2;  
				Coor[2].y=mrt.bottom-1; 
				Coor[3].x=(mrt.right-1); 
				Coor[3].y=mrt.top+3; 
				 
				/* Modified By SunZhenyu, 2003/11/7, add the next 2 line */ 
				CBrush	brush( m_clrSelectTabBK ); 
				CBrush * pOldBrush = dc->SelectObject( &brush ); 
				dc->Polygon(Coor,4); 
				/* Modified By SunZhenyu, 2003/11/7, add the next 1 line */ 
				dc->SelectObject( pOldBrush ); 
				dc->SelectStockObject(WHITE_PEN); 
				dc->MoveTo(mrt.left+3,mrt.top+3); 
				dc->LineTo(mrt.right-1,mrt.top+3); 
				dc->MoveTo(mrt.left+2,mrt.top+2); 
				dc->LineTo(mrt.right,mrt.top+2); 
				dc->SelectObject(&cp); 
				/* Modified By SunZhenyu, 2003/11/9, add the next 1 line */ 
				dc->SetTextColor(m_clrSelectTabText); 
			} 
			else 
				/* Modified By SunZhenyu, 2003/11/9, add the next 1 line */ 
				dc->SetTextColor(::GetSysColor(COLOR_BTNTEXT)); 
 
			CFont* m_fontOld=dc->SelectObject(&m_cfont); 
			dc->SetBkMode(TRANSPARENT); 
			CRect mrtt=mrt; mrtt.top+=2; 
			dc->DrawText(ctb->lpMsg,mrtt,DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
			// Modified By SunZhenyu 
			dc->SelectObject(m_fontOld); 
			ctb->rect=mrt; 
			m_right-=(m_rectTab.Height()/2);	 
			if (!bIniciaArrastre) 
			{ 
				CRect m_rectCli; 
				GetClientRect(m_rectCli); 
				if (m_btndesplaza.left SelectClipRgn(NULL); 
		// Modified By SunZhenyu 
		dc->SelectObject(pOldPen); 
 
		m_mSpin.Invalidate(); 
		m_mSpin.UpdateWindow();	 
} 
 
 
void CGuiWorkTab::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CWnd::OnHScroll(nSBCode, nPos, pScrollBar); 
 
	/*Modified By SunZhenyu 2003/10/22, Remove the next 1 line 
	if (pScrollBar == (CScrollBar*)&m_scroll ) 
	*/ 
	{ 
		CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab]; 
		CWnd* ViewAc=ct->pParent; 
		int rangmin,rangMax; 
		ViewAc->SendMessage(WM_HSCROLL,MAKEWPARAM(nSBCode,nPos)); 
		ViewAc->GetScrollRange(SB_HORZ,&rangmin,&rangMax); 
		m_scroll.SetScrollRange(rangmin,rangMax); 
		m_scroll.SetScrollPos(ViewAc->GetScrollPos(SB_HORZ)); 
		 
		return; 
	} 
    CClientDC dc(this); 
	Drawtabs(&dc); 
	 
	 
		 
	 
} 
 
 
BOOL CGuiWorkTab::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)  
{ 
		CPoint ptCurPos; 
		GetCursorPos (&ptCurPos); 
		ScreenToClient (&ptCurPos); 
 
		if (m_btndesplaza.PtInRect (ptCurPos)) 
		{ 
			SetCursor (LoadCursor(NULL, IDC_SIZEWE)); 
			return TRUE; 
		} 
	 
	return CGuiTabWnd::OnSetCursor(pWnd, nHitTest, message); 
} 
 
void CGuiWorkTab::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (m_btndesplaza.PtInRect(point) && !bIniciaArrastre) 
		{ 
			bIniciaArrastre=TRUE;		 
			SetCapture (); 
			InvalidateRect(m_btndesplaza,TRUE); 
		} 
	 
	else	CGuiTabWnd::OnLButtonDown(nFlags, point); 
	 
} 
 
 
void CGuiWorkTab::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
		if (bIniciaArrastre==TRUE) 
		{ 
			bIniciaArrastre=FALSE; 
			int iDiferencia=m_rectTab.right-31; 
			if (point.x < m_rectTab.left+31) point.x=m_rectTab.left+31; 
			if (point.x > iDiferencia ) point.x= iDiferencia; 
			m_btndesplaza.left=point.x; 
			m_btndesplaza.right=m_btndesplaza.left+5; 
			ReleaseCapture ();	 
			Invalidate(); 
			UpdateWindow(); 
				 
		} 
		 
	 
		CGuiTabWnd::OnLButtonUp(nFlags, point); 
 
} 
 
void CGuiWorkTab::OnMouseMove(UINT nFlags, CPoint point) 
{ 
	CRect m_rectCli; 
	GetClientRect(m_rectCli); 
    if (bIniciaArrastre==TRUE) 
    { 
		int iDiferencia=m_rectCli.right-31; 
		if (point.x < m_rectTab.left+31) point.x=m_rectTab.left+31; 
		if (point.x > iDiferencia ) point.x= iDiferencia; 
		m_scroll.SetWindowPos(NULL,point.x ,m_rectTab.top,m_rectCli.right-point.x,m_rectTab.Height()-1,	SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOCOPYBITS);	         
		m_scroll.Invalidate(); 
		m_scroll.UpdateWindow(); 
		m_btndesplaza.left=point.x; 
		m_rectCli=m_btndesplaza; 
		m_rectCli.left-=5; 
		InvalidateRect(m_btndesplaza,TRUE); 
		UpdateWindow(); 
		 
	} 
	else 
		CGuiTabWnd::OnMouseMove(nFlags, point); 
} 
void CGuiWorkTab::OnSysColorChange()  
{ 
	CGuiTabWnd::OnSysColorChange(); 
 
		Invalidate (); 
		UpdateWindow (); 
}