RegFilterChooserDlg.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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. // RegFilterChooserDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include <dmo.h>
  26. #include "RegFilterChooserDlg.h"
  27. #include "FGFilter.h"
  28. #include "....DSUtilDSUtil.h"
  29. // CRegFilterChooserDlg dialog
  30. //IMPLEMENT_DYNAMIC(CRegFilterChooserDlg, CResizableDialog)
  31. CRegFilterChooserDlg::CRegFilterChooserDlg(CWnd* pParent /*=NULL*/)
  32. : CResizableDialog(CRegFilterChooserDlg::IDD, pParent)
  33. {
  34. }
  35. CRegFilterChooserDlg::~CRegFilterChooserDlg()
  36. {
  37. POSITION pos = m_filters.GetHeadPosition();
  38. while(pos) delete m_filters.GetNext(pos);
  39. }
  40. void CRegFilterChooserDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. __super::DoDataExchange(pDX);
  43. DDX_Control(pDX, IDC_LIST2, m_list);
  44. }
  45. void CRegFilterChooserDlg::AddToList(IMoniker* pMoniker)
  46. {
  47. CComPtr<IPropertyBag> pPB;
  48. if(SUCCEEDED(pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pPB)))
  49. {
  50. CComVariant var;
  51. if(SUCCEEDED(pPB->Read(CComBSTR(_T("FriendlyName")), &var, NULL)))
  52. {
  53. m_list.SetItemData(
  54. m_list.InsertItem(-1, CString(CStringW(var.bstrVal))),
  55. (DWORD_PTR)m_monikers.AddTail(pMoniker));
  56. }
  57. }
  58. }
  59. BEGIN_MESSAGE_MAP(CRegFilterChooserDlg, CResizableDialog)
  60. ON_LBN_DBLCLK(IDC_LIST1, OnLbnDblclkList1)
  61. ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOK)
  62. ON_BN_CLICKED(IDOK, OnBnClickedOk)
  63. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  64. ON_NOTIFY(NM_DBLCLK, IDC_LIST2, OnNMDblclkList2)
  65. END_MESSAGE_MAP()
  66. // CRegFilterChooserDlg message handlers
  67. BOOL CRegFilterChooserDlg::OnInitDialog()
  68. {
  69. __super::OnInitDialog();
  70. BeginEnumSysDev(CLSID_LegacyAmFilterCategory, pMoniker)
  71. {
  72. AddToList(pMoniker);
  73. }
  74. EndEnumSysDev
  75. BeginEnumSysDev(DMOCATEGORY_VIDEO_EFFECT, pMoniker)
  76. {
  77. AddToList(pMoniker);
  78. }
  79. EndEnumSysDev
  80. BeginEnumSysDev(DMOCATEGORY_AUDIO_EFFECT, pMoniker)
  81. {
  82. AddToList(pMoniker);
  83. }
  84. EndEnumSysDev
  85. AddAnchor(IDC_LIST2, TOP_LEFT, BOTTOM_RIGHT);
  86. AddAnchor(IDC_BUTTON1, BOTTOM_LEFT);
  87. AddAnchor(IDOK, BOTTOM_RIGHT);
  88. AddAnchor(IDCANCEL, BOTTOM_RIGHT);
  89. SetMinTrackSize(CSize(300,100));
  90. return TRUE;  // return TRUE unless you set the focus to a control
  91. // EXCEPTION: OCX Property Pages should return FALSE
  92. }
  93. void CRegFilterChooserDlg::OnLbnDblclkList1()
  94. {
  95. SendMessage(WM_COMMAND, IDOK);
  96. }
  97. void CRegFilterChooserDlg::OnUpdateOK(CCmdUI* pCmdUI)
  98. {
  99. pCmdUI->Enable(!!m_list.GetFirstSelectedItemPosition());
  100. }
  101. void CRegFilterChooserDlg::OnBnClickedOk()
  102. {
  103. CComPtr<IMoniker> pMoniker;
  104. POSITION pos = m_list.GetFirstSelectedItemPosition();
  105. if(pos) pos = (POSITION)m_list.GetItemData(m_list.GetNextSelectedItem(pos));
  106. if(pos) pMoniker = m_monikers.GetAt(pos);
  107. if(pMoniker)
  108. {
  109. CFGFilterRegistry fgf(pMoniker);
  110. FilterOverride* f = new FilterOverride;
  111. f->fDisabled = false;
  112. f->type = FilterOverride::REGISTERED;
  113. f->name = fgf.GetName();
  114. f->dispname = fgf.GetDisplayName();
  115. f->guids.AddTailList(&fgf.GetTypes());
  116. f->backup.AddTailList(&fgf.GetTypes());
  117. f->dwMerit = fgf.GetMeritForDirectShow();
  118. f->iLoadType = FilterOverride::MERIT;
  119. m_filters.AddTail(f);
  120. }
  121. __super::OnOK();
  122. }
  123. void CRegFilterChooserDlg::OnBnClickedButton1()
  124. {
  125. CFileDialog dlg(TRUE, NULL, NULL, 
  126. OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY, 
  127. _T("DirectShow Filters (*.dll,*.ax)|*.dll;*.ax|"), this, 0);
  128. if(dlg.DoModal() == IDOK)
  129. {
  130. CFilterMapper2 fm2(false);
  131. fm2.Register(dlg.GetPathName());
  132. m_filters.AddTail(&fm2.m_filters);
  133. fm2.m_filters.RemoveAll();
  134. __super::OnOK();
  135. }
  136. }
  137. void CRegFilterChooserDlg::OnNMDblclkList2(NMHDR *pNMHDR, LRESULT *pResult)
  138. {
  139. if(m_list.GetFirstSelectedItemPosition())
  140. {
  141. OnBnClickedOk();
  142. }
  143. *pResult = 0;
  144. }