VC的内存绘图防止屏幕闪烁技术的实现

转自:http://xvdongming001.blog.163.com/blog/static/739891892008513105535645/

在工业控制系统中,经常需要实时的显示一些曲线,运用传统的绘图方法,会引起屏幕的强烈闪烁。现在常用的解决方法是:利用内存绘图的技术,将需显示的图形绘制在内存位图中,然后再拷贝到屏幕上,很好的解决了屏幕闪烁的问题。并且处理速度快。

其实VC的内存绘图的资料网上也很多,本人根据自己的实践经验,并结合网友的文章,给出一个简单的编程实例,仅供网友参考。

编程实现:

第一步:用VC6.0生成一个基于对话框的工程,起名为:xv001。

在对话框上添加一个Picture控件,设置ID为IDC_COORD,调整控件的位置和大小,直至合适。

在xv001Dlg的类中添加以下变量:

 CRect rect;                  // 存储绘图控件的绘图区域
        CDC *pDC;                  // 控件的屏幕绘图设备指针
        CDC memDC;              // 内存绘图设备
        CBitmap memBitmap;  // 用于内存绘图的位图  
        CBitmap* pOldBmp;    // 备份旧的位图指针 
        CWnd* pWnd;             // 绘图控件的指针

 第二步:用ClassWizard在xv001Dlg类中添加OnInitDialog()消息响应函数。实现绘图需要变量的初始化工作,具体代码如下:

pWnd = GetDlgItem(IDC_COORD); // 获得对话框上的picture的窗口句柄
       pWnd->GetClientRect(&rect);         
// 获取绘制坐标的文本框

pDC = pWnd->GetDC();                 // 获得对话框上的picture的设备指针
       pOldBmp = NULL;                           // 将旧的位图指针置空
       // 创建内存绘图设备,使内存位图的DC与控件的DC关联
       memDC.CreateCompatibleDC(pDC); 
       memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
       pOldBmp = memDC.SelectObject(&memBitmap);
第三步:在xv001Dlg类中添加绘图函数,此函数的功能是:随机绘制一幅位图。

void CXv001Dlg::DrawWave(CDC *pDC)
{
 CPen pen,*oldpen;
 
 memDC.Rectangle(rect.left,rect.top,rect.right,rect.bottom);
 for(int i =0; i<1500; i++)
 {
  pen.CreatePen(PS_SOLID,1, RGB(rand()%255,rand()%255,rand()%255));    
  oldpen = memDC.SelectObject(&pen);
  
  int x0,y0,x1,y1;
  
  x0 = rand()%rect.Width();
  x1 = rand()%rect.Width();
  y0 = rand()%rect.Height();
  y1 = rand()%rect.Height();
  
  memDC.MoveTo(x0,y0);
  memDC.LineTo(x1,y1);
  
  memDC.SelectObject(oldpen);
  pen.DeleteObject();
 }
}

第四步:在xv001Dlg类中添加OnTimer()、OnPaint()和OnClose的消息响应函数。

在OnInitDialog()函数总添加如下代码

 SetTimer(1,10,NULL);          // 启动定时器

在OnTimer()函数中添加

DrawWave(&memDC);         // 在位图中画图片 
       OnPaint();                            // 使屏幕刷新         

在OnPaint()函数中添加如下代码,实现将生成的图片拷贝到屏幕上,完成整个绘图的工作。

pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); 

最后:在OnClose()函数中,别忘了销毁绘图及位图设备的指针。

 memDC.SelectObject(pOldBmp);
        memDC.DeleteDC();
        memBitmap.DeleteObject();

程序执行结果如下:

此程序在winxp系统下,用VC++6.0调试通过。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值