// 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);
本文介绍了一个名为CToolPane的类,它继承自CDockablePane,用于创建自定义工具栏,并提供调整布局和创建功能。通过实例代码展示了如何创建垂直或水平排列的工具条,并在主框架中使用。

997

被折叠的 条评论
为什么被折叠?



