今天做了拆分窗口和窗口同步更新,以及视图和文档实现数据沟通的实验,问题多多、、、
实验的步骤是
1:在主窗口类中声明一个CSplitterWnd类的成员变m_splitterwnd
2:重载主窗口中继承cwnd的成员函数OnCreateClient
3:利用函数CreateStatic来重载OnCreateClient,最后记得因为是静态创建,所以还要调用Create函数来初始化各个窗口对象
以下是代码
先在文档类中定义一个成员变量m_string,在构造函数中初始化为
“shizhan”;
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext )
{
m_splitterwnd.CreateStatic(this,2,2);
m_splitterwnd.CreateView(0, 0, RUNTIME_CLASS(CFirstView), CSize(0, 0),
pContext);
m_splitterwnd.CreateView(0, 1, RUNTIME_CLASS(CTwoView), CSize(0, 0),
pContext);
m_splitterwnd.CreateView(1, 0, RUNTIME_CLASS(CThreeView), CSize(0, 0),
pContext);
m_splitterwnd.CreateView(1, 1,RUNTIME_CLASS( CFourView), CSize(0, 0),
pContext);
return 1;
}
note:记住上面的RUNTIME_CLASS宏不能少掉,否则编译则无法通过
然后声明四个拆分窗口对象,在四个拆分窗口对象OnDraw初始化图像
CString b=((CspiltterwndDoc*)(pDoc))->m_string;
pDC->SetTextColor(RGB(0,46,80));
pDC->TextOut(20,20,b);
四个类的函数都是一致的。。。。
note:((CspiltterwndDoc*)(pDoc))这个转换当初少写个括号,老是转换不成功,以后要多多注意这种小问题。。
在.rc文件中修改菜单项,添加两个菜单子项first和two,用来更改各个拆分窗口的图像。。。
在first和two上添加事件处理程序。。。
代码如下
void CFirstView::Onfirst()
{
CspiltterwndDoc* pDoc=(CspiltterwndDoc*)GetDocument();
pDoc->m_string="first";
pDoc->UpdateAllViews(NULL);
// TODO: 在此添加命令处理程序代码
}
void CFirstView::Ontwo()
{
CspiltterwndDoc* pDoc=(CspiltterwndDoc*)GetDocument();
pDoc->m_string="two";
pDoc->UpdateAllViews(NULL);
// TODO: 在此添加命令处理程序代码
}
note:上面的文档和视图的关联是通过pContext参数由系统帮助我们实现的,如果我们想自己手动关联视图和文档,把pContext设置为空,然后重写每个view里面的OnInitalUpDate()函数。。。具体代码如下: