示例#1
0
void CWorkTab::Drawtabs(CGDI* dc)
{
	int m_StrPos      = 0;
	BOOL m_ViewAlltab = TRUE;
	CRect m_rClient;
	CBrush cbr;
	CPen cp; 
	cp.CreatePen(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);
	HPEN hPen = 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_toolBtn[0].GetSafeHwnd()))
	{
		CRect r = m_rectTab;
		r.right = r.left + 35;
		r.top += 1;
		// r.bottom-=1;
		if (!m_img.Create(IDB_GUI_DOCKBAR, 9, 11, RGB(255, 0, 255)))
		{
			//TRACE0("error imagelist");
		}
		
		m_toolBtn[0].Create(GetSafeHwnd(),SCROLLLEFT, _T(""), 
			WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, 
			CRect(0, 0, 0, 0));
		m_toolBtn[0].SetToolTip(_T("Scroll Left"));
		m_toolBtn[0].SethIcon(m_img.ExtractIcon(4));
		m_toolBtn[0].ShowDark(FALSE);
		m_toolBtn[0].SetScrollButton();
		m_toolBtn[1].Create(GetSafeHwnd(),SCROLLRIGHT, _T(""), 
			WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, 
			CRect(0, 0, 0, 0));
		m_toolBtn[1].SetToolTip(_T("Scroll Right"));
		m_toolBtn[1].SethIcon(m_img.ExtractIcon(2));
		m_toolBtn[1].ShowDark(FALSE);
		m_toolBtn[1].SetScrollButton();
	}
	
	if (!::IsWindow(m_scroll.GetSafeHwnd()))
	{
		m_scroll.Create(GetSafeHwnd(),0L,NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ, m_rectTab);
	}
	
	CSize szBtn_1 = m_toolBtn[0].GetSizeButton();
	CSize szBtn_2 = m_toolBtn[0].GetSizeButton();
	
	CRect rcSpin = CRect(0, 0, szBtn_1.cx + szBtn_2.cx + 2, szBtn_1.cy + szBtn_2.cy);
	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; 
	CRect rectRecorte;
	rectRecorte.left = m_rectTab.left + m_ianchoScroll;
	rectRecorte.top = m_rectTab.top;
	rectRecorte.bottom = m_rectTab.bottom;
	rectRecorte.right = m_btndesplaza.left;
	HRGN hRgn= CreateRectRgnIndirect(rectRecorte);
	dc->SelectClipRgn(hRgn);
	for (int iCont = 0; iCont < m_Numtabs; iCont++)
	{	
		//;
		CTab* ctb = (CTab*)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;
			dc->Polygon(Coor, 4);	
			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);
		}
		
		HFONT hFont= dc->SelectObject(CFont((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
		dc->SetBkMode(TRANSPARENT);
		CRect mrtt = mrt;
		mrtt.top += 2;
		dc->DrawText(ctb->lpMsg, mrtt, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		ctb->rect = mrt;
		m_right -= (m_rectTab.Height()/2);	
		if (!bIniciaArrastre)
		{
			CRect m_rectCli;
			GetClientRect(m_rectCli);
			if (m_btndesplaza.left <m_rectCli.left + rcSpin.left + 1)
			{
				m_btndesplaza.left = m_rectCli.left + rcSpin.left + 5;
				m_btndesplaza.right = m_btndesplaza.left + 5;
				PintaSeparador(dc);
			}
			m_scroll.SetWindowPos(NULL, 
				m_btndesplaza.right, m_rectTab.top, m_rectCli.right - (m_btndesplaza.left + 5), 
				m_rectTab.Height() - 1, SWP_NOACTIVATE | SWP_NOCOPYBITS);	        
			m_scroll.Invalidate();
			m_scroll.UpdateWindow();
			CSize szBtn = m_toolBtn[0].GetSizeButton();
			m_toolBtn[0].MoveWindow(m_rectTab.left + 1, 
				m_rectTab.top + 1, szBtn.cx, m_rectTab.Height() - 2);
			CSize szBtn1 = m_toolBtn[1].GetSizeButton();
			m_toolBtn[1].MoveWindow(m_rectTab.left + szBtn.cx + 1, m_rectTab.top + 1, 
				szBtn1.cx, m_rectTab.Height() - 2);
		}

	}

	cbr.DeleteObject();
	dc->SelectClipRgn(NULL);
	::DeleteObject(hRgn);
	cp.DeleteObject();
	m_toolBtn[0].Invalidate();
    m_toolBtn[0].UpdateWindow();	
	m_toolBtn[1].Invalidate();
    m_toolBtn[1].UpdateWindow();	
}
示例#2
0
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(&reg);
    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 <m_rectCli.left+rcSpin.left+1)
            {
                m_btndesplaza.left=m_rectCli.left+rcSpin.left+5;
                m_btndesplaza.right=m_btndesplaza.left+5;
                PintaSeparador(dc);
            }
            m_scroll.SetWindowPos(NULL,m_btndesplaza.right ,m_rectTab.top,m_rectCli.right-(m_btndesplaza.left+5),m_rectTab.Height()-1,SWP_NOACTIVATE|SWP_NOCOPYBITS);
            m_scroll.Invalidate();
            m_scroll.UpdateWindow();
            m_mSpin.SetWindowPos(NULL,m_rectTab.left,m_rectTab.top,m_ianchoScroll,m_rectTab.Height()-2,SWP_NOACTIVATE|SWP_NOZORDER);
        }

    }

    dc->SelectClipRgn(NULL);
    // Modified By SunZhenyu
    dc->SelectObject(pOldPen);

    m_mSpin.Invalidate();
    m_mSpin.UpdateWindow();
}