📄 xguitabwnd.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 //
//-----------------------------------------------------------------------//
#include "stdafx.h"
#include "xGuiTabWnd.h"
#include "GuiBasetab.h"
//#include "resource.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
#define WM_SHOWTITLE 2022
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,(LPCTSTR)"MS Sans Serif");
m_style=S3D;
m_ActualTitle=TRUE;
m_alnTab=ALN_BOTTOM;
m_TypeTab=TYPE_NORMAL;
}
CGuiTabWnd::~CGuiTabWnd()
{
}
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_SYSCOLORCHANGE()
//}}AFX_MSG_MAP
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
CRect rcClip;
dc.GetClipBox(&rcClip);
CRect rcClient;
GetClientRect(&rcClient);
CDC mdc;
mdc.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap* pOldBmp = mdc.SelectObject(&bmp);
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_alnTab!=ALN_TOP)
{
mdc.FillRect(m_rectTab,&cbr);
mdc.Draw3dRect(m_rectDraw,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
}
else
{
CRect rc=m_rectDraw;
for (int i=0; i< 2; i++)
{
mdc.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;
mdc.FillRect(rc,&cbr);
}
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;
}
}
Drawtabs(&mdc);
dc.BitBlt (rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(),
&mdc, rcClip.left, rcClip.top, SRCCOPY);
mdc.SelectObject(pOldBmp);
ReleaseDC(&dc);
bmp.DeleteObject();
mdc.DeleteDC();
}
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+3,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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -