2 missfaye missfaye 于 2015.07.15 16:28 提问

MFC 基于对话框的画图问题 OnPaint()函数不解

我在对话框中插入了一个tab control,用来画两个曲线图,其中一个是直接在界面上画的,用Moveto和Lineto函数,但是为什么我在切换tab控件的时候,那个曲线之前画的图像都没有了,从我切换过去之后重新开始画了呢?麻烦大家啦~

5个回答

Tiger_Zhao
Tiger_Zhao   Rxr 2015.07.15 17:01
已采纳

Tab切换会重新刷新,绘图内容会清除。
你要保留旧图就应该用绘图缓冲区,先在缓冲区中绘图,输出到界面。
Tab切换时就不用从头绘图,直接把缓冲区输出到界面。

Tiger_Zhao
Tiger_Zhao 回复missfaye: 曲线画在m_dcMemory 里别擦掉啊,怎么可能没的?是不是你显示的地方被别的控件遮盖了?
2 年多之前 回复
missfaye
missfaye 回复Tiger_Zhao: 不好意思再问下,我按照您说的试了一下,但是我是动态画曲线,所以在OnPaint里不能画完整个曲线,结果就是我Tab切换之后只显示前一次画的一条线,这个要怎么处理呢
2 年多之前 回复
Tiger_Zhao
Tiger_Zhao 回复missfaye: CDC类型,定义为对话框的模块级变量就行。
2 年多之前 回复
missfaye
missfaye 回复Tiger_Zhao: 还想问下,这个m_dcMemory 是什么类型的变量呢?怎么样一直保留着啊,我是新人,有好多不懂的,见谅..
2 年多之前 回复
missfaye
missfaye 这个是要在OnPaint()函数中操作的么?
2 年多之前 回复
Tiger_Zhao
Tiger_Zhao [MFC 双缓冲 画图](http://blog.csdn.net/zhoxier/article/details/7542371"") 参考一下。你需要把 m_dcMemory 一直保留着。
2 年多之前 回复
hong__fang
hong__fang   2015.07.15 16:52

切换函数可能触发了onpaint函数,把窗口重新刷新了,以前画的就给刷掉了,把绘图重新放在onpaint每次刷新就重画,这样以前的就会显示了。 view类的ondraw函数是这样,所以可能是这个原因。

oyljerry
oyljerry   Ds   Rxr 2015.07.15 16:57

切换tab的时候,OnPaint也跟着换了,之前的绘图就没有了吧。
你所有的绘图都放到每个tab页面的OnPaint中

zuishikonghuan
zuishikonghuan   2015.07.15 21:49

因为你把图绘制到control的设备场景中,但是设备场景失效后在必要时会被系统刷新,系统通过DefWindowProc处理WM_PAINT重画control,也就是mfc里的OnPaint,所以你应该在这个里面画,同时不让系统再画了,这样control每次重画都会画上你的图,这样你的图就“一直存在了”

zuishikonghuan
zuishikonghuan 回复missfaye: mfc我也不是很清楚,win32可以在WM_PAINT里返回0,mfc的onpaint就是WM_PAINT映射出来的,应该也是返回0吧
2 年多之前 回复
missfaye
missfaye 回复zuishikonghuan: 怎么样做才能达到 同时不让系统再画了?
2 年多之前 回复
zuishikonghuan
zuishikonghuan 或者把图事先画在一个内存dc里面(可以看做是一个缓冲区),每次OnPaint直接dc复制,这样做会多使用内存,但是能提高重画效率(节省CPU)
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2015.07.16 15:30

MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片