Toolbar within splitter windows

34 members have rated this article. Result:
Popularity: 4.72. Rating: 3.08 out of 5.

Sample Image - toolbar_splitter.jpg

Introduction

Has anyone ever wondered how to dock a toolbar inside a splitter pane? Normally you cannot do that, but you can alter your splitter pane so that it will look just like you placed a toolbar on one of its sides. The trick is to create a two-pane splitter where your initial pane was; but not just any splitter, we will use our own, which does not allow resizing, and has different border settings. There is one additional view to create, and we will derive a class from CFormView since features provided by this class are closer to our goal.

The Code

First goes the custom splitter window:

// class definition
class CSmartSplitterWnd : public CSplitterWnd
{
public:
    CSmartSplitterWnd();
    virtual ~CSmartSplitterWnd();
    intHitTest(CPoint pt)const;
protected:
    DECLARE_MESSAGE_MAP()
};

// class implementation
CSmartSplitterWnd::CSmartSplitterWnd()
{
    // put your own values here, to make the splitter fit your needs
    m_cxSplitter=3;
    m_cySplitter=3;
    m_cxBorderShare=0;
    m_cyBorderShare=0;
    m_cxSplitterGap=3;
    m_cySplitterGap=3;
}

CSmartSplitterWnd::~CSmartSplitterWnd()
{
}

BEGIN_MESSAGE_MAP(CSmartSplitterWnd, CSplitterWnd)
    //{{AFX_MSG_MAP(CSmartSplitterWnd)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

intCSmartSplitterWnd::HitTest(CPoint pt)const
{
    ASSERT_VALID(this);
    // do not allow caller to see mouse hits
    return 0;
}

Next, we must create a simple CFormView using the resource editor and ClassWizard. You can add any controls to your form view, but you must keep in mind that handling the WM_SIZE message may help you improve the look of your view. There are several ways to update your buttons and other controls inside the view; you may need to implement one of them to update, enable or disable the controls.

The last step is to create the splitter itself and the views. The code below matches a SDI application that accommodates the code above inside a splitter pane, but you can easily adjust it to fit your needs.

First, add a member to the CMainFrame class of type CSmartSplitterWnd:

class CMainFrame: public CFrameWnd
{
[...]
public:
    CSmartSplitterWnd m_barSplitter;

In the OnCreateClient member of the CMainFrame class, add code to create the splitter inside the right pane:

// create the splitter window
if (!m_barSplitter.CreateStatic(&m_parentSplitter, 2, 1, 
    WS_CHILD|WS_VISIBLE|WS_BORDER, 
    m_parentSplitter.IdFromRowCol(1, 0))) return false;

// create the views
m_barSplitter.CreateView(0, 0, RUNTIME_CLASS(CBarView), CSize(0, 0), pContext);
m_barSplitter.CreateView(1, 0, RUNTIME_CLASS(CTheView), CSize(0, 0), pContext);
// then set heights

The code is quite easy to follow and change to meet your needs, but if you need assistance, contact me. Also please send me bugs or updates, to keep this solution up-to-date. For more details on the sample application, contact me.

About Stefan Ungureanu


... coming in a short while

Click here to view Stefan Ungureanu's online profile.


Other popular Splitter Windows articles:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值