GSCaptureDlg.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // GSCaptureDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <afxpriv.h>
  25. #include "GSCaptureDlg.h"
  26. // GSCaptureDlg dialog
  27. IMPLEMENT_DYNAMIC(GSCaptureDlg, CDialog)
  28. GSCaptureDlg::GSCaptureDlg(CWnd* pParent /*=NULL*/)
  29. : CDialog(GSCaptureDlg::IDD, pParent)
  30. {
  31. m_filename = AfxGetApp()->GetProfileString(_T("Capture"), _T("FileName"));
  32. }
  33. GSCaptureDlg::~GSCaptureDlg()
  34. {
  35. }
  36. int GSCaptureDlg::GetSelCodec(Codec& c)
  37. {
  38. int iSel = m_codeclist.GetCurSel();
  39. if(iSel < 0) return 0;
  40. POSITION pos = (POSITION)m_codeclist.GetItemDataPtr(iSel);
  41. if(pos == NULL) return 2;
  42. c = m_codecs.GetAt(pos);
  43. if(!c.pBF)
  44. {
  45. c.pMoniker->BindToObject(NULL, NULL, __uuidof(IBaseFilter), (void**)&c.pBF);
  46. if(!c.pBF) return 0;
  47. }
  48. return 1;
  49. }
  50. LRESULT GSCaptureDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  51. {
  52. LRESULT ret = __super::DefWindowProc(message, wParam, lParam);
  53. if(message == WM_INITDIALOG) SendMessage(WM_KICKIDLE);
  54. return(ret);
  55. }
  56. void GSCaptureDlg::DoDataExchange(CDataExchange* pDX)
  57. {
  58. __super::DoDataExchange(pDX);
  59. DDX_Text(pDX, IDC_EDIT1, m_filename);
  60. DDX_Control(pDX, IDC_COMBO1, m_codeclist);
  61. }
  62. BOOL GSCaptureDlg::OnInitDialog()
  63. {
  64. __super::OnInitDialog();
  65. m_codecs.RemoveAll();
  66. m_codeclist.ResetContent();
  67. m_codeclist.SetItemDataPtr(m_codeclist.AddString(_T("Uncompressed")), NULL);
  68. BeginEnumSysDev(CLSID_VideoCompressorCategory, pMoniker)
  69. {
  70. Codec c;
  71. c.pMoniker = pMoniker;
  72. LPOLESTR strName = NULL;
  73. if(FAILED(pMoniker->GetDisplayName(NULL, NULL, &strName)))
  74. continue;
  75. c.DisplayName = strName;
  76. CoTaskMemFree(strName);
  77. CComPtr<IPropertyBag> pPB;
  78. pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pPB);
  79. CComVariant var;
  80. if(FAILED(pPB->Read(CComBSTR(_T("FriendlyName")), &var, NULL)))
  81. continue;
  82. c.FriendlyName = var.bstrVal;
  83. CStringW str = CStringW(c.DisplayName).MakeLower();
  84. if(str.Find(L"@device:dmo:") == 0)
  85. c.FriendlyName = _T("(DMO) ") + c.FriendlyName;
  86. else if(str.Find(L"@device:sw:") == 0)
  87. c.FriendlyName = _T("(DS) ") + c.FriendlyName;
  88. else if(str.Find(L"@device:cm:") == 0)
  89. c.FriendlyName = _T("(VfW) ") + c.FriendlyName;
  90. m_codeclist.SetItemDataPtr(m_codeclist.AddString(c.FriendlyName), m_codecs.AddTail(c));
  91. }
  92. EndEnumSysDev
  93. //
  94. CString DisplayNameToFind = AfxGetApp()->GetProfileString(_T("Capture"), _T("VideoCodecDisplayName"));
  95. for(int i = 0; i < m_codeclist.GetCount(); i++)
  96. {
  97. CString DisplayName;
  98. POSITION pos = (POSITION)m_codeclist.GetItemDataPtr(i);
  99. if(pos) DisplayName = m_codecs.GetAt(pos).DisplayName;
  100. if(DisplayName == DisplayNameToFind)
  101. {
  102. m_codeclist.SetCurSel(i);
  103. break;
  104. }
  105. }
  106. //
  107. UpdateData(FALSE);
  108. return TRUE;  // return TRUE unless you set the focus to a control
  109. // EXCEPTION: OCX Property Pages should return FALSE
  110. }
  111. BEGIN_MESSAGE_MAP(GSCaptureDlg, CDialog)
  112. ON_MESSAGE_VOID(WM_KICKIDLE, OnKickIdle)
  113. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  114. ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
  115. ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateButton2)
  116. ON_BN_CLICKED(IDOK, OnBnClickedOk)
  117. ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOK)
  118. END_MESSAGE_MAP()
  119. // GSCaptureDlg message handlers
  120. void GSCaptureDlg::OnKickIdle()
  121. {
  122. UpdateDialogControls(this, false);
  123. }
  124. void GSCaptureDlg::OnBnClickedButton1()
  125. {
  126. UpdateData();
  127. CFileDialog fd(FALSE, _T("avi"), m_filename, 
  128. OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST, 
  129. _T("Avi files (*.avi)|*.avi||"), this, 0);
  130. if(fd.DoModal() == IDOK)
  131. {
  132. m_filename = fd.GetPathName();
  133. UpdateData(FALSE);
  134. }
  135. }
  136. void GSCaptureDlg::OnBnClickedButton2()
  137. {
  138. Codec c;
  139. if(GetSelCodec(c) != 1) return;
  140. if(CComQIPtr<ISpecifyPropertyPages> pSPP = c.pBF)
  141. {
  142. CAUUID caGUID;
  143. caGUID.pElems = NULL;
  144. if(SUCCEEDED(pSPP->GetPages(&caGUID)))
  145. {
  146. IUnknown* lpUnk = NULL;
  147. pSPP.QueryInterface(&lpUnk);
  148. OleCreatePropertyFrame(
  149. m_hWnd, 0, 0, CStringW(c.FriendlyName), 
  150. 1, (IUnknown**)&lpUnk, 
  151. caGUID.cElems, caGUID.pElems, 
  152. 0, 0, NULL);
  153. lpUnk->Release();
  154. if(caGUID.pElems) CoTaskMemFree(caGUID.pElems);
  155. }
  156. }
  157. else if(CComQIPtr<IAMVfwCompressDialogs> pAMVfWCD = c.pBF)
  158. {
  159. if(pAMVfWCD->ShowDialog(VfwCompressDialog_QueryConfig, NULL) == S_OK)
  160. pAMVfWCD->ShowDialog(VfwCompressDialog_Config, m_hWnd);
  161. }
  162. }
  163. void GSCaptureDlg::OnUpdateButton2(CCmdUI* pCmdUI)
  164. {
  165. pCmdUI->Enable(m_codeclist.GetCurSel() >= 0 && m_codeclist.GetItemDataPtr(m_codeclist.GetCurSel()) != NULL);
  166. }
  167. void GSCaptureDlg::OnBnClickedOk()
  168. {
  169. UpdateData();
  170. Codec c;
  171. if(GetSelCodec(c) == 0) return;
  172. m_pVidEnc = c.pBF;
  173. AfxGetApp()->WriteProfileString(_T("Capture"), _T("FileName"), m_filename);
  174. AfxGetApp()->WriteProfileString(_T("Capture"), _T("VideoCodecDisplayName"), CString(c.DisplayName));
  175. OnOK();
  176. }
  177. void GSCaptureDlg::OnUpdateOK(CCmdUI* pCmdUI)
  178. {
  179. CString str;
  180. GetDlgItem(IDC_EDIT1)->GetWindowText(str);
  181. pCmdUI->Enable(!str.IsEmpty() && m_codeclist.GetCurSel() >= 0);
  182. }