关于双缓冲在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直接进行绘制的时候,发现仍有闪屏,而这点很多双缓冲技术上没有提及的!
- 关于双缓冲在OnPaint中解决闪屏
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题
- 如何在OnPaint里用gdi+实现双缓冲画图
- MFC中重写OnPaint实现双缓冲绘图
- [MFC]OnPaint双缓冲绘图
- 在OnPaint中 CListCtrl 闪烁
- JAVA中解决双缓冲现象
- 关于bmp图像,在Onpaint中画图时一闪而过的问题
- 用双缓冲进行绘图可解决在VC中绘图时的闪烁现象[ 转]
- 在vc中如何用双缓冲的方法解决重绘闪屏的问题
- MFC在非OnDraw、OnPaint中绘图
- 【MFC】利用双缓冲技术解决屏闪问题
- 双缓冲法解决重绘和闪屏问题
- C#使用双缓冲解决绘图闪屏的问题
- 双缓冲法解决重绘和闪屏问题
- c++控制台程序双缓冲解决闪屏
- 在SurfaceView中使用双缓冲
- Matlab在训练神经网络时突然停止
- Linux 系统日志的组成
- oracle(6)pl/sql的进价 编写分页过程
- 关于gridview中点击按钮获取主键的方法
- FreeBSD各种锁的用法和组合(ZZ)
- 关于双缓冲在OnPaint中解决闪屏
- 关于TOMCAT6+COMET出现405 Method Not Allowed错误解决方法
- 英语词汇16
- 进程操作-查看进程优先级
- 移动环境下push技术开发(01-androidpn环境的配置)
- MyEclipse 8.6反编译插件安装
- 网络基础
- 异步请求、处理JSON对象
- 视图类 文档类 框架类 应用程序类之间指针的互相获取