计算数据画波形图
软件要求是根据数据,来画出图形。其实同一个文件对应的图形是相同的,只是在同一个文件中,会有一根扫描线,沿X轴坚着移动。早期,我是根据数据,在每次OnPaint中,连线来画图的,每次OnPaint时,都要遍历一次所有的点。并连接起来。测试时发现,时间久了,因为长时间要运算,计时器不准了。会延时几秒才做,需求是每秒画一次那条坚着的线,而波形是未变的。仅在不同文件中,因为不同文件而变。
现在我想改进性能,对于同一个文件,第一次时,按数据画波形,在该文件未切换的情况下,第二次以后的画图,就不用取点,再连线来画波形了。这样肯定性能上可以提高很多。
但软件改后,因为我用了双缓冲同时对MFC中的画图也不是特熟吧。实际的结果,是缓冲后的图,并未最后显示出来。
代码大概如下,代码有精简,主要部分如下:
GetClientRect(&clientRt);
nWidth = clientRt.Width();
nHeight = clientRt.Height();
// 建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(pDC);
// 建立一个与屏幕显示兼容的位图,位图的大小可选用窗口客户区的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
// 将位图选入到内存显示设备中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);
// 先用背景色将位图清除干净,否则是黑色。这里用的是白色作为背景
//MemDC.FillSolidRect(clientRt.left, clientRt.top,nWidth,nHeight,RGB(0,0,0));
MemDC.FillSolidRect(0, 0,nWidth,nHeight,RGB(0,0,0));
// 静态缓冲 DC
static CDC cacheDC;
static CString movie_path;
static bool bFirstOfSaveMovie = true ;
static bool bOnlyOnceCreate = true ;
CString movie_path_;
if (bOnlyOnceCreate)
{
cacheDC.CreateCompatibleDC(pDC);
bOnlyOnceCreate = false ;
}
if (文件不相同)
{
// 不相同,则需要重绘一个新的。
bFirstOfSaveMovie = true ;
movie_path = movie_path_;
}
//画背景
DrawBackGround(MemDC);
if (bFirstOfSaveMovie)
{
DrawLineXYZ(cacheDC); //此行为画线,是动态计算后画的波形图,数据量会比较多。
bFirstOfSaveMovie = false ;
}
MemDC.BitBlt(0, 0, m_rect.Width(), m_rect.Height(), &cacheDC, 0, 0, SRCCOPY);
pDC->BitBlt(updateRt.left, updateRt.top, updateRt.Width(), updateRt.Height(), &MemDC, updateRt.left, updateRt.top, SRCCOPY);
// 绘图完成后的清理
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
请问下大家,如何将这个缓冲的DC中的图,显示出来呢?另外,这个static的cacheDC,我会在程序结束时释放,从目前帖进来的代码来看,是否会存在内存泄漏的情况呢?急,求高手指点。