📄 videoconfiguredlg.cpp
字号:
// VideoConfigureDlg.cpp : implementation file
//
#include "stdafx.h"
#include "IRExpPlatform.h"
#include "VideoConfigureDlg.h"
#include "WalkWhiteDlg.h"
#include "TeleoperationDlg.h"
#include "SearchObjectDlg.h"
#include "vfw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CVideoConfigureDlg dialog
CVideoConfigureDlg::CVideoConfigureDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVideoConfigureDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVideoConfigureDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CVideoConfigureDlg::~CVideoConfigureDlg()
{
CDialog::~CDialog();
}
void CVideoConfigureDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVideoConfigureDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVideoConfigureDlg, CDialog)
//{{AFX_MSG_MAP(CVideoConfigureDlg)
ON_BN_CLICKED(IDC_VIDEOSOURCE, OnVideosource)
ON_BN_CLICKED(IDC_VIDEOFORMAT, OnVideoformat)
ON_BN_CLICKED(IDC_VIDEOSET, OnVideoset)
ON_BN_CLICKED(IDC_FRAMESAVE, OnFramesave)
ON_BN_CLICKED(IDC_FRAMESTOP, OnFramestop)
ON_BN_CLICKED(IDC_VIDEOSAVE, OnVideosave)
ON_BN_CLICKED(IDC_VIDEOSAVEEND, OnVideosaveend)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVideoConfigureDlg message handlers
// 显示视频源对话框,控制视频输入频道和参数的选择
void CVideoConfigureDlg::OnVideosource()
{
// TODO: Add your control notification handler code here
capDlgVideoSource(m_hCaptureVideoConfig);
}
// 显示视频格式对话框,控制选择数字化的视频帧尺寸和像素的位数
void CVideoConfigureDlg::OnVideoformat()
{
// TODO: Add your control notification handler code here
capDlgVideoFormat(m_hCaptureVideoConfig);
}
// 显示视频显示对话框,控制捕获时视频在显示器上的外观
// 它不影响数字化视频数据,但影响数字信号的描述
void CVideoConfigureDlg::OnVideoset()
{
// TODO: Add your control notification handler code here
capDlgVideoDisplay(m_hCaptureVideoConfig);
}
// 保存单帧图像至C:\SINGLEBMP.BMP
void CVideoConfigureDlg::OnFramesave()
{
// TODO: Add your control notification handler code here
capFileSaveDIB(m_hCaptureVideoConfig, "C:\\SINGLEBMP.BMP");
}
// 冻结画面
void CVideoConfigureDlg::OnFramestop()
{
// TODO: Add your control notification handler code here
capGrabFrameNoStop(m_hCaptureVideoConfig);
}
//启动视频流捕获,并将图象保存至C:\\CAPTURE.AVI
//捕获持续到如下事件发生,按下ESC键或鼠标,应用程序停止或放弃捕获操作,硬盘满。
void CVideoConfigureDlg::OnVideosave()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_VIDEOSAVEEND)->EnableWindow(TRUE); //使"结束保存"按钮使能
capCaptureSequence(m_hCaptureVideoConfig); //默认保存至C:\\CAPTURE.AVI
}
//结束保存,停止视频流存入文件
void CVideoConfigureDlg::OnVideosaveend()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_VIDEOSAVEEND)->EnableWindow(FALSE); //使"结束保存"按钮灰色显示
capCaptureStop(m_hCaptureVideoConfig);
}
BOOL CVideoConfigureDlg::OnInitDialog()
{
CDialog::OnInitDialog();
GetDlgItem(IDC_VIDEOSAVE)->EnableWindow(TRUE); //使"保存视频"按钮使能
GetDlgItem(IDC_VIDEOSAVEEND)->EnableWindow(FALSE); //使"结束保存"按钮灰色显示
m_nTimerInVideoConfig=SetTimer(2,1000/RATE, NULL);
CString strDlgCaption;
GetParent()->GetWindowText(strDlgCaption); //得到父窗口的标题
if(strDlgCaption=="路径跟踪实验")
m_hCaptureVideoConfig=((CWalkWhiteDlg* )GetParent())->m_hCaptureInWhiteDlg;
else
if(strDlgCaption=="遥操作实验")
m_hCaptureVideoConfig=((CTeleoperationDlg *)GetParent())->m_hCaptureInTeleDlg;
else
if(strDlgCaption=="智能机器人的目标搜索")
m_hCaptureVideoConfig=((CSearchObjectDlg *)GetParent())->m_hCaptureInSearchObjectDlg;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//视频显示
void CVideoConfigureDlg::DisplayFrames()
{
// TODO: Add extra initialization here
CWnd* pVideoConfig;
CDC* pDC;
CDC dcMemory;
CBitmap *pOldBmp;
CBitmap newBmp; //公用位图对象
CRect videoRect;
pVideoConfig = GetDlgItem(IDC_VIDEOINCONFIGDLG);
pDC = pVideoConfig -> GetDC();
pVideoConfig->GetWindowRect(&videoRect);
newBmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);//在这里还调用的是全局的对象theApp
dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(&newBmp);
BYTE r, g, b;
for(int i=0;i<HEIGHT;i++)
for(int j=0;j<WIDTH;j++)
{
//COLORREF 0x00bbggrr
r=theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 2];
g=theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 1];//此处rr为高字节
b=theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 0];
dcMemory.SetPixel(j,i,RGB(r, g, b));
}
// pDC->BitBlt(0, 0, WIDTH, HEIGHT, &dcMemory, 0, 0, SRCCOPY);
//从(0,0)点开始从内存兼容位图中拷贝图像至设备环境句柄
pDC->BitBlt(0, 0, videoRect.Width(),videoRect.Height(), &dcMemory, 0, 0, SRCCOPY);
UpdateWindow();
dcMemory.SelectObject(pOldBmp);
newBmp.DeleteObject(); //释放theApp.newBmp所占的内存
ReleaseDC(&dcMemory);
ReleaseDC(pDC);
}
void CVideoConfigureDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DisplayFrames();
CDialog::OnTimer(nIDEvent);
}
void CVideoConfigureDlg::OnOK()
{
// TODO: Add extra validation here
KillTimer(m_nTimerInVideoConfig);
CDialog::OnOK();
}
void CVideoConfigureDlg::OnCancel()
{
// TODO: Add extra cleanup here
KillTimer(m_nTimerInVideoConfig);
CDialog::OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -