使用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的参数信息,从而更新数据。




原文地址:https://www.cnblogs.com/zhangyonghugo/p/2308478.html