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首先被刷成白色,之前的图像就没了。我想知道怎么能保留画过的图,就是说,以前的不会消失? 展开
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首先被刷成白色,之前的图像就没了。我想知道怎么能保留画过的图,就是说,以前的不会消失? 展开
3个回答
展开全部
要“保留画过的图,就是说,以前的不会消失”,需要这个“保留过的图”在OnDraw之中体现,并且要注意OnDraw之中的“顺序”,后画的必然覆盖先画的。
你的需求没有说清楚,我猜测之后,大概提几个建议:
dcMem要做成View类的成员变量(指针),构造函数赋值NULL,Ondraw之中判断isNull则new然后CreateCompatibleDC(这样只创建一次),FillSolidRect,不要Delete(这个在析构函数)
画线(应该在Mouse操作函数中吧),直接在mouse的函数中dcMem->Moveto/LineTo
OnDraw之中除了一个if分支创建内存DC,只剩下一条自己的语句了,那就是BitBlt。画线的各个结果保存在了memDC之中,这个因为是View类成员变量,在View不关闭之前,始终存在。
更多追问追答
追问
建议1我试了一下,但dcMem如果赋值NULL的话,视图区显示背景是黑色的。所以我在每次调用OnDraw中的函数时,都用dcMem.FillSolidRect(rect,pDC->GetBkColor());把背景填充成白色,然后就把前面的覆盖了,这还有别的办法么?
追答
建议1/2/3必须一起用啊。
如果代码不做大的改动,前面最快回答有一个建议是可行的,就是必须记录所有的画线,然后在FillSolidRect之后,全部都画一遍(而不是只画最后一条)。这样才可以实现。
来自:求助得到的回答
展开全部
很久没弄这个东西了,大概有7年了,说说我当时的思路,需要有一个保存数据的数据结构,比如你画线,需要一个描述线的类CLine,里面存储start和end,然后每次画完,把当前线保存到一个数据结构里,可以是vector或者list,以后每次ondraw的时候,都要从数据结构里调出,重绘所有的线,这样,你画其他的线就不丢失了,程序退出还可以保存到文件中。仅供参考
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定义一个CBitmap 变量
第一次画完存进该变量
之后每次画之前先把该CBitmap 贴上去
第一次画完存进该变量
之后每次画之前先把该CBitmap 贴上去
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询