智能小车的图像播放器
作者:一点一滴的Beer http://beer.cnblogs.com/
图像播放器:
智能小车利用车载摄像头采集跑道数据,然后存储到小车中央控制主板的存储器中。等小车跑完一周后,再串口通讯传到电脑上,并保存为二进制文件。
然后这个软件就是读取这个二进制文件,每次读取40*80=3200个数据上来,然后用GDI绘制3200个灰度像素点,用定时器,每隔一段时间从文件中读取数据并重新绘制一次,然后就形成了这种动画类似于播放器的功能了。
这是自己大三的时候用VC6.0写的一个软件,现在想来,其实实用性不强,仅可以把现场的数据采集上来,做一些上位机的仿真。不过,也算是自己大三的一点小心血吧。现在清理硬盘,把这个软件的效果演示做成一个视频,作个纪念,然后再删除吧。
主要的技术问题就是:读文件,GDI绘图,定时器。
1.读文件
代码语言:javascript复制void CPicMovieDlg::OnOpenfile()
{
// TODO: Add your control notification handler code here
//打开文件
//创建文件名缓存(fileBuffer)和文件读取缓存(rBuffer)
//此处如果不把缓存置,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零
char fileBuffer[5010] = {0}, rBuffer[row * column] = {0};
//定义一个CFile类,用来处理文件
// CFile in;//放到此对话框的成员变量中。因为我要持续对此文件进行操作。要有较长的生成周期。???权宜之计
//定义一个CFileDialog类,用来显示标准的打开文件对话框
CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T("自定义文件类型(*.sav)|*.sav|所有文件(*.*)|*.*||"), NULL);
inDlg.m_ofn.lpstrTitle = _T("打开自定义文件");
//设定一个文件名缓存,因为CFileDialog内置的文件名缓存长度只有,但是很多时候,文件的路径远大于这个数,为了保险起见,所以要自己设定一个文件名缓存
inDlg.m_ofn.lpstrFile = fileBuffer;
//设定缓存长度
inDlg.m_ofn.nMaxFile = 5000;
//显示对话框,并处理按了确定按钮的事件
if(inDlg.DoModal() == IDOK) {
//以只读方式打开文件
if(in.Open(inDlg.GetPathName(), CFile::modeRead)) {
OperateFile();
bStopFlag = 1;//打开文件后,不自动播放。
//关闭文件
//in.Close();//将此语句放在程序结束时。
// MessageBox("打开文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
} else {
MessageBox("打开文件失败,可能您没有关闭当前文件", "失败了", MB_ICONSTOP | MB_OK);
bOpenFlag = 0;
}
}
}
2.GDI绘制像素点
代码语言:javascript复制void CPicMovieDlg:: DrawOrigin(BYTE dataTemp[][column],CDC* pDC)
{
for (int i=0;i<row;i )
for (int j=0;j<column;j )
{
int recWidth=8;
int recHeight=14;
COLORREF clrRec=RGB(dataTemp[i][j],dataTemp[i][j],dataTemp[i][j]);
pDC->Rectangle(recWidth*j/2,recHeight*i/2,recWidth*(j 1)/2,recHeight*(i 1)/2);
//下面的填充函数将原来有的笔刷效果全部给覆盖了。
pDC->FillSolidRect(recWidth*j/2,recHeight*i/2,recWidth/2,recHeight/2,clrRec);
}
}
3.定时器
在对话框初始化的时候,设置定时器,然后再到定时器的事件中执行绘图函数。具体用法可以到网上查阅。
结尾:本文不作为技术文,只是作为自己的一个回忆纪念文吧。所以,没有详细对解决问题的细节进行说明了。写完本文后,就直接将源代码全部删除了。只留下了上面的那些思路了。