CDockablePane嵌入MFCToolBar

本文介绍了一个名为CToolPane的类,它继承自CDockablePane,用于创建自定义工具栏,并提供调整布局和创建功能。通过实例代码展示了如何创建垂直或水平排列的工具条,并在主框架中使用。
// CToolPane
class CToolPane : public CDockablePane
{
	DECLARE_DYNAMIC(CToolPane)
public:
	CToolPane();
	virtual ~CToolPane();
	void AdjustLayout();
	BOOL Create(CString strWndName, CWnd* pParentWnd, UINT nID, UINT uiResToolID, BOOL bVertical = FALSE, BOOL bHasGripper = TRUE);

private:
	CMFCToolBar	m_bar;
	BOOL m_bVertical;
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnSize(UINT nType, int cx, int cy);
};


// ToolPane.cpp : 实现文件
//
#include "stdafx.h"
#include "MyTest.h"
#include "ToolPane.h"
// CToolPane
IMPLEMENT_DYNAMIC(CToolPane, CDockablePane)

CToolPane::CToolPane()
{
}
CToolPane::~CToolPane()
{
}

void CToolPane::AdjustLayout()
{
	if (GetSafeHwnd() == NULL) return;
	if (::IsWindow(m_bar.m_hWnd))
	{
		// 确保工具条水平或垂直排列
		DWORD dwStyle = m_bar.GetPaneStyle();
		if (m_bVertical)
		{
			dwStyle &= ~(CBRS_TOP | CBRS_BOTTOM | CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
			dwStyle |= CBRS_LEFT | CBRS_ALIGN_LEFT;
		}
		else
		{
			dwStyle &= ~(CBRS_LEFT | CBRS_RIGHT | CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
			dwStyle |= CBRS_TOP | CBRS_ALIGN_TOP;
		}
		m_bar.SetPaneStyle(dwStyle);
		// 充满整个Pane区域
		CRect rectClient;
		GetClientRect(rectClient);
		m_bar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
	}
}


BEGIN_MESSAGE_MAP(CToolPane, CDockablePane)
	ON_WM_SIZE()
END_MESSAGE_MAP()

BOOL CToolPane::Create(CString strWndName, CWnd* pParentWnd, UINT nID, UINT uiResToolID, BOOL bVertical/* = FALSE*/, BOOL bHasGripper /*= TRUE*/)
{
	if (!CDockablePane::Create(strWndName, pParentWnd, CSize(30, 30), bHasGripper, nID, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
		return FALSE;
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_HIDE_INPLACE;
	if (bVertical)
		dwStyle |= CBRS_LEFT;
	else
		dwStyle |= CBRS_TOP;
	m_bVertical = bVertical;
	m_bar.Create(this, dwStyle, uiResToolID);
	m_bar.LoadToolBar(uiResToolID, 0, 0, TRUE);
	m_bar.SetPaneStyle(m_bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
	AdjustLayout();
	return TRUE;
}

void CToolPane::OnSize(UINT nType, int cx, int cy)
{
	CDockablePane::OnSize(nType, cx, cy);
	AdjustLayout();
}

// 在主框架中使用
m_wndToolPane.Create(TEXT("ToolPane"), this, 0x02, IDR_MENU_IMAGES, TRUE, FALSE);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值