📄 guitabwnd.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\GuiTabWnd.h"
//#include "..\header\GuiBasetab.h"
#include "..\header\guitabwnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGuiTabWnd
#define SPACE_TAB 4
#define DEFAULT_FLAT 18
CGuiTabWnd::CGuiTabWnd()
{
m_rectCliente.SetRectEmpty();
m_rectTab.SetRectEmpty();
m_ActualVar=0;
m_Numtabs=0;
m_iSelectTab=0;
m_sizeImag=CSize(15,15);
m_pArray.RemoveAll();
m_iMinValRec=0; //minimo valor requerido para mostrar toda las carpetas
m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,"MS Sans Serif");
m_style=S3D;
m_ActualTitle=TRUE;
m_alnTab=ALN_BOTTOM;
m_TypeTab=TYPE_NORMAL;
}
CGuiTabWnd::~CGuiTabWnd()
{
m_pArray.RemoveAll();
}
BEGIN_MESSAGE_MAP(CGuiTabWnd, CWnd)
//{{AFX_MSG_MAP(CGuiTabWnd)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_SYSCOLORCHANGE()
//}}AFX_MSG_MAP
ON_WM_DESTROY()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGuiTabWnd message handlers
BOOL CGuiTabWnd::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_MOUSEMOVE)
CToolTip.RelayEvent(pMsg);
return CWnd::PreTranslateMessage(pMsg);
}
//****************************************************************************
void CGuiTabWnd::OnSysColorChange( )
{
CWnd::OnSysColorChange( );
}
void CGuiTabWnd::SetTypeTab(TypeTab Type)
{
m_TypeTab=Type;
}
//****************************************************************************
BOOL CGuiTabWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
if (m_Numtabs == 0)
{
CBrush cbr;
cbr.CreateSysColorBrush(COLOR_BTNFACE);
CRect m_rect;
GetClientRect(m_rect);
pDC->FillRect(m_rect,&cbr);
}
return TRUE;
}
void CGuiTabWnd::SetActualTitle(BOOL bActual)
{
m_ActualTitle=bActual;
}
void CGuiTabWnd::SetALingTabs(AlingTab alnTab)
{
m_alnTab=alnTab;
Invalidate();
UpdateWindow();
}
void CGuiTabWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CBrush cbr;
CRect m_rectDraw;
if (m_alnTab!=ALN_TOP)
cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
else
cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());
GetClientRect(m_rectCliente);
m_rectTab=m_rectCliente;
m_rectDraw=m_rectCliente;
if (m_alnTab==ALN_BOTTOM)
m_rectDraw.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+2);
else
m_rectDraw.top=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+2);
if (m_style != S3D) //si son carpetas estilo excel o tabbed como devstudio 7
{
if (m_alnTab==ALN_BOTTOM)
{
m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);
m_rectTab.top=m_rectCliente.bottom+2;
}
else
{
m_rectTab.bottom=m_rectCliente.top+(DEFAULT_FLAT)+3;
}
}
if (m_alnTab!=ALN_TOP)
{
dc.FillRect(m_rectTab,&cbr);
dc.Draw3dRect(m_rectDraw,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
}
else
{
CRect rc=m_rectDraw;
for (int i=0; i< 2; i++)
{
dc.Draw3dRect(rc,GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorFace());
rc.DeflateRect(1,1);
}
rc.InflateRect(3,3);
dc.Draw3dRect(rc,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
rc=m_rectDraw;
rc.bottom=rc.top+3;
dc.FillRect(rc,&cbr);
}
Drawtabs(&dc);
}
BOOL CGuiTabWnd::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
// TODO: Add your specialized code here and/or call the base class
pParent= pParentWnd;
return CWnd::Create(NULL, _T(""), dwStyle, rect, pParentWnd, nID);
}
int CGuiTabWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CToolTip.Create(this,TTS_ALWAYSTIP);
CToolTip.Activate(TRUE);
CToolTip.BringWindowToTop();
// TODO: Add your specialized creation code here
return 0;
}
void CGuiTabWnd::RecalLayout()
{
GetClientRect(m_rectCliente);
if (m_style == S3D)
{
m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);
}
else
{
if (m_alnTab==ALN_BOTTOM)
m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);
else
{
m_rectCliente.top+=DEFAULT_FLAT;
m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT+4);
}
}
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
CWnd* m_tempWin= ct->pParent;
ASSERT_VALID(m_tempWin);
if (m_style == S3D)
{
m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-2),
m_rectCliente.top+(SPACE_TAB/2),m_rectCliente.right-(SPACE_TAB+1),
m_rectCliente.bottom-(SPACE_TAB+2),SWP_NOACTIVATE|
SWP_NOZORDER);
}
else
{
if (m_alnTab==ALN_BOTTOM)
{
m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),
m_rectCliente.top+1,m_rectCliente.right-2,
m_rectCliente.bottom+1,SWP_NOACTIVATE|SWP_NOZORDER);
}
else
{
if (m_TypeTab == TYPE_NORMAL)
{
m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),
m_rectCliente.top+3,m_rectCliente.right-2,
m_rectCliente.bottom,SWP_NOACTIVATE|SWP_NOZORDER);
}
}
}
}
AjustTabs();
Invalidate();
UpdateWindow();
}
void CGuiTabWnd::AjustTabs()
{
int m_iSizeAct=0;
m_iMinValRec=4;
CClientDC dc(this);
GetClientRect(m_rectCliente);
if (m_alnTab==ALN_BOTTOM)
m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);
else
m_rectCliente.bottom=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+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);
//si el espacio requerido es mayor que el disponible
//se debe proporcionar cada tab solo si es 3d
if (m_style== S3D)
{
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];
CRect m_Arect;
m_Arect.left=m_NewResize;
m_Arect.right=m_NewResize+m_iSizeAct;
m_Arect.top=m_rectCliente.bottom;
m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;
m_NewResize+=m_iSizeAct+1;
ct->rect= m_Arect;
}
}
}
}
void CGuiTabWnd::Drawtabs(CDC* dc)
{
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);
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
CPen* oldPen= dc->SelectObject(&light);
//si es la carpeta seleccionada, se debe
//eliminar las lineas oscuras de encima
if (iCont ==m_iSelectTab)
{
CBrush cbr;
CRect m_rectTabAux=ct->rect;
m_rectTabAux.DeflateRect(1,1);
m_rectTabAux.top-=4;
m_rectTabAux.bottom=m_rectTabAux.top+4;
cbr.CreateSysColorBrush(COLOR_BTNFACE);
dc->FillRect(ct->rect,&cbr);
dc->MoveTo(ct->rect.left,ct->rect.top-3);
dc->LineTo(ct->rect.left,ct->rect.bottom-1);
dc->FillRect(m_rectTabAux,&cbr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -