vc++中,做的一个画图的小程序,怎么在窗口重画后使图像不消失?绘制代码不在ondraw()函数里面。
因为是对不同的按钮响应,绘制不同的图形,所以绘制代码都在相应的按钮响应函数里,不在OnPaint()里。我想的是在窗口重画之前,先保存客户区的图像,重画之后再贴回来。但是...
因为是对不同的按钮响应,绘制不同的图形,所以绘制代码都在相应的按钮响应函数里,不在OnPaint()里。
我想的是在窗口重画之前,先保存客户区的图像,重画之后再贴回来。但是应该怎么做呢? 展开
我想的是在窗口重画之前,先保存客户区的图像,重画之后再贴回来。但是应该怎么做呢? 展开
3个回答
展开全部
一般MFC中 OnDraw(CDC*pDC) 这个函数 后面都有 CDC*pDC
HDC就是最原始的 DC 句柄 ,在MFC中,为了将API封装成一个类来操作,因此多出来了一个CDC
所以你说的那块绘图的区域 就是定义一块内存!
双缓充技术 就是开2个DC
CDC MemDC1;
CDC MemDC2;
MemDC1.MoveTo(20,420);
MemDC1.LineTo(425,420);//这是画到第一个
MemDC2.MoveTo(20,420);
MemDC2.LineTo(425,420);//这是画到第二个
pDC->BitBlt(x,y,450,460,&MemDC1,0,0,SRCCOPY);把第一块内存画到显示上去
pDC->BitBlt(x,y,450,460,&MemDC2,0,0,SRCCOPY);把第二块内存画到显示上去
上面就是最简单的 双缓冲 例子
如果觉得不详细,你可以看看一楼的传送门,或者直接网上找个例子看看
HDC就是最原始的 DC 句柄 ,在MFC中,为了将API封装成一个类来操作,因此多出来了一个CDC
所以你说的那块绘图的区域 就是定义一块内存!
双缓充技术 就是开2个DC
CDC MemDC1;
CDC MemDC2;
MemDC1.MoveTo(20,420);
MemDC1.LineTo(425,420);//这是画到第一个
MemDC2.MoveTo(20,420);
MemDC2.LineTo(425,420);//这是画到第二个
pDC->BitBlt(x,y,450,460,&MemDC1,0,0,SRCCOPY);把第一块内存画到显示上去
pDC->BitBlt(x,y,450,460,&MemDC2,0,0,SRCCOPY);把第二块内存画到显示上去
上面就是最简单的 双缓冲 例子
如果觉得不详细,你可以看看一楼的传送门,或者直接网上找个例子看看
展开全部
追问
照着写的:
CBitmap m_bmp;
m_bmp.CreateCompatibleBitmap(&m_dcMemory,rect.Width(),rect.Height());
::SelectObject(m_dcMemory.GetSafeHdc(),m_bmp);
CPen pen(2,2,RGB(255,0,0));
::SelectObject(m_dcMemory.GetSafeHdc(),pen);
m_dcMemory.MoveTo(0,0);
m_dcMemory.LineTo(200,300);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcMemory,0,0,SRCCOPY);
本意是画一条红线,但客户区全是黑的。请问?
参考资料: http://www.vckbase.com/document/viewdoc/?id=1612
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-04-13
展开全部
你使客户区置为无效,也就是要重新刷新整个客户区或者某个具体的客户区域
在按钮的执行函数中的最后添加刷新函数
整个客户区用:void Invalidate( BOOL bErase = TRUE );
具体区域用:void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
在按钮的执行函数中的最后添加刷新函数
整个客户区用:void Invalidate( BOOL bErase = TRUE );
具体区域用:void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询