⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sizetabc.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 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 + -