设为首页 加入收藏

TOP

9.3.4 界面设计(2)
2013-10-07 00:40:55 来源: 作者: 【 】 浏览:52
Tags:9.3.4 界面设计

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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.3.1 VMR技术基础 下一篇9.3.4 界面设计(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: