我做个一个画圆的小工程,我每次运行的时候也能画出个圆,但是我想我再画圆的时候保留这个圆,怎么办,我画第二个圆第一个圆就没了 我用mfc做的很简单的用菜单写的然后建个class写画法的那种,因为我要做橡皮擦擦掉我前面画的图形,所以我要保留前面的图形,怎么办呢.最好详细我,我很笨的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定义一个CArray <CRect,CRect> m_Ellipse;因为用Ellipse画圆时只要记录圆所在的矩形就行了,所以你每画一个圆将将相应的矩形用m_Ellipse.Add(..);加入到m_Ellipse中去,然后在OnPaint中用:for(int i=0;i<m_Ellipse.GetCount();i++) { CRect =m_Ellipse.GetAt(i); Ellipse(....);//画圆 } 对前1张图,拷贝到内存,下张图画在内存上,然后paint到scrren 创建一个设备兼容DC,然后把图拷贝到DC中,需要的时候就可以直接操作了, 我想楼主的做法应该是只在ONPAINT里面Ellipse画一次圆,只不过每次画的RECT是通过菜单选择后在界面上用通过鼠标拖动的范围来确定的,然后通过Invalidate来更新界面,ONPAINT就会执行。楼主最好把你画圆的代码和逻辑发出来,否则很难定位。假设你是在ONPAINT里面只用Ellipse画一次圆,那么不要调用Invalidate,换成InvalidateRect,只更新这次画圆的RECT,这样以外的地方就不会更新,一个RECT矩形区域,而不是椭圆区域,另外如果窗口自己更新调用ONPAINT时也会把以前更新掉。假设你是在ONPAINT里面掉用Ellipse画一次圆之前,还用FILLRECT来把整个客户区域都填充了,那肯定以前就没有了,上面的方法不行。你可以采用 ([兔子党党委机关处长])的方法,就是每次都保存,麻烦点,但很给力。简单点考虑,就是你写个自己的画圆函数,不要在ONPAINT里面画。通过GETDC()来得到显示DC,可以采用双缓冲,还可以实现拖动鼠标的时候实时更新椭圆。这样可以保证系统调用ONPAINT前不会被刷掉。啰嗦了这么多,其实就是一句话,直接画在窗口显示DC上的数据会在系统更新界面的时候刷掉,所以你需要在ONPAINT里把以前所有画的都重画一编, 而你画在窗口显示DC兼容的MEMDC上的数据不会被刷掉,所以你只要每次画的时候先画在MEMDC上,然后再拷贝到窗口显示DC就可以了,在ONPAINT里你也只需要把当前MEMDC的数据拷贝到窗口显示DC就行了。如有什么误人的地方,请各位大大指教。 对前1张图,拷贝到内存,下张图画在内存上,然后paint到scrren 看看CRectTracker是怎么做的吧,拖动矩形的时候,之前覆盖的内容制动恢复,并没有调用OnPaint()函数进行重绘,我也正在看CRectTracker的绘制的代码,上次CSDN上发了贴没人回复,所以最近正像找点时间自己看代码呢。 vista下获取主板序列号 重载CHtmlView加载网页后,确定网页已经加载完成且能清楚的看见,去不能对该view截图,请帮忙分析下原因 页面文件pagefile.sys,你能对之进行读写吗? LoadLibrary失败,何故? 关于打印的难题,在线等待。各位大侠帮忙啊!100份送上! 急!!!求一加密工具软件(要求、原因内详)!补足分 有个很棘手的问题? vs2008下 RTX SDK 7.0??? help,CDialogBar的Create中的nID应该如何设置!! 谁有国标码到大五码转换的源程序? VC++6.0如何实现开启线程? webbrowser获得部分网页并按照原样显示出来
因为用Ellipse画圆时只要记录圆所在的矩形就行了,所以你每画一个圆将将相应的矩形用m_Ellipse.Add(..);加入到m_Ellipse中去,然后在OnPaint中用:
for(int i=0;i<m_Ellipse.GetCount();i++)
{
CRect =m_Ellipse.GetAt(i);
Ellipse(....);//画圆 }
直接画在窗口显示DC上的数据会在系统更新界面的时候刷掉,所以你需要在ONPAINT里把以前所有画的都重画一编, 而你画在窗口显示DC兼容的MEMDC上的数据不会被刷掉,所以你只要每次画的时候先画在MEMDC上,然后再拷贝到窗口显示DC就可以了,在ONPAINT里你也只需要把当前MEMDC的数据拷贝到窗口显示DC就行了。如有什么误人的地方,请各位大大指教。