zoukankan      html  css  js  c++  java
  • 使用CSplitterWnd分隔窗口,左视图控制,右视图显示

    往往有这种需求:需要显示的视图为ClistView,但这个View的显示数据是有条件的,需要根据用户的输入来显示,如查询历史记录所需的条件。这时有3种方案:

    1. 使用CFormView/Dialog来控制,显示使用CListCtrl控件。

      使用该方法的好处在于我们对其比较熟悉,一般都只需鼠标点点即可,再加入相应的代码。缺点就在于窗口大小的改变不会使控件的大小变化,当窗口最大化时显示的效果不佳,当然也可以修改OnSize函数,使得这些控件随窗口的改变而改变。

    2. 使用ToolBar来控制视图,如CListView

      该方法的好处在于简洁,方便。难点在于工具栏要随视图的变化而变化,这一点在“动态改变工具栏”中已经介绍过。至于工具栏中的控件加入,可以参照MS给的示例代码。

    3. 使用CSplitterWnd分隔窗口,左视图为CFormView,右视图为显示的View

      他们之间通过Doc来通信,当用户操作CFormView中的设置,来改变Doc,再调用Doc的UpdateAllViews来更新右视图。

    个人认为这3中方案都可行,数方案1技术含量低,工作繁琐,计算窗口的大小不是程序员喜欢干的事,方案2呢,还可以,但控件不能太多。个人认为方案3有点新意,方法比较通用。下面说说如何实现。

    我们在ChildFrame中增加变量:

    CSplitterWnd m_wndSplitter;

    重写ChildFrame中OnCreateClient函数:

    BOOL CMyChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
    {
    /*return m_wndSplitter.Create(this,
    2, 2, // TODO: 调整行数和列数
    CSize(10, 10), // TODO: 调整最小窗格大小
    pContext);
    */
    m_wndSplitter.CreateStatic(this,1,2);
    m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CChildContorlView),CSize(200,0),pContext);
    m_wndSplitter.CreateView(0,1,pContext->m_pNewViewClass,CSize(0,0),pContext);
    SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
    return true;
    }

    这里是新建了2个视图,左视图的类为CChildContorlView,它是一个CFormView。第二个view为DocTemplate中的view类。

    这样左视图中可以用按钮控件这么来控制:

        CMyDoc* pDoc = DYNAMIC_DOWNCAST(CMyDoc,GetDocument());
    if(pDoc != NULL)
    {
    pDoc->itsName = strName;
    pDoc->UpdateAllViews(this);
    }

    而右视图可以用OnUpdate来读取Doc的参数信息,从而更新数据。




  • 相关阅读:
    Mysql存储引擎
    数据库事务的四大特性以及事务的隔离级别
    万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题
    万万没想到,JVM内存区域的面试题也可以问的这么难?
    SQL Server读取及导入Excel数据
    SQL Server加密与解密
    线程之间如何通信
    mybatis 批量更新 批量添加
    vue echarts 从后台获取数据形成饼图,柱状图,折线图
    vue 视频播放
  • 原文地址:https://www.cnblogs.com/zhangyonghugo/p/2308478.html
Copyright © 2011-2022 走看看