更换CSplitterWnd中的pane

 更换CSplitterWnd中的pane

在一些软件设置的界面中,通常左边是项目,右边是项目中具体的设置内容
如果用CSplitterWnd实现,需要根据左边的项目选择,更改右边pane的显示内容

更换CSplitterWnd中某一个pane(即某个格子中的view),应该如何实现?

一种简单的做法是,每次更改时,调用DeleteView删掉原来的view,再CreateView重建一个
但这样除了做法恶心外,对于view中的状态难以保存

CSplitterWnd没有提供更换view的成员方法

分析CSplitterWnd::CreateView,pane中view创建的关键代码是:
    ......
    if (!pWnd->Create(NULL, NULL, dwStyle,
        rect, this, IdFromRowCol(row, col), pContext))
    ......
而判断view是否重复创建的代码是:
    ......
    if (GetDlgItem(IdFromRowCol(row, col)) != NULL)
    {
    TRACE2("Error: CreateView - pane already exists for row %d, col %d./n", row, col);
    ......
此外,CSplitterWnd::GetPane:
    ......
    CWnd* pView = GetDlgItem(IdFromRowCol(row, col));
    ......
由此,可以得出结论,一个view与一个pane的绑定关系,通过view的子窗口id

因此,修改view的子窗口id,即可将view与pane绑定或解绑,再配合窗口的显示或隐藏,即可实现view的更换

class CMySplitterWnd : public CSplitterWnd
{
    ......

void CMySplitterWnd::ChangeView(int row, int col, CWnd * pView)
{
    CWnd * pViewCur = GetPane(row, col);
    pViewCur->SetDlgCtrlID(1000);  // 1000是一个任意的id,只要大于256即可          
    m_pViewCur->ShowWindow(SW_HIDE);
    m_pViewCur->EnableWindow(FALSE);

    pView->SetDlgCtrlID(IdFromRowCol(row, col));
    pView->EnableWindow(TRUE);
    pView->ShowWindow(SW_SHOW);

    RecalcLayout();  // 重画一下
}

另外注意,splitter window创建的时候仍然需要用CreateView在每个pane中创建最初的view,并设好大小,以完成pane的初始化

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值