toolbar.cpp

来自「MFC编程实例」· C++ 代码 · 共 217 行

CPP
217
字号
#include "stdafx.h"
#include "Bar.h"
#include "ColorBar.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

#define COMBOBOX_INDEX 5
#define COMBOBOX_WIDTH 150
#define COMBOBOX_HEIGHT 150
#define COMBOBOX_BITMAP 4

static UINT BASED_CODE EditButtons[] =
{
	// same order as in the bitmap 'toolbar.bmp'
	ID_EDIT_BM_TOGGLE,
	ID_EDIT_BM_NEXT,
	ID_EDIT_BM_PREV,
	ID_EDIT_BM_CLEARALL,
		ID_SEPARATOR,
	ID_EDIT_FIND,
		ID_SEPARATOR,
	ID_EDIT_FINDINFILES,
		ID_SEPARATOR,
	ID_EDIT_INDENT,
	ID_EDIT_UNINDENT,
		ID_SEPARATOR,
	ID_WINDOW_NEW,
	ID_WINDOW_SPLIT,
	ID_WINDOW_CASCADE,
	ID_WINDOW_TILE_HORZ,
	ID_WINDOW_TILE_VERT,
};

/////////////////////////////////////////////////////////////////////////////
// CEditBar

CEditBar::CEditBar()
{
	m_bColor = TRUE;
}

CEditBar::~CEditBar()
{
}

BOOL CEditBar::Init(CWnd* pParentWnd, BOOL bColor, BOOL bToolTips)
{
	m_bColor = bColor;
	m_bVertical = FALSE;

	// start out with no borders
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_SIZE_DYNAMIC;
	if (bToolTips)
		dwStyle |= (CBRS_TOOLTIPS | CBRS_FLYBY);
	if (!Create(pParentWnd, dwStyle, IDW_EDIT_BAR))
	{
		return FALSE;
	}
	
	if (!SetColor(m_bColor))
		return FALSE;

	if(!SetButtons(EditButtons, sizeof(EditButtons)/sizeof(UINT)))
		return FALSE;
	
	CRect rect(-COMBOBOX_WIDTH, -COMBOBOX_HEIGHT, 0, 0);
	// The ID of the ComboBox is important for two reasons.  One, so you
	// can receive notifications from the control.  And also for ToolTips.
	// During HitTesting if the ToolBar sees that the mouse is one a child
	// control, the toolbar will lookup the controls ID and search for a
	// string in the string table with the same ID to use for ToolTips
	// and StatusBar info.
	if (!m_SearchBox.Create(WS_CHILD | CBS_DROPDOWN |
		CBS_AUTOHSCROLL | WS_VSCROLL | CBS_HASSTRINGS, rect, this,
		IDC_EDITBAR_SEARCHBOX))
	{
		return FALSE;
	}

	HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
	if (hFont == NULL)
		hFont = (HFONT)GetStockObject(ANSI_VAR_FONT);

  	m_SearchBox.SendMessage(WM_SETFONT, (WPARAM)hFont);

	if(!SetHorizontal())
		return FALSE;

	return TRUE;
}

BOOL CEditBar::SetHorizontal()
{
	m_bVertical = FALSE;

	SetBarStyle(GetBarStyle() | CBRS_ALIGN_TOP);

	SetButtonInfo(COMBOBOX_INDEX, IDC_EDITBAR_SEARCHBOX, TBBS_SEPARATOR, COMBOBOX_WIDTH);

	if (m_SearchBox.m_hWnd != NULL)
	{
		CRect rect;
		GetItemRect(COMBOBOX_INDEX, rect);
		
		m_SearchBox.SetWindowPos(NULL, rect.left, rect.top, 0, 0, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOCOPYBITS);
		m_SearchBox.ShowWindow(SW_SHOW);
	}
	
	return TRUE;
}

BOOL CEditBar::SetVertical()
{
	m_bVertical = TRUE;

	SetButtonInfo(COMBOBOX_INDEX, ID_EDIT_FIND, TBBS_BUTTON, COMBOBOX_BITMAP);

	if (m_SearchBox.m_hWnd != NULL)
		m_SearchBox.ShowWindow(SW_HIDE);

	return TRUE;
}

BOOL CEditBar::SetColor(BOOL bColor)
{
	m_bColor=bColor;

	if (m_bColor)
		return LoadBitmap(IDR_COLOR_EDITBAR);
	else
		return LoadBitmap(IDR_MONO_EDITBAR);
}

CSize CEditBar::CalcDynamicLayout(int nLength, DWORD dwMode)
{
	// if we're committing set the buttons appropriately
	if (dwMode & LM_COMMIT)
	{
		if (dwMode & LM_VERTDOCK)
		{
			if (!m_bVertical)
				SetVertical();
		}
		else
		{
			if (m_bVertical)
				SetHorizontal();
		}

		return CToolBar::CalcDynamicLayout(nLength, dwMode);
	}
	else
	{
		BOOL bOld = m_bVertical;
		BOOL bSwitch = (dwMode & LM_HORZ) ? bOld : !bOld;

		if (bSwitch)
		{
			if (bOld)
				SetHorizontal();
			else
				SetVertical();
		}
		

		CSize sizeResult = CToolBar::CalcDynamicLayout(nLength, dwMode);
		
		if (bSwitch)
		{
			if (bOld)
				SetHorizontal();
			else
				SetVertical();
		}

		return sizeResult;
	}
}

//CSize CEditBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
//{
//  	if (!bHorz && (m_dwStyle & CBRS_SIZE_DYNAMIC) && !(m_dwStyle & CBRS_FLOATING))
//	{
//		CSize size;
//
//		size = CControlBar::CalcFixedLayout(bStretch, bHorz);
//
//		CRect rect;
//		rect.SetRectEmpty();
//
//		CalcInsideRect(rect, bHorz);
//
//		size.cx = m_sizeVert.cx + (m_rectInsideVert.Width() - rect.Width());
//		size.cy = m_sizeVert.cy + (m_rectInsideVert.Height() - rect.Height());
//		return size;
//	}
//	else
//	{
//		if (m_bVertical)
//			SetHorizontal();
//		
//		return CToolBar::CalcFixedLayout(bStretch, bHorz);
//	}
//}

BEGIN_MESSAGE_MAP(CEditBar, CToolBar)
	//{{AFX_MSG_MAP(CEditBar)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CEditBar message handlers

⌨️ 快捷键说明

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