如题,假设我有一文档模板,如下:CMultiDocTemplate *pDocTemplate=new CMultiDocTemplate(IDR_MYFRAME,
     RUNTIME_CLASS(CDocument),
     RUMTIME_CLASS(CMDIChildWnd),
     RUNTIME_CLASS(CFormView));
AddDocTemplate(pDocTemplate);这样添加之后,程序运行时我开了很多窗口,可能是一个、两个或三个,也许更多,怎样写消息可能让打开的这类文档全部接受消息并且同步更新数据呢?
即假设我这个上面有一个CListCtrl控件,我要让所有打开的子窗口上的这个控件更新数据,应该怎样操作?

解决方案 »

  1.   

    MFC的Doc/View框架最基本的功能就是管理一个View的Array,然后统一发消息处理更新,如
    1楼所说 UpdateAllViews(). 总之这是最基本的功能,没这个Doc/View就没意义了。
      

  2.   

    要将消息函数写在CDocument类中吗?
      

  3.   

    楼上两位大哥,能再讲得详细点吗?
    消息函数写在哪里?又得怎样调用UpdataAllViews()?
    是否此时写的消息是用CDocument类的指针来做为SendMessage的第一个参数呢?
      

  4.   

    各位大哥帮助解决一下啊,我再说详细一点。我写了一个测试程序,
    如题所说的文档模板,我的CDocument类中是没有存放数据,CFormView中有三个CEdit框,一个CButton,这些变量都放在CFormView之中,我写了一个加法程序用来测试消息,点击CButton之后,调用这个加法类,加法做完后发送消息通知CEdit控件更新,显示和值.
    我想要做的是将所有的相同类型子窗口都更新,该怎样用UpdateAllViews()呢?
      

  5.   

    CEdit控件更新后
    pDoc=(CDocument *)(((CMainFrame *)AfxGetMainWnd())->GetActiveDocument());//得到文档指针
    pDoc->UpdateAllViews();
      

  6.   

    如果UpdateAllViews(NULL)参数为NULL,警告可能会堆栈溢出,实际运行也是中断了
      

  7.   

    或者你可以试试CWnd::SendMessageToDescendants Call this member function to send the specified Windows message to all descendant windows. 
      

  8.   

    其实你原先说的方法很好呀,上次多谢你告诉我怎么去发送消息,我按照你的代码试了,能给当前的活动文档响应消息,其实我是一直想找给所有同类的模板发消息并通知更新的。
    这个UpdateAllViews()是我还没弄明白原理和用法。
    我所讲的例子中,控件相关的变量都是CFormView中,CDocument类里没有任何数据和变量的,所以不明白调用这个函数的它怎么去更新视,按道理,它只会更新与CDocument类中的变量的值,如果里面没有变量的,它应该是不会更新的吧?
    我最终想做的是,不论这个文档开多少个,都能一起响应动作,就像一个窗口一下。
      

  9.   

    最好的办法就是F11进入UpdateAllViews函数中看看发生了什么现象~
      

  10.   

    大哥,能先回答一下我11楼的问题不,我的CDocument类中是没有变量和数据的,控件相关的变量和数据都在CFormView之中,调用这个函数,让我感觉有点摸不着头脑,难道我调用CDocument::UpdateAllViews这个函数,它会自动取当前的CFormView中变量的值,再去跟据这个值更新所有的窗口吗?
      

  11.   

    我还是讲一下流程吧
    首先,点CFormView上的SUM按钮,会调用Sum类的加法程序void CMDIView::OnBnClickedButton1()//SUM按钮
    {
    .....
            CSum u;
    u.sum(number1,number2);//调用加法程序
    }做完加法之后void CSum::sum(int a, int b)//加法程序
    {
    int s=a+b;
    CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->GetMainWnd();
    ASSERT(pFrame);
    CChildFrame *pChild=(CChildFrame*)pFrame->GetActiveFrame();
    if(pChild)
    {
    CMDIView *pView=(CMDIView*)pChild->GetActiveView();
    ASSERT(pView);
    pView->SendMessage(WM_USER_SUM,0,(LPARAM)s);//做完后发送自定义消息到当前活动窗口
    }
    }在CFormView之中响应我的自定义消息LRESULT CMDIView::OnSum(WPARAM wParam, LPARAM lParam)
    {
    int s=(int)lParam;
    CWnd *pnd=GetDlgItem(IDC_EDIT3);
    CString str;
    str.Format("%d",s);
    pnd->SetWindowText(str);//第一种方法
    CMDIDoc *pDoc=(CMDIDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
    pDoc->UpdateAllViews();//这里调用UpdateAllViews,我在我的CMDIDoc文档中写了这个函数,该函数的原型是void UpdateAllViews(/*CView *pSender,LPARAM lHint=0,CObject *pHint=0*/);不论我怎样改这个参数,反正调用都会堆栈溢出
    //第二种方法
    /*CWinApp *pApp=AfxGetApp();
    POSITION PosDocTemplate=pApp->GetFirstDocTemplatePosition();
    while(PosDocTemplate)
    {
    CDocTemplate *pDocTemplate=pApp->GetNextDocTemplate(PosDocTemplate); POSITION PosDoc=pDocTemplate->GetFirstDocPosition();
    {
    while(PosDoc)
    {
    CDocument *pDoc=pDocTemplate->GetNextDoc(PosDoc); POSITION PosView=pDoc->GetFirstViewPosition();
    while(PosView)
    {
    CView *pView=pDoc->GetNextView(PosView);
    //pnd->SetWindowText(str);
    pView->UpdateData(FALSE);
    }
    }
    }
    }*/
    return 0;
    }求牛人看看!
      

  12.   

    SendMessageToDescendants(父窗口向其所有子窗口发消息时使用)