⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_49260.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:49260 发表者:mesen 发表日期:2003-08-08 13:59:34
<br>主题:关于重绘效率的问题
<br>内容:工具:MFC,VC60;用的是文档视图结构框架<BR>CFrame有三个分裂窗口View1,View2,View3,我在View3中修改了其成员变量,并想让这个视图按新修改后的数据进行重绘。<BR>我能想到的方法是直接调用文档指针:GetDocument()-&gt;UpdateAllViews(NULL);但这样势必将三个视图统统重绘,有点太浪费了点,我只是想让View3重绘,应该还有其它办法吧,比如直接调用CView的某个成员函数,但我不知道到底该调用那个函数,请朋友们帮忙出个主意。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:金源 回复日期:2003-08-08 14:55:30
<br>内容:UpdateAllViews的原码如下:<BR><BR>void CDocument::UpdateAllView(CView* pSender, LPARAM lHint, CObject* pHint)<BR>&nbsp;&nbsp;&nbsp;&nbsp;// walk through all views<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pSender == NULL || !m_viewList.IsEmpty());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// must have views if sent by one of them<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;POSITION pos = GetFirstViewPosition();<BR>&nbsp;&nbsp;&nbsp;&nbsp;while (pos != NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CView* pView = GetNextView(pos);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT_VALID(pView);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pView != pSender)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pView-&gt;OnUpdate(pSender, lHint, pHint);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>可以看出,UpdateAllViews调用OnUpdate实现对除pSender外的每一个视的更新,如果你想对某一个视更新,是一下调用它的OnUpdate,或者用Invalidate,其实二者是一样的原码如下:<BR><BR>void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pSender != this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;UNUSED(pSender);&nbsp;&nbsp;&nbsp;&nbsp; // unused in release builds<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// invalidate the entire pane, erase background too<BR>&nbsp;&nbsp;&nbsp;&nbsp;Invalidate(TRUE);<BR>}<BR><BR>然后Invalidate(TRUE)通过OnDraw重绘了视。(我想是这样)<BR><BR>请再注意一下 UpdateAllViews 的后两个参数LPARAM lHint, CObject* pHint它们对提高绘图效率是很有帮助的。<BR><BR>比如你只想重绘一个Rect,那么如下:<BR><BR>//in doc class<BR>UpdateAllViews(NULL,1,(CObject*)pRect);<BR><BR>//in view class<BR>void CMyView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(lHint==1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CRect *pRect == (*CRect) pHint;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvalidateRect(pRect);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CView::OnUpdate(........);<BR>}<BR><BR>你也可以对特定的CObject对象重画,方法全在你!<BR><BR>请批评指正!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:mesen 回复日期:2003-08-08 15:08:12
<br>内容:谢谢你我明白了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金源 回复日期:2003-08-08 15:11:20
<br>内容:不客气
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -