9.3.4 界面设计(2)
上述程序实现视频预览功能,首先获取显示窗口的句柄,根据设定的设备ID,图像宽度和高度创建预览的所有任务,并开始预览。创建过程任何一步有错误都认为创建失败。视频预览效果如图9-20所示,当画面有运动时,图像明显比使用经典采集技术方法要流畅。
|
| (点击查看大图)图9-20 VMR视频预览 |
双击"暂停预览"按钮,添加事件处理代码:
void CMy92Dlg::OnBnClickedPauseplay() { //TODO: 在此添加控件通知处理程序代码 static int c=0; if (!c) { GetDlgItem(ID_PAUSEPLAY)->SetWindowTextW(_T ("开始预览")); //改变按钮标题 c = 1; } else { GetDlgItem(ID_PAUSEPLAY)->SetWindowTextW(_T ("暂停预览")); //改变按钮标题 c = 0; } m_VMRCap.Pause(); //暂停预览 } |
上述程序使用CVMR_Capture类的成员函数Pause实现暂停功能,按钮标题根据当前功能做更改,暂停效果如图9-21所示。
|
| (点击查看大图)图9-21 暂停预览效果图 |
双击"图像捕捉"按钮,添加事件处理代码:
void CMy92Dlg::OnBnClickedCapture() { //TODO: 在此添加控件通知处理程序代码 CFileDialog dlg(FALSE); //另存为文件对话框 if (dlg.DoModal()==IDOK) { m_yuvFileName = dlg.GetPathName(); //获取输入的文件路径名 BOOL ret = m_pFile.Open(m_yuvFileName, //打开、创建文件 CFile::modeCreate |CFile::modeWrite| CFile:: typeBinary); if (!ret) { AfxMessageBox(_T("创建YUV文件失败!")); return ; } else m_fileState = ret; if (!p_yuv420) //分配YUV420图像空间 p_yuv420 = new BYTE [m_imageWidth*m_imageHeight*3/2]; this->KillTimer(TIMER_ID); //清除以前创建的定时器 this->SetTimer(TIMER_ID,TIMER_DELAY,NULL); //启动定时器 } }
|
上述程序完成YUV420文件的获取与创建,然后创建YUV420空间,启动采集图像的定时器,采集间隔为TIMER_DELAY。该消息处理函数的效果如图9-22、9-23所示。注意在捕获图像前,需要先预览视频,否则程序会报错。
|
| (点击查看大图)图9-22 "另存为"对话框 |
|
| (点击查看大图)图9-23 同时预览和捕获的主界面 |
双击"终止捕捉"按钮,添加事件处理代码:
void CMy92Dlg::OnBnClickedStopcap() { //TODO: 在此添加控件通知处理程序代码 KillTimer(TIMER_ID); if (p_yuv420) { delete [] p_yuv420; //释放YUV420空间 p_yuv420 = NULL; } if (m_fileState) { m_pFile.Close(); //关闭YUV文件 m_fileState = FALSE; } } |
上述程序实现终止捕获存储任务,关闭当前的YUV文件,图像预览任务继续。
双击"保存图表"按钮,添加事件处理代码:
void CMy92Dlg::OnBnClickedSavegraph() { //TODO: 在此添加控件通知处理程序代码 HRESULT hr; CFileDialog dlg(FALSE); //另存为对话框 if (dlg.DoModal()==IDOK) { CString inFileName = dlg.GetPathName(); //获取输入的文件路径名 m_VMRCap.SaveGraph(inFileName); //保存graph到文件中 } } |
保存滤波器链表到文件中,便于使用GraphEdit程序运行,掌握应用程序系统中滤波器的使用情况。
双击"退出程序"按钮,添加事件处理代码。程序隐含调用了类CVMR_Capture的析构函数,释放资源和COM库。
void CMy92Dlg::OnBnClickedExitapp() { //TODO: 在此添加控件通知处理程序代码 KillTimer(TIMER_ID); if (p_yuv420) delete [] p_yuv420; if (m_fileState) m_pFile.Close(); CDialog::OnOK(); } |
退出应用程序,需要首先销毁定时器,然后释放申请的内存空间,关闭YUV文件。
【责任编辑:
云霞 TEL:(010)68476606】