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 + -
显示快捷键?