MDI视图同步更新 30

建立一个mfc多文档应用程序,视图类派生自CEditView,我想实现当点击菜单【窗口】-【新建窗口】,产生的新窗口与以前打开的窗口显示相同的文字,且在其中任何一个窗口输... 建立一个mfc多文档应用程序,视图类派生自CEditView,我想实现当点击菜单【窗口】-【新建窗口】,产生的新窗口与以前打开的窗口显示相同的文字,且在其中任何一个窗口输入文字后,另外的窗口也同步更新的功能,望高手指教,谢谢! 展开
 我来答
ssilspro
推荐于2020-12-30 · TA获得超过2625个赞
知道大有可为答主
回答量:1148
采纳率:0%
帮助的人:1719万
展开全部
窗口->新建窗口的功能,向导默认给你添加了,多个视图共用一个文档,你只要更新就行了
在视图里需要更新的地方this->m_pDocument->UpdateAllViews(NULL);更新所有视图
如果当前视图已经更新,里面的指针添this就行,会忽略this指的视图
还有editview的edit的数据默认没写到文档对象里,直接用edit的数据处理的, 要么更新时把更新的view复制到其他view,要么把数据写到文档里,view用文档更新
追问
不是很明白,我是这样做的:在View和doc中分别加入CString对象m_strView及m_strDoc,打开文件时加载数据到m_strDoc中,并重写了View的OnChar函数,在函数里面更新m_strDoc的内容,同时调用你说的UpdateAllViews函数更新所有视图,然后在OnDraw函数里用TextOut显示内容。但是在点【新建窗口】,产生的的视图还是空白的。能不能给点儿具体的示例啊,谢谢了
追答
Serialize调用SerializeRaw,然后调用 ReadFromArchive / WriteToArchive,
这2个函数直接操作editview的edit控件了,按这2个函数里的代码写就好
在doc里加个CString, 重载view的OnEnChange和OnUpdate
//OnEnChange
CEditFormMFC71Doc* pDoc = this->GetDocument();
LPCTSTR lpszText = LockBuffer();
ASSERT(lpszText != NULL);
UINT nLen = GetBufferLength();
pDoc->str = CString(lpszText,nLen*sizeof(TCHAR));
UnlockBuffer();
pDoc->UpdateAllViews(this);
//OnUpdate
CEditFormMFC71Doc* pDoc = this->GetDocument();
UINT nLen = pDoc->str.GetLength();
LPVOID hText = LocalAlloc(LMEM_MOVEABLE, (nLen+1)*sizeof(TCHAR));
if (hText == NULL)AfxThrowMemoryException();
LPTSTR lpszText = (LPTSTR)LocalLock(hText);
ASSERT(lpszText != NULL);
CopyMemory(lpszText,pDoc->str.GetBuffer(),nLen*sizeof(TCHAR));
pDoc->str.ReleaseBuffer();
lpszText[nLen] = '\0';
LocalUnlock(hText);
HLOCAL hOldText = GetEditCtrl().GetHandle();
ASSERT(hOldText != NULL);
LocalFree(hOldText);
GetEditCtrl().SetHandle((HLOCAL)hText);
this->Invalidate();
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式