拆分窗口的同步更新

    技术2022-05-20  32

         今天做了拆分窗口和窗口同步更新,以及视图和文档实现数据沟通的实验,问题多多、、、

        实验的步骤是

    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()函数。。。具体代码如下:

       void twoview::OnInitialUpdate(){ CView::OnInitialUpdate(); CMainFrame* pMain=(CMainFrame*)AfxGetMainWnd(); if (m_pDocument==NULL) { POSITION pos=AfxGetApp()->GetFirstDocTemplatePosition(); CDocTemplate * pDocTemplate=AfxGetApp()->GetNextDocTemplate(pos); pos=pDocTemplate->GetFirstDocPosition(); CDocument * pDoc=pDocTemplate->GetNextDoc(pos); pDoc->AddView(this); }}  

     


    最新回复(0)