www.pudn.com > clking_src.rar > GuiTabPowerPoint.cpp
//-----------------------------------------------------------------------// // This is a part of the GuiLib MFC Extention. // // Autor : Francisco Campos // // (C) 2002 Francisco CamposAll 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 "guitabpowerpoint.h" #include "GuiDrawLayer.h" #include "GuiBaseTab.h" #include "resource.h" #define ID_CLOSE 6500 CGuiTabPowerPoint::CGuiTabPowerPoint(void) { bAutoAjust=TRUE; m_clrTabs=GuiDrawLayer::GetRGBColorFace(); m_bShowButton=TRUE; } CGuiTabPowerPoint::~CGuiTabPowerPoint(void) { } BEGIN_MESSAGE_MAP(CGuiTabPowerPoint, CGuiTabWnd) ON_WM_CREATE() ON_COMMAND(ID_CLOSE,OnClose) END_MESSAGE_MAP() void CGuiTabPowerPoint::Close() { } BOOL CGuiTabPowerPoint::OnCommand(WPARAM wParam, LPARAM lParam) { HWND hwnd = (HWND) lParam; if (m_ToolButton.GetSafeHwnd() == hwnd) SendMessage (WM_COMMAND,ID_CLOSE); return TRUE; } void CGuiTabPowerPoint::AjustTabs() { int m_iSizeAct=0; m_iMinValRec=4; CClientDC dc(this); GetClientRect(m_rectCliente); m_rectCliente.bottom=m_rectCliente.top+(m_sizeImag.cy+4+1); CFont* m_fontOld=dc.SelectObject(&m_cfont); for (int iCont=0; iCont< m_Numtabs;iCont++) { CGuiTab* ct=(CGuiTab*) m_pArray[iCont]; CRect m_Arect; CSize m_sChar=dc.GetTextExtent(ct->lpMsg); m_Arect.left=m_iMinValRec+1; m_iMinValRec+=m_alnTab!=ALN_TOP?m_sizeImag.cx+2+m_sChar.cx+14:m_sChar.cx+14; if(m_alnTab==ALN_BOTTOM) { m_Arect.top=m_rectCliente.bottom; m_Arect.right=m_iMinValRec; m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy; } else { m_Arect.top=m_rectCliente.top; m_Arect.right=m_iMinValRec; m_Arect.bottom=m_rectCliente.top+4+m_sizeImag.cy; } ct->rect= m_Arect; } dc.SelectObject(m_fontOld); if (bAutoAjust) { int m_NewResize=4; if (m_iMinValRec > m_rectCliente.Width()-4) { m_iSizeAct=(m_rectCliente.Width()-12)/m_Numtabs; for (int iCont=0; iCont< m_Numtabs;iCont++) { CGuiTab* ct=(CGuiTab*) m_pArray[iCont]; if (ct->uIcon != -1) { if (m_sizeImag.cx+22 > m_NewResize+m_iSizeAct) continue; } CRect m_Arect; m_Arect.left=m_NewResize; m_Arect.right=m_NewResize+m_iSizeAct; m_Arect.top=m_alnTab==ALN_TOP? m_rectCliente.top:m_rectCliente.bottom; m_Arect.bottom=m_alnTab==ALN_TOP? m_rectCliente.top+4+m_sizeImag.cy:m_rectCliente.bottom+4+m_sizeImag.cy; m_NewResize+=m_iSizeAct+1; ct->rect= m_Arect; } } } } void CGuiTabPowerPoint::Drawtabs(CDC* dc) { CBrush cb; CRect rectText; CRect rc; int nHeight=0; CBrush cbr; CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW)); CPen cpw(PS_SOLID,1,GuiDrawLayer::GetRGBColorWhite()); cbr.CreateSolidBrush(m_clrTabs); dc->FillRect(m_rectTab,&cbr); CFont* m_fontOld=dc->SelectObject(&m_cfont); CPen penShadow(PS_SOLID, 1, GuiDrawLayer::GetRGBColorShadow()); CPen* pOldPen = dc->SelectObject(&penShadow); /*Modified By SunZhenyu 2003/11/11, add the next 1 line */ if( ALN_BOTTOM != m_alnTab ) { dc->MoveTo(m_rectTab.left,m_rectTab.bottom-1); dc->LineTo(m_rectTab.right,m_rectTab.bottom-1); } int nMode = dc->SetBkMode(TRANSPARENT); int m_right=0; for ( int iCont=0; iCont< m_Numtabs;iCont++) { dc->SelectObject(&penShadow); 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]; CPoint CoorFive[6]; if (iCont-1 == m_iSelectTab ) { CBrush brushRed(GuiDrawLayer::GetRGBColorFace()); CBrush* pOldBrush = dc->SelectObject(&brushRed); CoorFive[0].x=mrt.left+(m_rectTab.Height()/4)+1; CoorFive[0].y=(mrt.bottom-m_rectTab.Height()/2)+1; CoorFive[1].x=(mrt.left)+m_rectTab.Height()/2; CoorFive[1].y=mrt.top+1; CoorFive[2].x=(mrt.right)-m_rectTab.Height()/2; CoorFive[2].y=mrt.top+1; if (iCont == m_Numtabs-1) { CoorFive[3].x=mrt.right-2; CoorFive[3].y=mrt.bottom+1; } else { CoorFive[3].x=(mrt.right)-5; CoorFive[3].y=(mrt.bottom-(m_rectTab.Height()/2))+1; } CoorFive[4].x=(mrt.right)-8; CoorFive[4].y=mrt.bottom+1; CoorFive[5].x=(mrt.left)+9; CoorFive[5].y=mrt.bottom+1; /*Modified By SunZhenyu 2003/11/11, add the next 5 line */ if( ALN_BOTTOM == m_alnTab ) { for( int k=0; k<6; k++ ) CoorFive[k].y = m_rectTab.bottom - (CoorFive[k].y-m_rectTab.top); } dc->Polygon(CoorFive,6); dc->SelectObject(pOldBrush); } else { CBrush brushRed(GuiDrawLayer::GetRGBColorXP()); CBrush* pOldBrush = dc->SelectObject(&brushRed); CoorFive[0].x=mrt.left; CoorFive[0].y=mrt.bottom+1; CoorFive[1].x=(mrt.left)+m_rectTab.Height()/2; CoorFive[1].y=mrt.top+1; CoorFive[2].x=(mrt.right)-m_rectTab.Height()/2; CoorFive[2].y=mrt.top+1; if (iCont == m_iSelectTab || iCont == m_Numtabs-1 ) { CoorFive[3].x=mrt.right-2; CoorFive[3].y=mrt.bottom+1; } else { CoorFive[3].x=(mrt.right)-5; CoorFive[3].y=(mrt.bottom-(m_rectTab.Height()/2))+1; } CoorFive[4].x=(mrt.right)-8; CoorFive[4].y=mrt.bottom+1; CoorFive[5].x=(mrt.left)+9; CoorFive[5].y=mrt.bottom+1; /*Modified By SunZhenyu 2003/11/11, add the next 5 line */ if( ALN_BOTTOM == m_alnTab ) { for( int k=0; k<6; k++ ) CoorFive[k].y = m_rectTab.bottom - (CoorFive[k].y-m_rectTab.top); } dc->Polygon(CoorFive,6); dc->SelectObject(pOldBrush); } m_right=mrt.right; if (iCont == m_iSelectTab ) { /*Modified By SunZhenyu 2003/11/11, replace the next 1 line CBrush brushRed(GuiDrawLayer::GetRGBColorWhite()); */ CBrush brushRed(m_clrSelectTabBK); CBrush* pOldBrush = dc->SelectObject(&brushRed); Coor[0].x=mrt.left; Coor[0].y=mrt.bottom; Coor[1].x=(mrt.left)+m_rectTab.Height()/2; Coor[1].y=mrt.top+1; Coor[2].x=(mrt.right)-m_rectTab.Height()/2; Coor[2].y=mrt.top+1; Coor[3].x=(mrt.right-1); Coor[3].y=mrt.bottom; /*Modified By SunZhenyu 2003/11/11, add the next 5 line */ if( ALN_BOTTOM == m_alnTab ) { for( int k=0; k<4; k++ ) Coor[k].y = m_rectTab.bottom - (Coor[k].y-m_rectTab.top); } dc->Polygon(Coor,4); dc->SelectObject(pOldBrush); /*Modified By SunZhenyu 2003/11/11, add the next 5 line */ if( ALN_BOTTOM == m_alnTab ) { dc->FillRect( CRect(mrt.left+1,mrt.top+1,mrt.right-1,mrt.top+4), &brushRed ); } else { dc->SelectObject(&cpw); dc->MoveTo(mrt.left+1,mrt.bottom); dc->LineTo(mrt.right-1,mrt.bottom); dc->MoveTo(mrt.left+1,mrt.bottom+1); dc->LineTo(mrt.right-1,mrt.bottom+1); } } // Modified By SunZhenyu // CFont* m_fontOld=dc->SelectObject(&m_cfont); dc->SetBkMode(TRANSPARENT); CRect mrtt=mrt; mrtt.top+=2; CSize m_sChar=dc->GetTextExtent(ctb->lpMsg,strlen(ctb->lpMsg)); ctb->rect=mrt; m_right-=(m_rectTab.Height()/2); if (m_sChar.cx < ctb->rect.Width()-8) { rectText=ctb->rect; /*Modified By SunZhenyu 2003/11/11, add the next 1 line */ dc->SetTextColor(iCont == m_iSelectTab ? m_clrSelectTabText : ::GetSysColor(COLOR_BTNTEXT)); dc->DrawText(ctb->lpMsg,mrtt,DT_SINGLELINE|DT_CENTER|DT_VCENTER); } else { int nDif= ctb->rect.Width()-m_sizeImag.cx; nDif/=2; if(ctb->uIcon == -1) continue; Image.Draw(dc,ctb->uIcon,CPoint(ctb->rect.left+nDif,ctb->rect.top+2),ILD_TRANSPARENT); CToolTip.SetToolRect(this,iCont+1,CRect(0,0,0,0)); } } GetClientRect(rc); CSize m_SizeBtn=m_ToolButton.GetSizeButton(); if (m_bShowButton==TRUE) { if (m_right+m_SizeBtn.cx > rc.Width()) m_ToolButton.ShowWindow(SW_HIDE); else { rc.left=rc.right-(m_SizeBtn.cx+2); rc.bottom=m_rectTab.Height()-2; m_ToolButton.MoveWindow(rc.left,rc.top+1,m_SizeBtn.cx,rc.bottom-1); m_ToolButton.ShowWindow(SW_SHOW); } } dc->SetBkMode(nMode); dc->SelectObject(m_fontOld); // Modified By SunZhenyu dc->SelectObject(pOldPen); } void CGuiTabPowerPoint::ShowButtonClose(BOOL bShowButton) { m_bShowButton=bShowButton; }; void CGuiTabPowerPoint::SetAutoAjust(BOOL bAjust) { bAutoAjust=bAjust; m_ToolButton.ShowWindow(bAutoAjust==FALSE?SW_HIDE:SW_SHOW); } void CGuiTabPowerPoint::SetColorTabs(COLORREF clrTabs) { m_clrTabs=clrTabs; } int CGuiTabPowerPoint::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CGuiTabWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_img.Create(IDB_MDIICONS,9,3,RGB(255,0,255))) { TRACE0("error imagelist"); } SetALingTabs(CGuiTabWnd::ALN_TOP); //los tabs arriba SetStyle(CGuiTabWnd::FLAT); m_ToolButton.ShowDark(FALSE); SetActualTitle(FALSE); m_ToolButton.Create(_T(""),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,CRect(0,0,0,0),this,ID_CLOSE); m_ToolButton.SetToolTip("Close"); m_ToolButton.SethIcon(m_img.ExtractIcon(2)); m_ToolButton.SetColor(GuiDrawLayer::GetRGBColorFace()); // TODO: Add your specialized creation code here return 0; }