📄 guitabbed.cpp
字号:
//-----------------------------------------------------------------------//
// This is a part of the GuiLib MFC Extention. //
// Autor : Francisco Campos //
// (C) 2002 Francisco Campos <www.beyondata.com> 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 //
// fco_campos@tutopia.com //
// version : 1.1 //
// Modified by : Francisco Campos //
//-----------------------------------------------------------------------//
#include "stdafx.h"
#include "..\header\guitabbed.h"
#include "..\header\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,50,NULL);
//CGuiNormalButton::OnLButtonDown(nFlags, point);
}
void GuiTabbedButton::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (bPress == FALSE) return;
CRect rc;
CPoint pt(GetMessagePos());
ScreenToClient(&pt);
GetClientRect(rc);
if (rc.PtInRect(pt))
{
CWnd* pParent=GetParent();
if (IsWindowEnabled())
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);
CSize mszBtn=GetSizeButton();
int m_iSizeButton=mszBtn.cx;
m_rectTab.DeflateRect(1,1);
m_rectTab.bottom+=1;
cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorTabs());
dc->FillRect(m_rectTab,&cbr);
m_rectTab.InflateRect(1,1);
//m_rectTab.bottom-=1;
//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);
m_toolBtnC.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());
m_toolBtnC.EnableWindow(TRUE);
}
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+=10;
CClientDC dc(this);
Drawtabs(&dc);
//RecalLayout();
}
void CGuiTabbed::OnScrollRight()
{
m_nDif-=10;
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_toolBtnC.Create(_T(""),WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,CRect(0,0,0,0),this,SCROLLCLOSE);
m_toolBtnC.SetStyleButton(CGuiNormalButton::STL_FLAT);
m_toolBtnC.SetToolTip("Close");
m_toolBtnC.SethIcon(m_img.ExtractIcon(10));
m_toolBtnC.SetColor(GuiDrawLayer::GetRGBColorTabs());
m_toolBtnC.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駉 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -