📄 bcgptabwnd.cpp
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions
// of the accompanying license agreement.
//*******************************************************************************
// bcgptabwnd.cpp : implementation file
//
#include "stdafx.h"
#ifndef BCGP_NO_TABCTRL
#include "BCGGlobals.h"
#include "BCGPTabWnd.h"
// detachable bars support
#include "BCGPDockingControlBar.h"
#include "BCGPVisualManager.h"
#include "BCGPTabbedControlBar.h"
#include "BCGPTabbedToolbar.h"
#include "BCGPToolbarButton.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPLocalResource.h"
#include "BCGProRes.h"
#include "BCGCBProVer.h"
#include "BCGPMDIFrameWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT BCGM_ON_HSCROLL = ::RegisterWindowMessage (_T("BCGM_ON_HSCROLL"));
BOOL CBCGPTabWnd::m_bEnableActivate = TRUE;
/////////////////////////////////////////////////////////////////////////////
// CBCGPTabWnd
IMPLEMENT_DYNCREATE(CBCGPTabWnd, CBCGPBaseTabWnd)
#define MIN_SROLL_WIDTH (::GetSystemMetrics (SM_CXHSCROLL) * 2)
#define SPLITTER_WIDTH 5
#define TABS_FONT _T("Arial")
CBCGPTabWnd::CBCGPTabWnd()
{
m_iTabsNum = 0;
m_iActiveTab = -1;
m_bFlat = FALSE;
m_bIsOneNoteStyle = FALSE;
m_bScroll = FALSE;
m_bCloseBtn = FALSE;
m_bSharedScroll = FALSE;
m_rectTabsArea.SetRectEmpty ();
m_rectWndArea.SetRectEmpty ();
m_nTabsHorzOffset = 0;
m_nFirstVisibleTab = 0;
m_nTabsHorzOffsetMax = 0;
m_nTabsTotalWidth = 0;
m_nHorzScrollWidth = 0;
m_nScrollBarRight = 0;
m_rectTabSplitter.SetRectEmpty ();
m_bTrackSplitter = FALSE;
m_bFlatFrame = TRUE;
m_bHideInactiveWnd = TRUE;
m_bAutoSizeWindow = TRUE;
m_bAutoDestoyWindow = TRUE;
m_bTransparent = FALSE;
m_bTopEdge = FALSE;
m_bDrawFrame = TRUE;
m_bHideNoTabs = FALSE;
m_bIsActiveTabBold = FALSE;
}
//***************************************************************************************
CBCGPTabWnd::~CBCGPTabWnd()
{
}
BEGIN_MESSAGE_MAP(CBCGPTabWnd, CBCGPBaseTabWnd)
//{{AFX_MSG_MAP(CBCGPTabWnd)
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDBLCLK()
ON_WM_HSCROLL()
ON_WM_SETCURSOR()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_CANCELMODE()
ON_WM_SYSCOLORCHANGE()
ON_WM_SETTINGCHANGE()
ON_WM_SETFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CBCGPTabWnd::Create (Style style, const RECT& rect, CWnd* pParentWnd,
UINT nID, Location location /* = LOCATION_BOTTOM*/,
BOOL bCloseBtn /* = FALSE */)
{
m_bFlat = (style == STYLE_FLAT) || (style == STYLE_FLAT_SHARED_HORZ_SCROLL);
m_bSharedScroll = style == STYLE_FLAT_SHARED_HORZ_SCROLL;
m_bIsOneNoteStyle = (style == STYLE_3D_ONENOTE);
m_bHighLightTabs = m_bIsOneNoteStyle;
m_location = location;
m_bScroll = (m_bFlat || style == STYLE_3D_SCROLLED || style == STYLE_3D_ONENOTE);
m_bCloseBtn = bCloseBtn;
if (!m_bFlat && m_bSharedScroll)
{
//--------------------------------------
// Only flat tab has a shared scrollbar!
//--------------------------------------
ASSERT (FALSE);
m_bSharedScroll = FALSE;
}
return CBCGPBaseTabWnd::Create (NULL, _T(""),
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, rect,
pParentWnd, nID);
}
/////////////////////////////////////////////////////////////////////////////
// CBCGPTabWnd message handlers
void CBCGPTabWnd::OnDestroy()
{
if (m_brActiveTab.GetSafeHandle () != NULL)
{
m_brActiveTab.DeleteObject ();
}
if (m_ToolTip.GetSafeHwnd () != NULL)
{
m_ToolTip.DestroyWindow ();
}
CBCGPBaseTabWnd::OnDestroy();
}
//***************************************************************************************
void CBCGPTabWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
COLORREF clrDark;
COLORREF clrBlack;
COLORREF clrHighlight;
COLORREF clrFace;
COLORREF clrDarkShadow;
COLORREF clrLight;
CBrush* pbrFace = NULL;
CBrush* pbrBlack = NULL;
CBCGPVisualManager::GetInstance ()->GetTabFrameColors (
this, clrDark, clrBlack, clrHighlight, clrFace, clrDarkShadow, clrLight,
pbrFace, pbrBlack);
ASSERT_VALID (pbrFace);
ASSERT_VALID (pbrBlack);
CRect rectClient;
GetClientRect (&rectClient);
CBrush* pOldBrush = dc.SelectObject (pbrFace);
ASSERT (pOldBrush != NULL);
CPen penDark (PS_SOLID, 1, clrDark);
CPen penBlack (PS_SOLID, 1, clrBlack);
CPen penHiLight (PS_SOLID, 1, clrHighlight);
CPen* pOldPen = (CPen*) dc.SelectObject (&penDark);
ASSERT(pOldPen != NULL);
const int nTabBorderSize = GetTabBorderSize ();
CRect rectTabs = rectClient;
if (m_location == LOCATION_BOTTOM)
{
rectTabs.top = m_rectTabsArea.top - nTabBorderSize;
}
else
{
rectTabs.bottom = m_rectTabsArea.bottom + nTabBorderSize;
}
dc.ExcludeClipRect (m_rectWndArea);
BOOL bBackgroundIsReady =
CBCGPVisualManager::GetInstance ()->OnEraseTabsFrame (&dc, rectClient, this);
if (!m_bDrawFrame && !bBackgroundIsReady)
{
dc.FillRect (rectClient, pbrFace);
}
CBCGPVisualManager::GetInstance ()->OnEraseTabsArea (&dc, rectTabs, this);
CRect rectFrame = rectClient;
if (nTabBorderSize == 0)
{
if (m_location == LOCATION_BOTTOM)
{
rectFrame.bottom = m_rectTabsArea.top + 1;
}
else
{
rectFrame.top = m_rectTabsArea.bottom - 1;
}
if (m_bFlat)
{
dc.FrameRect(&rectFrame, pbrBlack);
}
else
{
dc.FrameRect(&rectFrame, pbrFace);
}
}
else
{
int yLine = m_location == LOCATION_BOTTOM ?
m_rectTabsArea.top : m_rectTabsArea.bottom;
if (!m_bFlat)
{
if (m_location == LOCATION_BOTTOM)
{
rectFrame.bottom = m_rectTabsArea.top;
}
else
{
rectFrame.top = m_rectTabsArea.bottom;
}
}
//-----------------------------------------------------
// Draw wide 3-dimensional frame around the Tabs area:
//-----------------------------------------------------
if (m_bFlatFrame)
{
CRect rectBorder (rectFrame);
if (m_bFlat)
{
if (m_location == LOCATION_BOTTOM)
{
rectBorder.bottom = m_rectTabsArea.top + 1;
}
else
{
rectBorder.top = m_rectTabsArea.bottom - 1;
}
}
rectFrame.DeflateRect (1, 1);
if (m_bDrawFrame && !bBackgroundIsReady && rectFrame.Width () > 0 && rectFrame.Height () > 0)
{
dc.PatBlt (rectFrame.left, rectFrame.top, nTabBorderSize, rectFrame.Height (), PATCOPY);
dc.PatBlt (rectFrame.left, rectFrame.top, rectFrame.Width (), nTabBorderSize, PATCOPY);
dc.PatBlt (rectFrame.right - nTabBorderSize - 1, rectFrame.top, nTabBorderSize + 1, rectFrame.Height (), PATCOPY);
dc.PatBlt (rectFrame.left, rectFrame.bottom - nTabBorderSize, rectFrame.Width (), nTabBorderSize, PATCOPY);
if (m_location == LOCATION_BOTTOM)
{
dc.PatBlt (rectFrame.left, m_rectWndArea.bottom, rectFrame.Width (),
rectFrame.bottom - m_rectWndArea.bottom, PATCOPY);
}
else
{
dc.PatBlt (rectFrame.left, rectFrame.top, rectFrame.Width (),
m_rectWndArea.top - rectFrame.top, PATCOPY);
}
}
if (m_bFlat)
{
//---------------------------
// Draw line below the tabs:
//---------------------------
dc.SelectObject (&penBlack);
dc.MoveTo (rectFrame.left + nTabBorderSize, yLine);
dc.LineTo (rectFrame.right - nTabBorderSize, yLine);
}
dc.Draw3dRect (&rectBorder, clrFace, clrFace);
if (GetTabsHeight () == 0)
{
dc.Draw3dRect (&rectBorder, clrFace, clrFace);
}
else
{
if (m_bDrawFrame)
{
dc.Draw3dRect (&rectBorder, clrDark, clrDark);
}
if (!m_bIsOneNoteStyle)
{
if (m_location == LOCATION_BOTTOM)
{
dc.SelectObject (&penBlack);
dc.MoveTo (rectBorder.left, rectBorder.bottom - 1);
dc.LineTo (rectBorder.right - 1, rectBorder.bottom - 1);
}
else
{
dc.SelectObject (&penHiLight);
dc.MoveTo (rectBorder.left, rectBorder.top);
dc.LineTo (rectBorder.right - 1, rectBorder.top);
}
}
}
}
else
{
if (m_bDrawFrame)
{
dc.Draw3dRect (&rectFrame, clrHighlight, clrDarkShadow);
rectFrame.DeflateRect (1, 1);
dc.Draw3dRect (&rectFrame, clrLight, clrDark);
rectFrame.DeflateRect (1, 1);
if (!bBackgroundIsReady &&
rectFrame.Width () > 0 && rectFrame.Height () > 0)
{
dc.PatBlt (rectFrame.left, rectFrame.top, nTabBorderSize, rectFrame.Height (), PATCOPY);
dc.PatBlt (rectFrame.left, rectFrame.top, rectFrame.Width (), nTabBorderSize, PATCOPY);
dc.PatBlt (rectFrame.right - nTabBorderSize, rectFrame.top, nTabBorderSize, rectFrame.Height (), PATCOPY);
dc.PatBlt (rectFrame.left, rectFrame.bottom - nTabBorderSize, rectFrame.Width (), nTabBorderSize, PATCOPY);
if (m_location == LOCATION_BOTTOM)
{
dc.PatBlt (rectFrame.left, m_rectWndArea.bottom, rectFrame.Width (),
rectFrame.bottom - m_rectWndArea.bottom, PATCOPY);
}
else
{
dc.PatBlt (rectFrame.left, rectFrame.top, rectFrame.Width (),
m_rectWndArea.top - rectFrame.top, PATCOPY);
}
if (m_bFlat)
{
//---------------------------
// Draw line below the tabs:
//---------------------------
dc.SelectObject (&penBlack);
dc.MoveTo (rectFrame.left + nTabBorderSize, yLine);
dc.LineTo (rectFrame.right - nTabBorderSize, yLine);
}
if (nTabBorderSize > 2)
{
rectFrame.DeflateRect (nTabBorderSize - 2, nTabBorderSize - 2);
}
if (rectFrame.Width () > 0 && rectFrame.Height () > 0)
{
dc.Draw3dRect (&rectFrame, clrDarkShadow, clrHighlight);
}
}
else
{
rectFrame.DeflateRect (2, 2);
}
}
}
}
if (m_bTopEdge && m_location == LOCATION_TOP)
{
dc.SelectObject (&penDark);
dc.MoveTo (rectClient.left, m_rectTabsArea.bottom);
dc.LineTo (rectClient.left, rectClient.top);
dc.LineTo (rectClient.right - 1, rectClient.top);
dc.LineTo (rectClient.right - 1, m_rectTabsArea.bottom);
}
CFont* pOldFont = dc.SelectObject (m_bFlat ? &m_fntTabs :
&globalData.fontRegular);
ASSERT(pOldFont != NULL);
dc.SetBkMode (TRANSPARENT);
dc.SetTextColor (globalData.clrBtnText);
if (m_rectTabsArea.Width () > 2 * nTabBorderSize + 1 &&
m_rectTabsArea.Height () > 2 * nTabBorderSize + 1)
{
//-----------
// Draw tabs:
//-----------
CRect rectClip = m_rectTabsArea;
rectClip.InflateRect (1, nTabBorderSize);
CRgn rgn;
rgn.CreateRectRgnIndirect (rectClip);
dc.SelectClipRgn (&rgn);
for (int i = m_iTabsNum - 1; i >= 0; i--)
{
CBCGPTabInfo* pTab = (CBCGPTabInfo*) m_arTabs [i];
ASSERT_VALID (pTab);
if (!pTab->m_bVisible)
continue;
m_iCurTab = i;
if (i != m_iActiveTab) // Draw active tab last
{
if (m_bFlat)
{
dc.SelectObject (&penBlack);
DrawFlatTab (&dc, pTab, FALSE);
}
else
{
Draw3DTab (&dc, pTab, FALSE);
}
}
}
if (m_iActiveTab >= 0)
{
//-----------------
// Draw active tab:
//-----------------
CBCGPTabInfo* pTabActive = (CBCGPTabInfo*) m_arTabs [m_iActiveTab];
ASSERT_VALID (pTabActive);
m_iCurTab = m_iActiveTab;
if (m_bFlat)
{
dc.SelectObject (&m_brActiveTab);
dc.SelectObject (&m_fntTabsBold);
dc.SetTextColor (GetActiveTabTextColor ());
dc.SelectObject (&penBlack);
DrawFlatTab (&dc, pTabActive, TRUE);
//---------------------------------
// Draw line bellow the active tab:
//---------------------------------
CPen penLight (PS_SOLID, 1, GetActiveTabColor ());
dc.SelectObject (&penLight);
if (m_location == LOCATION_BOTTOM)
{
dc.MoveTo (pTabActive->m_rect.left + 1, pTabActive->m_rect.top);
dc.LineTo (pTabActive->m_rect.right, pTabActive->m_rect.top);
}
else
{
dc.MoveTo (pTabActive->m_rect.left + 1, pTabActive->m_rect.bottom);
dc.LineTo (pTabActive->m_rect.right, pTabActive->m_rect.bottom);
}
dc.SelectObject (pOldPen);
}
else
{
if (m_bIsActiveTabBold)
{
dc.SelectObject (&globalData.fontBold);
}
Draw3DTab (&dc, pTabActive, TRUE);
}
}
dc.SelectClipRgn (NULL);
}
if (!m_rectTabSplitter.IsRectEmpty ())
{
dc.FillRect (m_rectTabSplitter, pbrFace);
CRect rectTabSplitter = m_rectTabSplitter;
dc.Draw3dRect (rectTabSplitter, clrDarkShadow, clrDark);
rectTabSplitter.DeflateRect (1, 1);
dc.Draw3dRect (rectTabSplitter, clrHighlight, clrDark);
}
if (m_bFlat && m_nTabsHorzOffset > 0)
{
dc.SelectObject (&penDark);
if (m_location == LOCATION_BOTTOM)
{
dc.MoveTo (m_rectTabsArea.left, m_rectTabsArea.top);
dc.LineTo (m_rectTabsArea.left, m_rectTabsArea.bottom - 2);
}
else
{
dc.MoveTo (m_rectTabsArea.left, m_rectTabsArea.bottom);
dc.LineTo (m_rectTabsArea.left, m_rectTabsArea.top + 2);
}
}
dc.SelectObject (pOldFont);
dc.SelectObject (pOldBrush);
dc.SelectObject (pOldPen);
}
//***************************************************************************************
void CBCGPTabWnd::OnSize(UINT nType, int cx, int cy)
{
CBCGPBaseTabWnd::OnSize(nType, cx, cy);
int nTabsAreaWidth = cx - 4 * ::GetSystemMetrics (SM_CXVSCROLL)
- 2 * GetTabBorderSize ();
if (nTabsAreaWidth <= MIN_SROLL_WIDTH)
{
m_nHorzScrollWidth = 0;
}
else if (nTabsAreaWidth / 2 > MIN_SROLL_WIDTH)
{
m_nHorzScrollWidth = nTabsAreaWidth / 2;
}
else
{
m_nHorzScrollWidth = nTabsAreaWidth;
}
RecalcLayout ();
if (m_bIsOneNoteStyle)
{
m_nTabsHorzOffset = 0;
m_nFirstVisibleTab = 0;
EnsureVisible (m_iActiveTab);
}
SynchronizeScrollBar ();
}
//***************************************************************************************
BOOL CBCGPTabWnd::SetActiveTab (int iTab)
{
if (iTab < 0 || iTab >= m_iTabsNum)
{
TRACE(_T("SetActiveTab: illegal tab number %d\n"), iTab);
return FALSE;
}
if (iTab >= m_arTabs.GetSize ())
{
ASSERT (FALSE);
return FALSE;
}
BOOL bIsFirstTime = (m_iActiveTab == -1);
if (m_iActiveTab == iTab) // Already active, do nothing
{
return TRUE;
}
CWnd* pWndParent = GetParent ();
ASSERT_VALID (pWndParent);
if (_BCGCBPRO_VERSION_MAJOR >= 6 && _BCGCBPRO_VERSION_MINOR >= 2)
{
if (pWndParent->SendMessage (BCGM_CHANGING_ACTIVE_TAB, iTab, (LPARAM) this))
{
return TRUE;
}
}
else
{
pWndParent->SendMessage (BCGM_CHANGING_ACTIVE_TAB, iTab, (LPARAM) this);
}
CBCGPMDIFrameWnd* pParentFrame = DYNAMIC_DOWNCAST (CBCGPMDIFrameWnd, GetParentFrame ());
BOOL bEnableSetRedraw = TRUE;
if (pParentFrame != NULL)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -