在动态绘制中一开始出现的问题,主要是没有做到一个点一个点的绘制,是一段一段的绘制的所以移动的时候给人一种一卡一卡的感觉,这个问题一开始显示数据的时候都没有发现这个问题不对,后来时间长了才发现为什么绘制那么规整,数据的波动没有体现出来,查看代码发现,这个一段一段的绘制不对,应该每加入一个点就应该按比例缩放一下
这里先给出一个比例缩放公式,本人感觉很好用,可以有效的将数据比例关系缩放到要显示的最大范围之内
缩放后值=(当前值-这组数据最小值)/(这组数据最大值-这组数据最小值)* 数据范围;
这个公式可以有效的解决数据太大或者太小的问题。
接下来介绍大体流程:
线程接受到数据后,显示计时器开始执行,显示计数器中主要执行的操作就是一点一点的拿数据按比例缩放,然后放到一个容器中然后 通过MoveToEx和LineTo绘制点,当然还要注意到将图片显示时要使用双缓存机制来绘制图片,要不会出现闪烁现象,这里贴出部分绘制代码
HDC hDC = pDC->GetSafeHdc();
::GetClientRect(hWnd, rect);
/****创建第二缓存区****/
CDC dcMen;
CBitmap bmp;
dcMen.CreateCompatibleDC(pDC); // 创建依附窗口
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); // 创建兼容位图
dcMen.SelectObject(&bmp); // 将位图选入内存
dcMen.FillSolidRect(rect, pDC->GetBkColor()); // 使得新创建的缓存区的背景和原背景一致
HDC hDCMen = dcMen.GetSafeHdc();
// 绘制坐标轴
if ( iCoorAxisNumber == 0 )
return false;
int iCoorHeight = (rect.Height() - (25 * iCoorAxisNumber)) / iCoorAxisNumber;
int iCoorWidth = rect.Width() - 40;
for ( int i = 0; i < iCoorAxisNumber; i++ )
{
CoorSystemDemo coorsystem;
coorsystem.DrawCoor(hDCMen, rect.left + 20, rect.top + (20 + iCoorHeight) * (i + 1), iCoorWidth, iCoorHeight);
coorsystem.DrawXAxisScale(hDCMen);
coorsystem.DrawYAxisScale(hDCMen);
}
// 绘制曲线
// 设置绘制曲线的画笔
m_hOldPen = dcMen.SelectObject(&m_hNewPen);
if ( ShowData )
{
if ( !m_vectRawDataArray.size() )
return false;
if ( !m_vectRawDataArray.at(0).m_deqEEGData.size() )
return false;
for ( size_t i = 0; i < m_vectRawDataArray.size(); i++)
{
int iXStart = 20, iYStart;
int iXEnd, iYEnd;
for ( int j = 1; j < m_vectRawDataArray.at(i).m_deqEEGData.size(); j++ )
{
iYStart = m_vectRawDataArray.at(i).m_deqEEGData.at(j - 1);
iXEnd = iXStart + 1;
iYEnd = m_vectRawDataArray.at(i).m_deqEEGData.at(j);
MoveToEx(hDCMen, iXStart, iYStart, NULL);
LineTo(hDCMen, iXEnd, iYEnd);
iXStart = iXEnd;
}
m_vectRawDataArray.at(i).m_deqEEGData.clear();
}
}
// 贴图到到界面中
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcMen , 0, 0, SRCCOPY);
// 释放资源
::DeleteDC(dcMen);
::DeleteObject(bmp);
::ReleaseDC(hWnd, hDCMen);
m_vectRawDataArray.clear();
这里没有比例缩放和动态移动部分,会在后面添加,这个代码还在修改中,估计下周动态显示可以出现完整的。