MFC画图 画第二次的时候第一次的图就被覆盖了。怎么能保存之前的绘图结果呢?

【用的双缓存】OnMouseMove里面我用了Invalidate();在OnDraw里我是这样写的CRectrect;GetClientRect(&rect);CDCd... 【用的双缓存】
OnMouseMove里面我用了Invalidate();
在OnDraw里我是这样写的
CRect rect;
GetClientRect(&rect);
CDC dcMem;
CBitmap bmp;
dcMem.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
dcMem.SelectObject(&bmp);
dcMem.FillSolidRect(rect,pDC->GetBkColor()); //这样背景是白色好像一直在刷新。。
dcMem.MoveTo(m_startpoint);
dcMem.LineTo(m_point);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
dcMem.DeleteDC();
bmp.DeleteObject();
画完一次松手,第二次再画,内存dc首先被刷成白色,之前的图像就没了。我想知道怎么能保留画过的图,就是说,以前的不会消失?
展开
 我来答
bhtzu
推荐于2017-12-16 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4109万
展开全部

要“保留画过的图,就是说,以前的不会消失”,需要这个“保留过的图”在OnDraw之中体现,并且要注意OnDraw之中的“顺序”,后画的必然覆盖先画的。

你的需求没有说清楚,我猜测之后,大概提几个建议:

  1. dcMem要做成View类的成员变量(指针),构造函数赋值NULL,Ondraw之中判断isNull则new然后CreateCompatibleDC(这样只创建一次),FillSolidRect,不要Delete(这个在析构函数)

  2. 画线(应该在Mouse操作函数中吧),直接在mouse的函数中dcMem->Moveto/LineTo

  3. OnDraw之中除了一个if分支创建内存DC,只剩下一条自己的语句了,那就是BitBlt。画线的各个结果保存在了memDC之中,这个因为是View类成员变量,在View不关闭之前,始终存在。

更多追问追答
追问
建议1我试了一下,但dcMem如果赋值NULL的话,视图区显示背景是黑色的。所以我在每次调用OnDraw中的函数时,都用dcMem.FillSolidRect(rect,pDC->GetBkColor());把背景填充成白色,然后就把前面的覆盖了,这还有别的办法么?
追答
建议1/2/3必须一起用啊。
如果代码不做大的改动,前面最快回答有一个建议是可行的,就是必须记录所有的画线,然后在FillSolidRect之后,全部都画一遍(而不是只画最后一条)。这样才可以实现。
来自:求助得到的回答
百度网友24ad2c263
2014-01-24 · 超过26用户采纳过TA的回答
知道答主
回答量:87
采纳率:0%
帮助的人:39万
展开全部
很久没弄这个东西了,大概有7年了,说说我当时的思路,需要有一个保存数据的数据结构,比如你画线,需要一个描述线的类CLine,里面存储start和end,然后每次画完,把当前线保存到一个数据结构里,可以是vector或者list,以后每次ondraw的时候,都要从数据结构里调出,重绘所有的线,这样,你画其他的线就不丢失了,程序退出还可以保存到文件中。仅供参考
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
锁骨的鱼
2014-01-24 · 超过29用户采纳过TA的回答
知道答主
回答量:73
采纳率:0%
帮助的人:51.3万
展开全部
定义一个CBitmap 变量

第一次画完存进该变量
之后每次画之前先把该CBitmap 贴上去
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式