📄 gvcapturedlg.cpp
字号:
m_comboxVideoEncoder.EnableWindow();
m_comboxVideoCap.EnableWindow();
}
m_comboxAudioEncoder.EnableWindow();
}
}
void CGVCaptureDlg::OnChkPreview()
{
m_grfCapture.SetPreview(!m_grfCapture.IsPreview());
}
void CGVCaptureDlg::OnTimer(UINT nIDEvent)
{
if(m_bPause)
return;
m_dwEscape ++;
// change time display
int h = m_dwEscape/3600;
int m = (m_dwEscape%3600)/60;
int s = (m_dwEscape%3600)%60;
TCHAR strH[3], strM[3], strS[3];
if(h < 10)
wsprintf(strH, "0%d", h);
else
wsprintf(strH, "%d", h);
if(m < 10)
wsprintf(strM, "0%d", m);
else
wsprintf(strM, "%d", m);
if(s < 10)
wsprintf(strS, "0%d", s);
else
wsprintf(strS, "%d", s);
TCHAR strTime[10];
wsprintf(strTime, "%s:%s:%s", strH, strM ,strS);
SetDlgItemText(IDC_STATIC_TIMETOCAP, strTime);
TCHAR strDataRata[20];
sprintf(strDataRata, "%f", m_grfCapture.GetCompressRata());
SetDlgItemText(IDC_STATIC_BITRATE, strDataRata);
CDialog::OnTimer(nIDEvent);
}
void CGVCaptureDlg::OnClose()
{
OnBtnStopCap();
CDialog::OnClose();
SaveFilterConfig();
}
void CGVCaptureDlg::OnCbnSelchangeCmbAudioCapture()
{
CString strCurSel;
m_comboxAudioCap.GetLBText(m_comboxAudioCap.GetCurSel(), strCurSel);
if(m_strCurAudioCapDevice == strCurSel)
return;
m_strCurAudioCapDevice = strCurSel;
if(FAILED(m_grfCapture.CreateAudioCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
AfxMessageBox("Cant Create filter!!");
}
void CGVCaptureDlg::OnSelchangeCmbAudioCompressor()
{
CString strCurSel;
m_comboxAudioEncoder.GetLBText(m_comboxAudioEncoder.GetCurSel(), strCurSel);
if(m_strCurAudioEncoder == strCurSel ||((LPCTSTR)strCurSel)[0] == 0)
{
AfxMessageBox("当前读出字符串为空");
return;
}
m_strCurAudioEncoder = strCurSel;
if(FAILED(m_grfCapture.CreateAudioEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
AfxMessageBox("Cant Create filter!!");
}
void CGVCaptureDlg::OnSelchangeCmbVideoCapture()
{
CString strCurSel;
m_comboxVideoCap.GetLBText(m_comboxVideoCap.GetCurSel(), strCurSel);
if(m_strCurVideoCapDevice == strCurSel)
return;
m_strCurVideoCapDevice = strCurSel;
if(FAILED(m_grfCapture.CreateVideoCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
AfxMessageBox("Cant Create filter!!");
}
void CGVCaptureDlg::OnSelchangeCmbVideoCompressor()
{
CString strCurSel;
m_comboxVideoEncoder.GetLBText(m_comboxVideoEncoder.GetCurSel(), strCurSel);
if(m_strCurVideoEncoder == strCurSel || ((LPCTSTR)strCurSel)[0] == 0)
{
AfxMessageBox("当前读出字符串为空");
return;
}
m_strCurVideoEncoder = strCurSel;
if ("MicroSoft Media 9 DMO" == m_strCurVideoEncoder)
{
g_VideoEncodingParams.DefaultParams();
}
if(FAILED(m_grfCapture.CreateVideoEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
AfxMessageBox("Cant Create filter!!");
}
void CGVCaptureDlg::OnNotifyStop()
{
OnBtnStopCap();
}
void CGVCaptureDlg::OnNotifyPlay()
{
OnBtnBeginCap();
}
void CGVCaptureDlg::OnCheckOnlyAudio()
{
m_grfCapture.SetOnlyAudio(!m_grfCapture.IsOnlyAudio());
if(m_grfCapture.IsOnlyAudio())
{
m_comboxVideoCap.EnableWindow(FALSE);
m_comboxVideoEncoder.EnableWindow(FALSE);
}
else
{
m_comboxVideoCap.EnableWindow(TRUE);
m_comboxVideoEncoder.EnableWindow(TRUE);
}
}
bool CGVCaptureDlg::SaveFilterConfig()
{
char lszTotalPath[DEF_TEMP_LENGTH];
int result = 0;
FILE* lpFp = NULL;
GetTotalPath("ConfigFilter.dat", lszTotalPath);
lpFp = fopen(lszTotalPath, "wb");
//写m_strCurAudioCapDevice
int liLen = strlen(m_strCurAudioCapDevice.GetBuffer(0));
result = fwrite(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
result = fwrite(m_strCurAudioCapDevice.GetBuffer(0), sizeof(char), liLen,lpFp);
if (liLen != result)
{
fclose(lpFp);
return false;
}
//写m_strCurAudioEncoder
liLen = strlen(m_strCurAudioEncoder.GetBuffer(0));
result = fwrite(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
result = fwrite(m_strCurAudioEncoder.GetBuffer(0), sizeof(char), liLen,lpFp);
if (liLen != result)
{
fclose(lpFp);
return false;
}
//写m_strCurVideoCapDevice
liLen = strlen(m_strCurVideoCapDevice.GetBuffer(0));
result = fwrite(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
result = fwrite(m_strCurVideoCapDevice.GetBuffer(0), sizeof(char), liLen,lpFp);
if (liLen != result)
{
fclose(lpFp);
return false;
}
//写m_strCurVideoEncoder
liLen = strlen(m_strCurVideoEncoder.GetBuffer(0));
result = fwrite(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
result = fwrite(m_strCurVideoEncoder.GetBuffer(0), sizeof(char), liLen,lpFp);
if (liLen != result)
{
fclose(lpFp);
return false;
}
//写媒体类型
AM_MEDIA_TYPE* lpCurAudioAMT = NULL;
int ii = sizeof(AM_MEDIA_TYPE) + sizeof(WAVEFORMATEX);
int iii = sizeof(AM_MEDIA_TYPE);
if (!m_grfCapture.GetCurMediaType(&lpCurAudioAMT))
{//如果没有,还必须将一个表示媒体类型为零的写入
liLen = 0;
fwrite(&liLen, sizeof(int), 1, lpFp);
}
//如果媒体格式不是音频则退出,这是一个保护机制。
if (NULL != lpCurAudioAMT)
{
if (FORMAT_WaveFormatEx != lpCurAudioAMT->formattype)
{
fclose(lpFp);
return false;
}
liLen = sizeof(AM_MEDIA_TYPE) + lpCurAudioAMT->cbFormat;
result = fwrite(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
result = fwrite(lpCurAudioAMT, liLen, 1,lpFp);
if (1 != result)
{
fclose(lpFp);
return false;
}
HeapFree(GetProcessHeap(), 0, lpCurAudioAMT);
lpCurAudioAMT = NULL;
}
fclose(lpFp);
return true;
}
bool CGVCaptureDlg::LoadFilterConfig()
{
char lszTotalPath[DEF_TEMP_LENGTH];
int result = 0;
FILE* lpFp = NULL;
GetTotalPath("ConfigFilter.dat", lszTotalPath);
lpFp = fopen(lszTotalPath, "rb");
if (!lpFp)
{
return false;
}
//读m_strCurAudioCapDevice
int liLen = 0;
result = fread(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
if (liLen)
{
result = fread(m_strCurAudioCapDevice.GetBuffer(liLen), sizeof(char), liLen,lpFp);
if (liLen != result)
{
m_strCurAudioCapDevice.ReleaseBuffer(liLen);
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
m_strCurAudioCapDevice.ReleaseBuffer(liLen);
}
//读m_strCurAudioEncoder
liLen = 0;
result = fread(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
if (liLen)
{
result = fread(m_strCurAudioEncoder.GetBuffer(liLen), sizeof(char), liLen,lpFp);
if (liLen != result)
{
m_strCurAudioEncoder.ReleaseBuffer(liLen);
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
m_strCurAudioEncoder.ReleaseBuffer(liLen);
}
//读m_strCurVideoCapDevice
liLen = 0;
result = fread(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
if (liLen)
{
result = fread(m_strCurVideoCapDevice.GetBuffer(liLen), sizeof(char), liLen,lpFp);
if (liLen != result)
{
m_strCurVideoCapDevice.ReleaseBuffer(liLen);
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
m_strCurVideoCapDevice.ReleaseBuffer(liLen);
}
//读m_strCurVideoEncoder
liLen = 0;
result = fread(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
if (liLen)
{
result = fread(m_strCurVideoEncoder.GetBuffer(liLen), sizeof(char), liLen,lpFp);
if (liLen != result)
{
m_strCurVideoEncoder.ReleaseBuffer(liLen);
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
m_strCurVideoEncoder.ReleaseBuffer(liLen);
}
//读媒体类型
liLen = 0;
result = fread(&liLen, sizeof(int), 1,lpFp);
if (1 != result)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
if (liLen)//必须加,如果不加,则读出零个字节时就会返回false,此时应返回true,因为
//只是代表没有。
{
//Arthur:解决m_pCurAudioAMT尽管有值为零,但是却还是分配了空间,只要有值时才给
//mpTemAudioAMT分配空间就可。
mpTemAudioAMT = (AM_MEDIA_TYPE *)HeapAlloc(GetProcessHeap(),
HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY,
sizeof(AM_MEDIA_TYPE) + sizeof(WAVEFORMATEX));
result = fread(mpTemAudioAMT, liLen, 1,lpFp);
if (1 != result)
{
HeapFree(GetProcessHeap(), 0, mpTemAudioAMT);
mpTemAudioAMT = NULL;
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
mpTemAudioAMT->pbFormat = (LPBYTE)(mpTemAudioAMT + 1);
//如果媒体格式不是音频则退出,这是一个保护机制。
if (FORMAT_WaveFormatEx != mpTemAudioAMT->formattype)
{
AfxMessageBox("读取配置文件出错");
fclose(lpFp);
DeleteFile(lszTotalPath);
return false;
}
}
fclose(lpFp);
return true;
}
//求得完整路径
bool CGVCaptureDlg::GetTotalPath(char *aszFileName, char *aszTotalPath)
{
GetModuleFileName(NULL, aszTotalPath, MAX_PATH);
int liLengthPath = strlen(aszTotalPath);
while (aszTotalPath[liLengthPath - 1] != '\\')
{
--liLengthPath;
}
if (liLengthPath > 0)
{
aszTotalPath[liLengthPath] = '\0';
if (NULL != aszFileName)
{
strcat(aszTotalPath, aszFileName);
}
return true;
}
return false;
}
//xiezhouwei 2005-08-15 添加配置pin函数
void CGVCaptureDlg::OnBtnVideocapIniConfig()
{
// TODO: Add your control notification handler code here
m_grfCapture.ShowPinSetting(m_hWnd);
return;
}
void CGVCaptureDlg::OnChkSave()
{
char lszPath[MAX_PATH] = {0};
UpdateData();
if (BST_CHECKED == mbtnSaveFile.GetCheck())
{
GetTotalPath(NULL, lszPath);
CFileDialog loFileDlg(FALSE, "avi" , NULL, OFN_EXPLORER|OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, \
"AVI Files (*.avi)|*.avi|All Files (*.*)|*.*||", NULL);
loFileDlg.m_ofn.lStructSize = sizeof(loFileDlg.m_ofn);
if (IDOK == loFileDlg.DoModal())
{
ZeroMemory(mszAVIFilePath, sizeof(mszAVIFilePath));
strcpy(mszAVIFilePath, loFileDlg.GetPathName().GetBuffer(0));
mstrSavePath = mszAVIFilePath;
m_grfCapture.SetAVIFile(mszAVIFilePath);
if ('\0' == mszAVIFilePath[0])
{
mbtnSaveFile.SetCheck(BST_UNCHECKED);
}
}
}
else
{
mstrSavePath.Empty();
}
UpdateData(false);
}
BOOL CGVCaptureDlg::OnEraseBkgnd(CDC* pDC)
{
// Intercept background erasing for the movie window, since the
// video renderer will keep the screen painted. Without this code,
// your video window might get painted over with gray (the default
// background brush) when it is obscured by another window and redrawn.
CRect rc;
// Get the bounding rectangle for the movie screen
//m_VideoWindow.GetWindowRect(&rc);
GetDlgItem(IDC_STATIC_PREVIEW)->GetWindowRect(&rc);
ScreenToClient(&rc);
// Exclude the clipping region occupied by our movie screen
pDC->ExcludeClipRect(&rc);
GetDlgItem(IDC_STATIC_PREVIEW)->GetWindowRect(&rc);
ScreenToClient(&rc);
pDC->ExcludeClipRect(&rc);
// Erase the remainder of the dialog as usual
return CDialog::OnEraseBkgnd(pDC);
}
//用户选择是否需要CrossBar输入
void CGVCaptureDlg::OnBnClickedChkCrossbar()
{
if (BST_CHECKED == m_bChkCrossBar.GetCheck())
{
m_grfCapture.SetCrossBar(TRUE);
return;
}
m_grfCapture.SetCrossBar(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -