【请教】SDI中数据由Doc中即时传递至View中 请教高手在单文档中,如何使Doc中更新的数据即时的传递给View中?即当DOC中某个变量在程序运行中发生改变后,将最新的值传递给View类中?我在Doc中当该变量发生改变时使用UpdateAllViews(NULL),在View中用OnUpdate()来接收数据,但是不能接收到数据!!请问如何解决?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在多视类的情况下使用UpdateAllViews(NULL)和在View中用OnUpdate(),是可以成功接收到数据的,但是为什么在SDI的情况下却不行?? 你可以在View的头文件中,一般都有GetDocument()得到的指针,你可以用该指针得到文档中的数据 to:w_w_wQQ281344966() 这个我知道的!我是说Doc中的变量会不断的变化,我要把这个不断变化的数据传递给VIEW中在多视图中,一般是通过UpdateAllViews(NULL)来刷新各个视类,然后各个视类才能得到最新的数据!但是在SDI中为什么就不行了?? 在Doc中有按钮响应函数:void CDrawTestDoc::OnTest(){ m_test=123; //Doc中public成员变量 UpdateAllViews(NULL);}在View中有OnUpdate()如下:void CDrawTestView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/){ // TODO: Add your specialized code here and/or call the base class CDrawTestDoc* pDoc = GetDocument(); m_value=pDoc->m_test;}在断点调试时发现程序一运行就到OnUpdate里执行了, UpdateAllViews(NULL);根本不起到作用 你可以在Doc中使用SetModifyFlag()来设置修改标记。这时,MFC会自动调用与该Doc关联的视类来更新视图。当然了,如果你会操作文档管理器的话。你也可以及时更新你的视类。呵呵。 可以试试在DOC类中用INVALIDATE()函数,然后再VIEW类中的Ondraw()函数中获得文档指针,从而获得改变的量 TO:wangjingtaokkkkk() 是可以传递的,不过程序运行后要把窗体大小手动改变一下,让窗体发生重绘,然后结果就出来了,我在View中使用了INVALIDATE()函数能立即显示即时的数据了,但是前面显示过的数据不能擦除掉,只是用新的数据在同样位置代替了旧的数据。请教高人应该怎样刷新视图区?让先前在视图区显示的数据擦除掉再显示新的数据?? 因为你没有调用视图基类的OnUpdate,所以不会刷新,加一句手动刷新就可以了。void CDrawTestView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/) { // TODO: Add your specialized code here and/or call the base class CDrawTestDoc* pDoc = GetDocument(); m_value=pDoc- >m_test; Invalidate();//加一句} TO:Mackz(在相互)果然厉害,我就是少了 Invalidate();这一句了但是我加上以后,仍然有个问题存在: 因为我是把这个动态变化的数据从Doc里即时获得并在视类里用TextOut显示出来,我这样写好后运行,发现新的数据把以前的数据覆盖掉了,如果前一个数据很长就能看出来,但如果我手动重绘窗体后就不存在先前的数据了,被擦除掉了。 请教高手如何把先前的数据擦除掉?应该如何刷新? 你是说在Ondraw中显示doc中的数据吗设置要显示的数据长度可以吧 怎么通过Hook修改BCG界面库的菜单? 关于参数传递中new的错误 初学勾子,有问题请教! 如何更改ListCtl的图标? 使用media player控件,如何获取当前的播放时间 用_bstr_t访问Access的。。。。(在线等) 哥们急死了,谁能帮我找到图表的控件!万分感谢! 还是读图的问题!!!! 单文档程序使用了BCG 的office07风格后不能去掉标题栏 高分求助:如何用VC写一个象SOURCEINSIGHT分析C工程函数变量的程序? 怎么实现字符输入 第七个送分帖,感谢captain_x 无私、不厌其烦的帮忙,帮我解决了大问题
这个我知道的!
我是说Doc中的变量会不断的变化,我要把这个不断变化的数据传递给VIEW中
在多视图中,一般是通过UpdateAllViews(NULL)来刷新各个视类,然后各个视类才能得到最新的数据!
但是在SDI中为什么就不行了??
void CDrawTestDoc::OnTest()
{
m_test=123; //Doc中public成员变量
UpdateAllViews(NULL);
}
在View中有OnUpdate()如下:void CDrawTestView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
// TODO: Add your specialized code here and/or call the base class
CDrawTestDoc* pDoc = GetDocument();
m_value=pDoc->m_test;
}
在断点调试时发现程序一运行就到OnUpdate里执行了, UpdateAllViews(NULL);根本不起到作用
当然了,如果你会操作文档管理器的话。你也可以及时更新你的视类。
呵呵。
是可以传递的,不过程序运行后要把窗体大小手动改变一下,让窗体发生重绘,然后结果就出来了,我在View中使用了INVALIDATE()函数能立即显示即时的数据了,但是前面显示过的数据不能擦除掉,只是用新的数据在同样位置代替了旧的数据。
请教高人应该怎样刷新视图区?让先前在视图区显示的数据擦除掉再显示新的数据??
{
// TODO: Add your specialized code here and/or call the base class
CDrawTestDoc* pDoc = GetDocument();
m_value=pDoc- >m_test;
Invalidate();//加一句
}
果然厉害,我就是少了 Invalidate();这一句了
但是我加上以后,仍然有个问题存在:
因为我是把这个动态变化的数据从Doc里即时获得并在视类里用TextOut显示出来,我这样写好后运行,发现新的数据把以前的数据覆盖掉了,如果前一个数据很长就能看出来,但如果我手动重绘窗体后就不存在先前的数据了,被擦除掉了。
请教高手如何把先前的数据擦除掉?应该如何刷新?
设置要显示的数据长度可以吧