www.pudn.com > clking_src.rar > GuiTabbed.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 "resource.h" #include "guitabbed.h" #include "GuiBaseTab.h" #include "..\header\guitabbed.h" #define SCROLLCLOSE 0x886 #define SCROLLLEFT 0x887 #define SCROLLRIGHT 0x888 BEGIN_MESSAGE_MAP(GuiTabbedButton, CGuiNormalButton) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_TIMER() END_MESSAGE_MAP() GuiTabbedButton::GuiTabbedButton() { bPress=FALSE; } GuiTabbedButton::~GuiTabbedButton() { } void GuiTabbedButton::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (!bPress) return; bPress=FALSE; KillTimer(1); //CGuiNormalButton::OnLButtonUp(nFlags, point); } void GuiTabbedButton::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (bPress) return; bPress=TRUE; SetTimer(1,100,NULL); //CGuiNormalButton::OnLButtonDown(nFlags, point); } void GuiTabbedButton::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (!bPress) return; CRect rc; CPoint pt(GetMessagePos()); ScreenToClient(&pt); GetClientRect(rc); if (rc.PtInRect(pt)) { CWnd* pParent=GetParent(); pParent->SendMessage(WM_COMMAND,GetDlgCtrlID()); bPress=FALSE; //KillTimer(1); } else { bPress=FALSE; KillTimer(1); //CGuiNormalButton::OnTimer(nIDEvent); } } CGuiTabbed::CGuiTabbed(void) { m_nDif=0; } CGuiTabbed::~CGuiTabbed(void) { } void CGuiTabbed::Drawtabs(CDC* dc) { int m_StrPos=0; BOOL m_ViewAlltab=TRUE; CRect m_rClient; CBrush cbr; CPen light(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT)); CPen Dark(PS_SOLID,1,GetSysColor(COLOR_BTNSHADOW)); CPen Black(PS_SOLID,1,GetSysColor(BLACK_PEN)); CRect rectText; CFont* m_fontOld=dc->SelectObject(&m_cfont); // Modified By SunZhenyu CPen* pOldPen = dc->SelectObject(&light); CSize mszBtn=GetSizeButton(); int m_iSizeButton=mszBtn.cx; cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorTabs()); dc->FillRect(m_rectTab,&cbr); //dc->Draw3dRect(m_rectTab,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh()); m_rectTab.bottom+=1; CRect rectT=m_rectTab; rectT.right-=m_iSizeButton+2; int mSizeTotal=m_iMinValRec; m_toolBtn[0].EnableWindow(FALSE); m_toolBtn[1].EnableWindow(FALSE); if (mSizeTotal > m_rectTab.Width()) { m_toolBtn[1].EnableWindow(TRUE); if (m_nDif < 0) m_toolBtn[0].EnableWindow(TRUE); if((mSizeTotal-(abs(m_nDif)-20)) < m_rectTab.Width()) m_toolBtn[1].EnableWindow(FALSE); } else m_nDif=0; CRect rectScroll; CRgn reg; CRect rectRecorte; rectRecorte=rectT; reg.CreateRectRgnIndirect(rectRecorte); dc->SelectClipRgn(®); int m_right=m_nDif; 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]; //si es la carpeta seleccionada, se debe //eliminar las lineas oscuras de encima if (iCont ==m_iSelectTab) { CBrush cbr; CRect m_rectTabAux=mrt; cbr.CreateSysColorBrush(COLOR_BTNFACE); m_rectTabAux.top+=3; m_rectTabAux.bottom+=2; dc->FillRect(m_rectTabAux,&cbr); dc->SelectObject(&light); dc->MoveTo(m_rectTabAux.left,m_rectTabAux.top); dc->LineTo(m_rectTabAux.left,m_rectTabAux.bottom); //linea de arriba dc->MoveTo(m_rectTabAux.left,m_rectTabAux.top); dc->LineTo(m_rectTabAux.right,m_rectTabAux.top); //linea derecha observe que se pinta dos veces para //dar el efecto de redondeada en la puntas dc->SelectObject(&Black); dc->MoveTo(m_rectTabAux.right-1,m_rectTabAux.top+1); dc->LineTo(m_rectTabAux.right-1,m_rectTabAux.bottom); dc->SetTextColor(RGB(0,0,0)); //pDC->TextOut(rCText.left+3,rCText.top,m_caption); } else { if ((iCont+1) != m_iSelectTab) { dc->SelectObject(&Dark); dc->MoveTo(mrt.right-1,mrt.top+3); dc->LineTo(mrt.right-1,mrt.bottom+1); dc->SetTextColor(GuiDrawLayer::GetRGBColorShadow()); } } CRect m_rectTabAux= mrt; m_rectTabAux.top+=4; m_rectTabAux.left+=4; int OldMode=dc->SetBkMode(TRANSPARENT); dc->DrawText(ctb->lpMsg,m_rectTabAux,DT_SINGLELINE|DT_LEFT|DT_VCENTER); m_right=mrt.right; ctb->rect=mrt; dc->SetBkMode(OldMode); } dc->SelectClipRgn(NULL); CRect rcCli; GetClientRect(rcCli); rcCli.top=m_rectTab.top; rcCli.bottom=m_rectTab.bottom; rcCli.left=rcCli.right-(m_iSizeButton); int nacum=0; for (int i=0; i<3;i++) { CSize szBtn=m_toolBtn[i].GetSizeButton(); m_toolBtn[i].MoveWindow(rcCli.left+nacum-1,rcCli.top+2,szBtn.cx,rcCli.Height()-4); nacum+=szBtn.cx; } GetClientRect(rcCli); dc->Draw3dRect(rcCli,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow()); // Modified By SunZhenyu dc->SelectObject(m_fontOld); dc->SelectObject(pOldPen); } BEGIN_MESSAGE_MAP(CGuiTabbed, CGuiTabWnd) ON_WM_CREATE() ON_COMMAND(SCROLLLEFT,OnScrollLeft) ON_COMMAND(SCROLLRIGHT,OnScrollRight) ON_COMMAND(SCROLLCLOSE,OnScrollClose) END_MESSAGE_MAP() void CGuiTabbed::OnScrollLeft() { m_nDif+=300; CClientDC dc(this); Drawtabs(&dc); //RecalLayout(); } void CGuiTabbed::OnScrollRight() { m_nDif-=300; CClientDC dc(this); Drawtabs(&dc); //RecalLayout(); } void CGuiTabbed::OnScrollClose() { //no es nuestro problema lo debe manejar la clase derivada } int CGuiTabbed::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CGuiTabWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_img.Create(IDB_DOCKBAR,9,11,RGB(255,0,255))) { TRACE0("error imagelist"); } m_toolBtn[0].Create(_T(""),WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,CRect(0,0,0,0),this,SCROLLLEFT); m_toolBtn[0].SetStyleButton(CGuiNormalButton::STL_FLAT); m_toolBtn[0].SetToolTip("Scroll Left"); m_toolBtn[0].SethIcon(m_img.ExtractIcon(4)); m_toolBtn[0].SetColor(GuiDrawLayer::GetRGBColorTabs()); m_toolBtn[0].ShowDark(FALSE); m_toolBtn[1].Create(_T(""),WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,CRect(0,0,0,0),this,SCROLLRIGHT); m_toolBtn[1].SetStyleButton(CGuiNormalButton::STL_FLAT); m_toolBtn[1].SetToolTip("Scroll Right"); m_toolBtn[1].SethIcon(m_img.ExtractIcon(2)); m_toolBtn[1].SetColor(GuiDrawLayer::GetRGBColorTabs()); m_toolBtn[1].ShowDark(FALSE); m_toolBtn[2].Create(_T(""),WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,CRect(0,0,0,0),this,SCROLLCLOSE); m_toolBtn[2].SetStyleButton(CGuiNormalButton::STL_FLAT); m_toolBtn[2].SetToolTip("Close"); m_toolBtn[2].SethIcon(m_img.ExtractIcon(10)); m_toolBtn[2].SetColor(GuiDrawLayer::GetRGBColorTabs()); m_toolBtn[2].ShowDark(FALSE); m_toolBtn[0].EnableWindow(FALSE); m_toolBtn[1].EnableWindow(FALSE); SetALingTabs(CGuiTabWnd::ALN_TOP); //los tabs arriba SetStyle(CGuiTabWnd::SHADOW); //no debe acondicionar el tamaņo de los tabs return 0; SetTypeTab(CGuiTabWnd::TYPE_MDI); SetActualTitle(FALSE); return 0; } CSize CGuiTabbed::GetSizeButton() { CSize szresult=CSize(0,0); for (int i=0; i < 3; i++) { CSize sztemp=m_toolBtn[i].GetSizeButton(); szresult.cx+=sztemp.cx; szresult.cy+=sztemp.cy; } return szresult; }