zoukankan      html  css  js  c++  java
  • 智能小车的图像播放器

    智能小车的图像播放器

    作者:一点一滴的Beer http://beer.cnblogs.com/

    图像播放器:

         智能小车利用车载摄像头采集跑道数据,然后存储到小车中央控制主板的存储器中。等小车跑完一周后,再串口通讯传到电脑上,并保存为二进制文件。

         然后这个软件就是读取这个二进制文件,每次读取40*80=3200个数据上来,然后用GDI绘制3200个灰度像素点,用定时器,每隔一段时间从文件中读取数据并重新绘制一次,然后就形成了这种动画类似于播放器的功能了。

         这是自己大三的时候用VC6.0写的一个软件,现在想来,其实实用性不强,仅可以把现场的数据采集上来,做一些上位机的仿真。不过,也算是自己大三的一点小心血吧。现在清理硬盘,把这个软件的效果演示做成一个视频,作个纪念,然后再删除吧。

    image

    主要的技术问题就是:读文件,GDI绘图,定时器。

    1.读文件

    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绘制像素点

    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.定时器

        在对话框初始化的时候,设置定时器,然后再到定时器的事件中执行绘图函数。具体用法可以到网上查阅。

        结尾:本文不作为技术文,只是作为自己的一个回忆纪念文吧。所以,没有详细对解决问题的细节进行说明了。写完本文后,就直接将源代码全部删除了。只留下了上面的那些思路了。

  • 相关阅读:
    数据库架构的演变
    一个简单的跨库事务问题
    一个优美的架构需要考虑的几个问题
    铁道部新客票系统设计
    详细介绍软件架构设计的三个维度
    单代号网络图
    分库分表带来的完整性和一致性问题
    软件架构设计箴言理解
    设计高并发的电子商店
    mysql之索引补充
  • 原文地址:https://www.cnblogs.com/beer/p/1903788.html
Copyright © 2011-2022 走看看