📄 sizetabc.cpp
字号:
#include "stdafx.h"
#include "sizetabc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma warning ( disable : 4711 )
/////////////////////////////////////////////////////////////////////////////
// CSizedTabCtrl
CSizedTabCtrl::CSizedTabCtrl ():m_rc (0, 0, 0, 0)
{
m_count = 0;
}
CSizedTabCtrl:: ~ CSizedTabCtrl ()
{
}
void CSizedTabCtrl::
DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rect = lpDrawItemStruct->rcItem;
int nTabIndex = lpDrawItemStruct->itemID;
if (nTabIndex < 0)
return;
BOOL bSelected = nTabIndex == GetCurSel ();
CString label;
TC_ITEM tci;
tci.mask = TCIF_TEXT | TCIF_IMAGE;
tci.pszText = label.GetBuffer (64);
tci.cchTextMax = 63;
if (!GetItem (nTabIndex, &tci))
{
label.ReleaseBuffer ();
return;
}
label.ReleaseBuffer ();
CDC *pDC = CDC::FromHandle (lpDrawItemStruct->hDC);
if (!pDC)
return;
int nSavedDC = pDC->SaveDC ();
// For some bizarre reason the rcItem you get extends above the actual
// drawing area. We have to workaround this "feature".
pDC->SetBkMode (TRANSPARENT);
pDC->FillSolidRect (rect,::GetSysColor (COLOR_BTNFACE));
if (bSelected)
rect.OffsetRect (2, 2);
else
rect.OffsetRect (0, -2);
// Draw image
CImageList *pImageList = GetImageList ();
LONG deltax = pDC->GetTextExtent (_T (" ")).cx;
if (pImageList && tci.iImage >= 0)
{
rect.left += deltax; // Margin
// Get height of image so we
IMAGEINFO info;
pImageList->GetImageInfo (tci.iImage, &info);
CRect rc (info.rcImage);
pImageList->Draw (pDC, tci.iImage, rect.TopLeft (), ILD_TRANSPARENT);
rect.left += rc.Width () + deltax;
if (bSelected)
{
rect.OffsetRect (-2, -2);
deltax <<= 1;
}
}
else
{
rect.left += deltax;
if (bSelected)
{
rect.OffsetRect (2, -2);
deltax <<= 1;
}
}
CString out (label);
LONG nWidth = pDC->GetTextExtent (out).cx;
if (nWidth - 1 > rect.Width ())
// if( nWidth + deltax > rect.Width() )
{
// ads_printf( _T("*** %d - %d ***\n"), nWidth + deltax, rect.Width() );
int length = label.GetLength ();
out += _T ("...");
do
if (length == 1)
{
out = out.Left (out.GetLength () - 1);
}
else
{
label = label.Left (--length);
out = label + _T ("...");
}
while (!out.IsEmpty () && pDC->GetTextExtent (out).cx + deltax > rect.Width ());
}
if (!out.IsEmpty ())
{
CFont *pOldFont = pDC->SelectObject (GetFont ());;
pDC->DrawText (out, rect, DT_SINGLELINE | DT_VCENTER);
pDC->SelectObject (pOldFont);
}
pDC->RestoreDC (nSavedDC);
}
BEGIN_MESSAGE_MAP (CSizedTabCtrl, CTabCtrl)
//{{AFX_MSG_MAP( CSizedTabCtrl )
ON_WM_SIZE ()
ON_WM_CREATE ()
//}}AFX_MSG_MAP
END_MESSAGE_MAP ()
/////////////////////////////////////////////////////////////////////////////
// CSizedTabCtrl message handlers
void CSizedTabCtrl::OnSize (UINT nType, int cx, int cy)
{
CTabCtrl::OnSize (nType, cx, cy);
int count = GetItemCount ();
if (count)
{
CRect rect (0, 0, cx, cy);
if (m_count != count)
{
CRect ri;
m_count = count;
m_rc.SetRectEmpty ();
for (int i = 0; i < GetItemCount (); i++)
if (GetItemRect (i, ri))
if (m_rc.right)
m_rc.UnionRect (m_rc, ri);
else
m_rc = ri;
m_rc.right++;
}
if (m_rc.right > rect.Width ())
{
ModifyStyle (0, TCS_FIXEDWIDTH); //, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE );
SetItemSize (CSize (rect.Width () / GetItemCount () - 1, m_rc.Height ()));
}
else
{
ModifyStyle (TCS_FIXEDWIDTH, 0); //, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE );
}
}
}
int CSizedTabCtrl::
OnCreate (LPCREATESTRUCT lpCreateStruct)
{
if (CTabCtrl::OnCreate (lpCreateStruct) == -1)
return -1;
SetFont (CFont::FromHandle ((HFONT) GetStockObject (DEFAULT_GUI_FONT)));
/*
NONCLIENTMETRICS info;
info.cbSize = sizeof( info );
SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof( info ), &info, 0 );
CClientDC dc( CWnd::FromHandle( ::GetDesktopWindow() ) );
info.lfMessageFont.lfHeight = -MulDiv( 8, dc.GetDeviceCaps( LOGPIXELSY ), 72 );
info.lfMessageFont.lfWidth = 0;
info.lfMessageFont.lfWeight = FW_THIN;
info.lfMessageFont.lfItalic = FALSE;
info.lfMessageFont.lfUnderline = FALSE;
info.lfMessageFont.lfCharSet = DEFAULT_CHARSET;
info.lfMessageFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
info.lfMessageFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
info.lfMessageFont.lfQuality = DEFAULT_QUALITY;
info.lfMessageFont.lfPitchAndFamily = FF_SWISS;
lstrcpy( info.lfMessageFont.lfFaceName, _T( "Tahoma" ) );
CFont oFont;
VERIFY( oFont.CreateFontIndirect( &info.lfMessageFont ) );
SetFont( &oFont );
oFont.Detach();
*/
return 0;
}
/////////////////////////////////////////////////////////////////////////////
#pragma warning ( default : 4711 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -