关于双缓冲在OnPaint中解决闪屏

来源:互联网 发布:mafiaqiu淘宝店没了 编辑:程序博客网 时间:2024/06/08 01:23
</pre><p>由于要读取设备的数据,进而绘出数据的趋势图,所以需要不断的刷新屏幕进而进行读数据。但是由于刷屏一直会造成严重的闪屏,所以参照网上的方法,利用双缓冲技术进行函数重载绘制,但是一直仍旧闪屏,最后找到问题的根源,更改之后的效果确实良好,防止了屏幕出现闪屏,但是我的编码过程中也与网上的方法有稍稍不同,为了防止有人走我的弯路,在此将方法进行说明。首先,思想仍然是双缓冲的技术思想,但是由于要求是在控件中进行重载绘制,因此事不能牵扯到父窗口的绘制的。故此,选择重载函数OnPaint()进行图形的绘制。当进行重载之后,默认是</p><pre><p></p>
void CMY_Static::OnPaint(){CPaintDC dc(this); // device context for painting        CRect rect;//设计整个绘图区域大小的矩形}


<pre name="code" class="cpp">

所有的绘图操作全在其中,于是我们进行创建一个内存DC和一个获取当前控件DC的指针*pDC,当然还有画布MemBitmap;

CDC *pDC;CDC MemDC;   //创建兼容的内存DCCBitmap MemBitmap;  //创立画布之后由指针获取当前控件的DC 
 pDC=GetDC();       GetClientRect(&rect);   //获取客户端区域大小       pDC=GetDC();//选定与客户端区域大小相同的位置创建绘制位图MemDC.CreateCompatibleDC(pDC);MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());MemDC.SelectObject(&MemBitmap);   //将位图选进内存中MemDC.SelectObject(&pen);MemDC.FillSolidRect(rect,RGB(255,255,255));//现在开始你的所有绘画操作均可以进行,但是前提都是MemDC进行绘制的。//设置左上角矩形范围rect1.top=rect.top;    rect1.left=rect.left;rect1.right=rect.left+50;rect1.bottom=rect.top+30;//设置左下角矩形范围rect2.top=rect.bottom-30;rect2.left=rect.left;rect2.right=rect.left+50;rect2.bottom=rect.bottom;//绘制整个显示范围//if (m_draw_flag){//绘制左上角参数MemDC.SelectStockObject(NULL_PEN);MemDC.Rectangle(rect1);MemDC.SetTextColor(RGB(0,0,255));MemDC.DrawText(str1,rect1,0);//绘制左下角参数MemDC.SelectStockObject(NULL_PEN);MemDC.Rectangle(rect2);MemDC.SetTextColor(RGB(255,0,0));MemDC.DrawText(str2,rect2,0);}//绘制移动游标      CPoint start_point[5];    //游标的起始点  CBrush brush1;  brush1.CreateSolidBrush(RGB(255,0,0));  MemDC.SelectObject(&brush1);  start_point[0].x=rect.right-15;  start_point[0].y=trend[0]*zoomy;  start_point[1].x=rect.right-10;  start_point[1].y=start_point[0].y-5;  start_point[2].x=rect.right;  start_point[2].y=start_point[0].y-5;  start_point[3].x=rect.right;  start_point[3].y=start_point[0].y+5;  start_point[4].x=rect.right-10;  start_point[4].y=start_point[0].y+5;  MemDC.Polygon(start_point,5);   //绘制趋势线性图    CPen m_trendpen;   //绘制画笔  m_trendpen.CreatePen(PS_SOLID,2,RGB(255,0,0));  MemDC.SelectObject(&m_trendpen); int i=0;  while(i<20) {  MemDC.MoveTo(rect.right-15-zoomx*10*i,zoomy*trend[i]); MemDC.LineTo(rect.right-15-zoomx*10*(i+1),zoomy*trend[i+1]); i++; }//然后开始讲内存中已经绘制好的一次性全部呈现到屏幕上pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);


之后是一些资源的删除释放。

整个过程要注意的是,千万不能够以OnPaint函数提供的dc进行绘制图形,否则就不是真正地双缓冲了,通知,创建一个指针指向当前的控件DC相对效率会高一些。

因为我在绘制窗口的时候,采用dc直接进行绘制的时候,发现仍有闪屏,而这点很多双缓冲技术上没有提及的!

	
				
		
原创粉丝点击