儿童口腔疱疹几天能好:VC的内存绘图防止屏幕闪烁技术的实现 - 独爱糕 - CSDN博客
来源:百度文库 编辑:中财网 时间:2024/05/04 14:39:07
在工业控制系统中,经常需要实时的显示一些曲线,运用传统的绘图方法,会引起屏幕的强烈闪烁。现在常用的解决方法是:利用内存绘图的技术,将需显示的图形绘制在内存位图中,然后再拷贝到屏幕上,很好的解决了屏幕闪烁的问题。并且处理速度快。其实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调试通过。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx
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调试通过。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidy22/archive/2009/08/06/4419415.aspx
如何实现网页背景的闪烁
VC++关于简单绘图的程序!
VC++关于简单绘图的程序!
笔记本屏幕闪烁的问题
●●【急!!】内存使用率过高和屏幕闪烁的问题,高手请进!!
★★【急!!】内存使用率过高,屏幕闪烁的问题,高手请进!!
vc如何实现识别特定的屏幕上显示的图片
vC#显示时间的实现
VC++实现的两个程序
三国群英传的屏幕闪烁的问题。
关于文字闪烁的代码,怎么实现?
如何实现网页标题栏内容的闪烁
怎么在dreamweaver实现字的闪烁
blog的实现技术
如何消除显示器屏幕闪烁的现象
七彩虹9550屏幕闪烁的问题
我的lcd显示器屏幕老师闪烁
我的显示器屏幕 为什么闪烁
为什么3230的屏幕有些闪烁>
电脑的屏幕老是闪烁是什么原因
我的显示器屏幕怎么老闪烁
我的显示器屏幕怎么不停地闪烁
VC 的绘图工具面板消失了,如何再打开?
电脑开机后,内存检测完了,可是,屏幕左上角出现不停闪烁的光标,就是过不去了?真是没办法.