如题,假设我有一文档模板,如下:CMultiDocTemplate *pDocTemplate=new CMultiDocTemplate(IDR_MYFRAME,
RUNTIME_CLASS(CDocument),
RUMTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CFormView));
AddDocTemplate(pDocTemplate);这样添加之后,程序运行时我开了很多窗口,可能是一个、两个或三个,也许更多,怎样写消息可能让打开的这类文档全部接受消息并且同步更新数据呢?
即假设我这个上面有一个CListCtrl控件,我要让所有打开的子窗口上的这个控件更新数据,应该怎样操作?
RUNTIME_CLASS(CDocument),
RUMTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CFormView));
AddDocTemplate(pDocTemplate);这样添加之后,程序运行时我开了很多窗口,可能是一个、两个或三个,也许更多,怎样写消息可能让打开的这类文档全部接受消息并且同步更新数据呢?
即假设我这个上面有一个CListCtrl控件,我要让所有打开的子窗口上的这个控件更新数据,应该怎样操作?
1楼所说 UpdateAllViews(). 总之这是最基本的功能,没这个Doc/View就没意义了。
消息函数写在哪里?又得怎样调用UpdataAllViews()?
是否此时写的消息是用CDocument类的指针来做为SendMessage的第一个参数呢?
如题所说的文档模板,我的CDocument类中是没有存放数据,CFormView中有三个CEdit框,一个CButton,这些变量都放在CFormView之中,我写了一个加法程序用来测试消息,点击CButton之后,调用这个加法类,加法做完后发送消息通知CEdit控件更新,显示和值.
我想要做的是将所有的相同类型子窗口都更新,该怎样用UpdateAllViews()呢?
pDoc=(CDocument *)(((CMainFrame *)AfxGetMainWnd())->GetActiveDocument());//得到文档指针
pDoc->UpdateAllViews();
这个UpdateAllViews()是我还没弄明白原理和用法。
我所讲的例子中,控件相关的变量都是CFormView中,CDocument类里没有任何数据和变量的,所以不明白调用这个函数的它怎么去更新视,按道理,它只会更新与CDocument类中的变量的值,如果里面没有变量的,它应该是不会更新的吧?
我最终想做的是,不论这个文档开多少个,都能一起响应动作,就像一个窗口一下。
首先,点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;
}求牛人看看!