xptabctrl.cpp

来自「用bcg库编写的java IDE 源码」· C++ 代码 · 共 371 行

CPP
371
字号
// XPTabCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "bcgcontrolbar.h"
#include "XPTabCtrl.h"
#include "XPDrawLayer.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CXPTabCtrl

CXPTabCtrl::CXPTabCtrl()
{
   m_bUsesPanel = FALSE;
   m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,(LPCTSTR)"MS Sans Serif");
}

CXPTabCtrl::~CXPTabCtrl()
{
}


BEGIN_MESSAGE_MAP(CXPTabCtrl, CTabCtrl)
	//{{AFX_MSG_MAP(CXPTabCtrl)
	ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP

	ON_WM_PAINT()
	ON_WM_NCPAINT()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXPTabCtrl message handlers

void CXPTabCtrl::OnPaint() 
{
   CPaintDC dc(this); // device context for painting
   CDC mdc;
   CRect rcClient;
   CRect rcClip;
   GetClientRect(&rcClient);
   dc.GetClipBox(&rcClip);

   mdc.CreateCompatibleDC(&dc);
   CBitmap memBmp;
   memBmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
   CBitmap* pOldBmp = mdc.SelectObject(&memBmp);

   //draw background
   CBrush brBackgrnd(GetSysColor(COLOR_3DFACE));
   mdc.FillRect(&rcClient,&brBackgrnd);
   brBackgrnd.DeleteObject();

   if(GetItemCount()>0)
   {
      CRect rcFirst;
      GetItemRect(0,&rcFirst);
      DWORD dwTabStyle = GetStyle();


      if(dwTabStyle & TCS_VERTICAL)
	  {
        if(dwTabStyle & TCS_RIGHT)
		{


		}
	    else
		{


		}
	  }
	  else
	  {
        if(dwTabStyle & TCS_BOTTOM)
          rcClient.DeflateRect(0,(rcClient.Height()-rcFirst.Height()),0,0);
	    else
          rcClient.DeflateRect(0,0,0,rcClient.Height()-rcFirst.Height());
	  }



      mdc.Draw3dRect(&rcClient,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh());
	  rcClient.DeflateRect(1,1,1,1);


	  CBrush brBk;
	  brBk.CreateSolidBrush(GuiDrawLayer::GetRGBOffWhiteXP());
	  mdc.FillRect(rcClient,&brBk);
	  brBk.DeleteObject();

	  int nCount = GetItemCount();
	  for(int I=0; I<nCount; I++)
		DrawItem(&mdc,I);
   }
   dc.BitBlt (rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(),
					   &mdc, rcClip.left, rcClip.top, SRCCOPY);

   mdc.SelectObject(pOldBmp);
   memBmp.DeleteObject();
   ReleaseDC(&dc);
   mdc.DeleteDC();
}



void CXPTabCtrl::OnNcPaint() 
{
	CWindowDC dc(this);
	CRect rectClient;
	GetClientRect(rectClient);
	CRect rectWindow;
	GetWindowRect(rectWindow);
	ScreenToClient(rectWindow);
	rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
	if(rectClient.top<rectClient.bottom && rectClient.top<rectClient.bottom)
		dc.ExcludeClipRect(rectClient);

	// erase parts not drawn
	SendMessage(WM_ERASEBKGND, (WPARAM)dc.m_hDC);

	// draw borders in non-client area
	rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
	dc.Draw3dRect(rectWindow,GuiDrawLayer::GetRGBColorShadow(),
		::GetSysColor(COLOR_BTNHILIGHT));	
}

void CXPTabCtrl::DrawItem(CDC* pDC,int nItem)
{
  CRect rcItem;
  GetItemRect(nItem,&rcItem);
  DWORD dwTabStyle = GetStyle();
  CRect rcRest(rcItem);
  

  if(GetCurSel() == nItem)
  {
    if(dwTabStyle & TCS_VERTICAL)
	{
       if(dwTabStyle & TCS_RIGHT)
	   {


	   }
	   else
	   {



	   }
	}
	else
	{
	   if(nItem>0)
		 rcItem.InflateRect(1,0,0,0);//cover divider
         
	   if(dwTabStyle & TCS_BOTTOM)
		   rcItem.DeflateRect(0,1,0,0);
	   else
		   rcItem.DeflateRect(0,0,0,1);

	   //draw border
       pDC->Draw3dRect(&rcItem,GuiDrawLayer::GetRGBColorBTNHigh(),
			                    GuiDrawLayer::GetRGBColorShadow());


       //shrink to prevent from covering borders
       if(dwTabStyle & TCS_BOTTOM)
         rcItem.DeflateRect(1,0,1,1);
	   else
		 rcItem.DeflateRect(1,1,1,0);

	   //fill selection
	   CBrush br3D;
	   br3D.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
       pDC->FillRect(rcItem,&br3D);
	   br3D.DeleteObject();
	}
  }
  else
  {
     
    if(dwTabStyle & TCS_VERTICAL)
	{
       if(dwTabStyle & TCS_RIGHT)
	   {


	   }
	   else
	   {

	   }
	}
	else
	{
	   if(dwTabStyle & TCS_BOTTOM)
		   rcItem.DeflateRect(0,3,0,0);
	   else
		   rcItem.DeflateRect(0,0,0,3);
	   rcRest = rcItem;

	   CBrush brush;
	   brush.CreateSolidBrush(GuiDrawLayer::GetRGBOffWhiteXP());
       pDC->FillRect(rcItem,&brush);
	   brush.DeleteObject();


       brush.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow());
       rcItem.DeflateRect(rcItem.Width()-1,2,0,2);
       pDC->FillRect(rcItem,&brush);
	   brush.DeleteObject();
	}
  }
  DrawItemRest(nItem,pDC,rcRest);
}

void CXPTabCtrl::DrawItemRest(int nItem,CDC* pDC,CRect rcItem)
{
  CRect rect = rcItem;
  int nTabIndex = nItem;

  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 ();

  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));

 CFont* pOldFont = pDC->SelectObject(&m_cfont);

  // 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);

	 int mid1 = rc.Height()/2;
	 int mid2 = rect.Height()/2;
	 int shrink = mid2-mid1;
	 rect.DeflateRect(0,shrink,0,shrink);

     pImageList->Draw (pDC, tci.iImage, rect.TopLeft (), ILD_TRANSPARENT);
     rect.left += rc.Width () + deltax;
  }
  else
  {
     rect.left += deltax;
  }


  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->SelectObject(pOldFont);
  pDC->RestoreDC (nSavedDC);
}

void CXPTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
{
	/*
   if(m_bUsesPanel)
   {
     LPTCITEM pTabItem;
     GetItem(GetCurSel(),pTabItem);
     CWnd* panel = (CWnd*)pTabItem->lParam;
	 if(panel != NULL)
		 panel->BringWindowToTop();
   }*/
   *pResult = 0;
   pNMHDR;
}

int CXPTabCtrl::AddPanel(CWnd *pwndPanel, LPCTSTR lszpText,int nItem, int iImage)
{
  TCITEM iItem;
  iItem.pszText = (TCHAR*)(void*)(const TCHAR*)lszpText;
  iItem.lParam  = (LPARAM)pwndPanel;
  iItem.iImage  = iImage;
  if(iImage != -1)
  iItem.mask |= TCIF_IMAGE;
  if(!CString(lszpText).IsEmpty())
  iItem.mask |= TCIF_TEXT;
  m_bUsesPanel = TRUE;
  return InsertItem(nItem,&iItem);
}

void CXPTabCtrl::OnSize(UINT nType, int cx, int cy) 
{
	CTabCtrl::OnSize(nType, cx, cy);
	int nOffset =0;
	if(GetItemCount()>0)
	{
	  CRect rcItem;
      GetItemRect(0,&rcItem);
	  nOffset = rcItem.Height()+2;
	}
    if(m_bUsesPanel)
	{
	  CWnd* pWnd = GetWindow(GW_CHILD);
	  while (pWnd != NULL)
	  {
        if(pWnd->IsWindowVisible())
		{
	      pWnd->MoveWindow(0, 0, cx, cy-nOffset);
		  break;
		}
        pWnd=pWnd->GetWindow(GW_HWNDNEXT);
	  }
	}	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?