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

📄 bcgptabwnd.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//*******************************************************************************
// 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 + -