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

多媒体编程

开发平台:

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. // OpenDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "OpenDlg.h"
  26. #include <atlbase.h>
  27. #include <shlobj.h>
  28. #include "....DSUtilDSUtil.h"
  29. // COpenDlg dialog
  30. //IMPLEMENT_DYNAMIC(COpenDlg, CResizableDialog)
  31. COpenDlg::COpenDlg(CWnd* pParent /*=NULL*/)
  32. : CResizableDialog(COpenDlg::IDD, pParent)
  33. , m_path(_T(""))
  34. , m_path2(_T(""))
  35. , m_fMultipleFiles(false)
  36. {
  37. }
  38. COpenDlg::~COpenDlg()
  39. {
  40. }
  41. void COpenDlg::DoDataExchange(CDataExchange* pDX)
  42. {
  43. __super::DoDataExchange(pDX);
  44. DDX_Control(pDX, IDC_COMBO1, m_mrucombo);
  45. DDX_CBString(pDX, IDC_COMBO1, m_path);
  46. DDX_Control(pDX, IDC_COMBO2, m_mrucombo2);
  47. DDX_CBString(pDX, IDC_COMBO2, m_path2);
  48. DDX_Control(pDX, IDC_STATIC1, m_label2);
  49. DDX_Control(pDX, IDC_BROWSEBUTTON2, m_openbtn2);
  50. }
  51. BEGIN_MESSAGE_MAP(COpenDlg, CResizableDialog)
  52. ON_BN_CLICKED(IDC_BROWSEBUTTON, OnBnClickedBrowsebutton)
  53. ON_BN_CLICKED(IDC_BROWSEBUTTON2, OnBnClickedBrowsebutton2)
  54. ON_BN_CLICKED(IDOK, OnBnClickedOk)
  55. ON_UPDATE_COMMAND_UI(IDC_STATIC1, OnUpdateDub)
  56. ON_UPDATE_COMMAND_UI(IDC_COMBO2, OnUpdateDub)
  57. ON_UPDATE_COMMAND_UI(IDC_BROWSEBUTTON2, OnUpdateDub)
  58. END_MESSAGE_MAP()
  59. // COpenDlg message handlers
  60. BOOL COpenDlg::OnInitDialog()
  61. {
  62. __super::OnInitDialog();
  63. CRecentFileList& MRU = AfxGetAppSettings().MRU;
  64. MRU.ReadList();
  65. m_mrucombo.ResetContent();
  66. for(int i = 0; i < MRU.GetSize(); i++)
  67. if(!MRU[i].IsEmpty())
  68. m_mrucombo.AddString(MRU[i]);
  69. CorrectComboListWidth(m_mrucombo, GetFont());
  70. CRecentFileList& MRUDub = AfxGetAppSettings().MRUDub;
  71. MRUDub.ReadList();
  72. m_mrucombo2.ResetContent();
  73. for(int i = 0; i < MRUDub.GetSize(); i++)
  74. if(!MRUDub[i].IsEmpty())
  75. m_mrucombo2.AddString(MRUDub[i]);
  76. CorrectComboListWidth(m_mrucombo2, GetFont());
  77. if(m_mrucombo.GetCount() > 0) m_mrucombo.SetCurSel(0);
  78. AddAnchor(m_mrucombo, TOP_LEFT, TOP_RIGHT);
  79. AddAnchor(m_mrucombo2, TOP_LEFT, TOP_RIGHT);
  80. AddAnchor(IDC_BROWSEBUTTON, TOP_RIGHT);
  81. AddAnchor(IDC_BROWSEBUTTON2, TOP_RIGHT);
  82. AddAnchor(IDOK, TOP_CENTER);
  83. AddAnchor(IDCANCEL, TOP_CENTER);
  84. AddAnchor(IDC_STATIC1, TOP_LEFT, TOP_RIGHT);
  85. CRect r;
  86. GetWindowRect(r);
  87. CSize s = r.Size();
  88. SetMinTrackSize(s);
  89. s.cx = 1000;
  90. SetMaxTrackSize(s);
  91. return TRUE;  // return TRUE unless you set the focus to a control
  92. // EXCEPTION: OCX Property Pages should return FALSE
  93. }
  94. static CString GetFileName(CString str)
  95. {
  96. CPath p = str;
  97. p.StripPath();
  98. return (LPCTSTR)p;
  99. }
  100. void COpenDlg::OnBnClickedBrowsebutton()
  101. {
  102. UpdateData();
  103. CMediaFormats& mf = AfxGetAppSettings().Formats;
  104. CString filter;
  105. CStringArray mask;
  106. filter += _T("Media files (all types)|__dummy|");
  107. mask.Add(_T(""));
  108. for(int i = 0; i < mf.GetCount(); i++) 
  109. mask[0] += mf[i].GetFilter() + _T(";");
  110. mask[0].TrimRight(_T(";"));
  111. for(int i = 0; i < mf.GetCount(); i++)
  112. {
  113. CMediaFormatCategory& mfc = mf[i];
  114. filter += mfc.GetLabel() + _T("|__dummy|");
  115. mask.Add(mfc.GetFilter());
  116. }
  117. filter += _T("All files (*.*)|__dummy|");
  118. mask.Add(_T("*.*"));
  119. filter += _T("|");
  120. COpenFileDialog fd(mask, true, NULL, m_path, 
  121. OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLEINCLUDENOTIFY, 
  122. filter, this);
  123. CAutoVectorPtr<TCHAR> buff;
  124. buff.Allocate(10000);
  125. buff[0] = 0;
  126. fd.m_pOFN->lpstrFile = buff;
  127. fd.m_pOFN->nMaxFile = 10000;
  128. if(fd.DoModal() != IDOK) return;
  129. m_fns.RemoveAll();
  130. POSITION pos = fd.GetStartPosition();
  131. while(pos)
  132. {
  133. /*
  134. CString str = fd.GetNextPathName(pos);
  135. POSITION insertpos = m_fns.GetTailPosition();
  136. while(insertpos && GetFileName(str).CompareNoCase(GetFileName(m_fns.GetAt(insertpos))) <= 0)
  137. m_fns.GetPrev(insertpos);
  138. if(!insertpos) m_fns.AddHead(str);
  139. else m_fns.InsertAfter(insertpos, str);
  140. */
  141. m_fns.AddTail(fd.GetNextPathName(pos));
  142. }
  143. if(m_fns.GetCount() > 1 
  144. || m_fns.GetCount() == 1 
  145. && (m_fns.GetHead()[m_fns.GetHead().GetLength()-1] == '\'
  146. || m_fns.GetHead()[m_fns.GetHead().GetLength()-1] == '*'))
  147. {
  148. m_fMultipleFiles = true;
  149. EndDialog(IDOK);
  150. return;
  151. }
  152. m_mrucombo.SetWindowText(fd.GetPathName());
  153. }
  154. void COpenDlg::OnBnClickedBrowsebutton2()
  155. {
  156. UpdateData();
  157. CMediaFormats& mf = AfxGetAppSettings().Formats;
  158. CString filter;
  159. CStringArray mask;
  160. filter += _T("Audio files (all types)|__dummy|");
  161. mask.Add(_T(""));
  162. for(int i = 0; i < mf.GetCount(); i++)
  163. {
  164. CMediaFormatCategory& mfc = mf[i];
  165. if(!mfc.IsAudioOnly() || mfc.GetEngineType() != DirectShow) continue;
  166. mask[0] += mf[i].GetFilter() + _T(";");
  167. }
  168. mask[0].TrimRight(_T(";"));
  169. for(int i = 0; i < mf.GetCount(); i++)
  170. {
  171. CMediaFormatCategory& mfc = mf[i];
  172. if(!mfc.IsAudioOnly() || mfc.GetEngineType() != DirectShow) continue;
  173. filter += mfc.GetLabel() + _T("|__dummy|");
  174. mask.Add(mfc.GetFilter());
  175. }
  176. filter += _T("All files (*.*)|__dummy|");
  177. mask.Add(_T("*.*"));
  178. filter += _T("|");
  179. COpenFileDialog fd(mask, false, NULL, m_path2, 
  180. OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ENABLEINCLUDENOTIFY, 
  181. filter, this);
  182. if(fd.DoModal() != IDOK) return;
  183. m_mrucombo2.SetWindowText(fd.GetPathName());
  184. }
  185. void COpenDlg::OnBnClickedOk()
  186. {
  187. UpdateData();
  188. m_fns.RemoveAll();
  189. m_fns.AddTail(m_path);
  190. if(m_mrucombo2.IsWindowEnabled())
  191. m_fns.AddTail(m_path2);
  192. m_fMultipleFiles = false;
  193. OnOK();
  194. }
  195. void COpenDlg::OnUpdateDub(CCmdUI* pCmdUI)
  196. {
  197. m_mrucombo.GetWindowText(m_path);
  198. pCmdUI->Enable(AfxGetAppSettings().Formats.GetEngine(m_path) == DirectShow);
  199. }
  200. // OpenDlg.cpp : implementation file
  201. //
  202. #include "OpenDlg.h"
  203. #include <dlgs.h>
  204. #define __DUMMY__ _T("*.*")
  205. bool COpenFileDialog::m_fAllowDirSelection = false;
  206. WNDPROC COpenFileDialog::m_wndProc = NULL;
  207. // COpenFileDialog
  208. IMPLEMENT_DYNAMIC(COpenFileDialog, CFileDialog)
  209. COpenFileDialog::COpenFileDialog(CStringArray& mask, bool fAllowDirSelection, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
  210. DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd)
  211. : CFileDialog(TRUE, lpszDefExt, lpszFileName, dwFlags|OFN_NOVALIDATE, lpszFilter, pParentWnd, 0)
  212. , m_mask(mask)
  213. {
  214. m_fAllowDirSelection = fAllowDirSelection;
  215. m_pOFN->lpstrInitialDir = lpszFileName;
  216. }
  217. COpenFileDialog::~COpenFileDialog()
  218. {
  219. }
  220. BEGIN_MESSAGE_MAP(COpenFileDialog, CFileDialog)
  221. ON_WM_DESTROY()
  222. END_MESSAGE_MAP()
  223. // COpenFileDialog message handlers
  224. LRESULT CALLBACK COpenFileDialog::WindowProcNew(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  225. {
  226. if(message ==  WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK
  227. && m_fAllowDirSelection)
  228. {
  229. CAutoVectorPtr<TCHAR> path;
  230. path.Allocate(MAX_PATH+1); // MAX_PATH should be bigger for multiple selection, but we are only interested if it's zero length
  231. // note: allocating MAX_PATH only will cause a buffer overrun for too long strings, and will result in a silent app disappearing crash, 100% reproducable
  232. if(::GetDlgItemText(hwnd, cmb13, (TCHAR*)path, MAX_PATH) == 0)
  233. ::SendMessage(hwnd, CDM_SETCONTROLTEXT, edt1, (LPARAM)__DUMMY__);
  234. }
  235. return CallWindowProc(COpenFileDialog::m_wndProc, hwnd, message, wParam, lParam);
  236. }
  237. BOOL COpenFileDialog::OnInitDialog()
  238. {
  239. CFileDialog::OnInitDialog();
  240. m_wndProc = (WNDPROC)SetWindowLong(GetParent()->m_hWnd, GWL_WNDPROC, (LONG)WindowProcNew);
  241. return TRUE;  // return TRUE unless you set the focus to a control
  242. // EXCEPTION: OCX Property Pages should return FALSE
  243. }
  244. void COpenFileDialog::OnDestroy()
  245. {
  246. int i = GetPathName().Find(__DUMMY__);
  247. if(i >= 0) m_pOFN->lpstrFile[i] = m_pOFN->lpstrFile[i+1] = 0;
  248. CFileDialog::OnDestroy();
  249. }
  250. BOOL COpenFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  251. {
  252. ASSERT(pResult != NULL);
  253. OFNOTIFY* pNotify = (OFNOTIFY*)lParam;
  254. // allow message map to override
  255. if (__super::OnNotify(wParam, lParam, pResult))
  256. {
  257. ASSERT(pNotify->hdr.code != CDN_INCLUDEITEM);
  258. return TRUE;
  259. }
  260. switch(pNotify->hdr.code)
  261. {
  262. case CDN_INCLUDEITEM:
  263. if(OnIncludeItem((OFNOTIFYEX*)lParam, pResult))
  264. return TRUE;
  265. break;
  266. }
  267. return FALSE;   // not handled
  268. }
  269. BOOL COpenFileDialog::OnIncludeItem(OFNOTIFYEX* pOFNEx, LRESULT* pResult)
  270. {
  271. TCHAR buff[MAX_PATH];
  272. if(!SHGetPathFromIDList((LPCITEMIDLIST)pOFNEx->pidl, buff)) 
  273. {
  274. STRRET s;
  275. HRESULT hr = ((IShellFolder*)pOFNEx->psf)->GetDisplayNameOf((LPCITEMIDLIST)pOFNEx->pidl, SHGDN_NORMAL|SHGDN_FORPARSING, &s);
  276. if(S_OK != hr) return FALSE;
  277. switch(s.uType)
  278. {
  279. case STRRET_CSTR: _tcscpy(buff, CString(s.cStr)); break;
  280. case STRRET_WSTR: _tcscpy(buff, CString(s.pOleStr)); CoTaskMemFree(s.pOleStr); break;
  281. default: return FALSE;
  282. }
  283. }
  284. CString fn(buff);
  285. /*
  286. WIN32_FILE_ATTRIBUTE_DATA fad;
  287. if(GetFileAttributesEx(fn, GetFileExInfoStandard, &fad)
  288. && (fad.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
  289. return FALSE;
  290. */
  291. int i = fn.ReverseFind('.'), j = fn.ReverseFind('\');
  292. if(i < 0 || i < j) 
  293. return FALSE;
  294. CString mask = m_mask[pOFNEx->lpOFN->nFilterIndex-1] + _T(";");
  295. CString ext = fn.Mid(i).MakeLower() + _T(";");
  296. *pResult = mask.Find(ext) >= 0 || mask.Find(_T("*.*")) >= 0;
  297. return TRUE;
  298. }