|
1.5 主窗体设计(4)
(24)处理“快照”按钮的单击事件,截取当前预览图像,并根据选择的类型保存成相应的文件。代码如下:
void CCaptureDlg::OnSnapshot() { if(CPreView::m_CurIndex != -1) //判断是否有预览窗口 { if(m_Frame.m_pList[CPreView::m_CurIndex].m_ShowImage) { CButton* pBmpButton = (CButton*)GetDlgItem(IDC_BMP); if(pBmpButton->GetCheck() != 0) //获取BMP单选按钮的状态 { //创建文件保存对话框 CFileDialog fDlg(FALSE,"bmp","bmp_001",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"bmp|*.bmp",this); if(fDlg.DoModal() == IDOK) { CString fName = fDlg.GetPathName(); //获得文件的保存路径 VCASaveAsBmpFile(CPreView::m_CurIndex,fName); //保存为BMP文件 } } else { //创建文件保存对话框 CFileDialog fDlg(FALSE,"jpg","jpg_001",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"JPG|*.JPG",this); if(fDlg.DoModal() == IDOK) { CString fName = fDlg.GetPathName(); //获得文件的保存路径 VCASaveAsJpegFile(CPreView::m_CurIndex,fName); //保存为JPG文件 } } } else { MessageBox("当前选择的图像不能预览!","提示"); } } }
| (25)处理“显卡类型”按钮的单击事件,设置显卡类型,并将设置结果保存到INI文件中。代码如下:
void CCaptureDlg::OnSetting() { CButton* pVGAButton = (CButton*)GetDlgItem(IDC_VGA); int sel = pVGAButton->GetCheck(); //获得VGA单选按钮的状态 if(sel) { WritePrivateProfileString("显卡设置","类型","VGA","./syssetting.ini"); //将数据写入INI文件 } else { WritePrivateProfileString("显卡设置","类型","PCI","./syssetting.ini"); //将数据写入INI文件 } MessageBox("要使显卡设置生效,需要重新启动应用程序!","提示"); }
| (26)处理对话框的WM_WINDOWPOSCHANGED消息,当对话框位置改变时,更新视频预览窗口的位置。代码如下:
void CCaptureDlg::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) { CDialog::OnWindowPosChanged(lpwndpos); for (UINT i = 0 ; i< m_DevNum; i++) //根据芯片数进行循环 { if (m_Frame.m_pList[i].m_ShowImage) //判断是否显示图片 { if (m_Frame.m_pList[i].m_Stop==psStop) { VCAStopVideoPreview(i); //停止预览 VCAUpdateOverlayWnd(m_Frame.GetSafeHwnd()); //更新视频预览窗口 } else if (m_Frame.m_pList[i].m_Stop==psPreview) { m_Frame.m_pList[i].Invalidate(); //刷新窗口 //更新视频预览窗口 VCAUpdateOverlayWnd(m_Frame.m_hWnd); VCAUpdateVideoPreview(i,m_Frame.m_pList[i].m_hWnd); } } } }
| (27)处理“录像”按钮的单击事件,代码如下:
void CCaptureDlg::OnKinescope() { if(!m_Kinescope) //判断是否录像 { if(CPreView::m_CurIndex != -1) { //创建文件保存对话框 CFileDialog fDlg(FALSE,"avi","avi_001",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"AVI|*.avi",this); if (fDlg.DoModal()==IDOK) { m_Kinescope = TRUE; CString file = fDlg.GetPathName(); //获得文件保存路径 //设置MPEG压缩的关键帧间隔,必须大于等于帧率 VCASetKeyFrmInterval(CPreView::m_CurIndex,250); //设置MPEG压缩的位率,范围为56Kbps ~ 10Mbps VCASetBitRate(CPreView::m_CurIndex,256); //设置视频捕获帧率,bFrameRateReduction参数为保留参数 //PAL显示帧率始终为25,NTSC显示帧率始终为30 //PAL捕获帧率最大为25,NTSC捕获帧率最大为30 VCASetVidCapFrameRate(CPreView::m_CurIndex,25); //设置视频捕获尺寸 VCASetVidCapSize(CPreView::m_CurIndex,320,240); //设置MPEG4_XVID压缩的质量 VCASetXVIDQuality(CPreView::m_CurIndex,10,3); //设置MPEG4_XVID压缩模式 VCASetXVIDCompressMode(CPreView::m_CurIndex,XVID_VBR_MODE); BOOL ret = VCAStartVideoCapture(CPreView::m_CurIndex, CAP_ORIGIN_MPEG4_STREAM, MPEG4_AVIFILE_CALLBACK ,file); //开始视频捕获 GetDlgItem(IDC_KINESCOPE)->SetWindowText("停止录像"); } } } else { m_Kinescope = FALSE; GetDlgItem(IDC_KINESCOPE)->SetWindowText("录像"); VCAStopVideoCapture(CPreView::m_CurIndex); //停止视频捕获 } }
| 说明:经过上面的操作已经可以完成基本的监控功能,但是,为了使监控更灵活,还要使用另一个硬件设备——云台。云台用于调整摄像头的位置。通常,摄像头安装在云台之上,通过云台的转动实现摄像头水平、垂直方向的改变,从而实现对监控位置的调整。云台除了能够对摄像头进行转动外,还可以控制摄像头的焦聚、光圈和变倍等,这样可以调整摄像头的捕捉范围和清晰度。
【责任编辑: 夏书 TEL:(010)68476606】
|