CSoundFileDlg - 带有预览(或预听)的声音文件打开/保存对话框






4.86/5 (4投票s)
2002年10月15日
2分钟阅读

115602

3464
CSoundFileDlg 类允许您使用声音文件的文件打开对话框,但在打开之前允许您听到声音。
引言
使用 CSoundFIleDlg
您可以在实际打开声音文件之前收听它,就像选择 Windows 的声音时一样。 我想在我正在编写的程序中做到这一点; 这是一个计时器,所以我不需要立即发出声音,而且我发现弄清楚在做出选择时播放什么声音很有趣。 因为我找不到任何代码来做到这一点,所以我编写了它,我不知道是否有人编写了任何类似的代码。
如何使用提供的类
在您的项目中包含以下文件
- SoundFileDlg.h
- SoundFileDlg.cpp
- PreListenWnd.h
- PreListenWnd.cpp
并添加行
"#include ""SoundFileDlg.rc"" //SoundFileDlg template resource\r\n"
在 <YourProject.rc> 的 TEXTINCLUDE 部分中,这样无论何时资源发生更改,您的资源包含都不会被删除。
或
#include SoundFileDlg.rc //SoundFileDlg template resource
在您的 <res/YourProject.rc2> 中
或
只需将模板对话框代码从 *SoundFileDlg.rc* 复制到您的资源文件中。 (SoundFileDlg.rc 文件仅包含模板窗口资源)
重要 链接 *Vfw32.lib* 库
用法与普通的 CFileDialog
相同
与普通的 CFileDialog
有什么区别
区别很简单,对话框有一个播放按钮和一个滑块; 实际上它是一个预览窗口 (CPreListenWnd
)。
创建 CSoundFileDlg
时,将创建预览窗口(没有文件)。
void CSoundFileDlg::OnInitDone() { CFileDialog::OnInitDone(); CRect cr,winRect,prevWndRect; CWnd * pWnd = this->GetParent(); pWnd->GetWindowRect(winRect); pWnd->ScreenToClient(winRect); SetWindowPos(&wndBottom,0/*::GetSystemMetrics(SM_CXSCREEN)*/, 0/*::GetSystemMetrics(SM_CYSCREEN)*/,0,0,0); if(m_bOpenFileDialog) { ... //get the position and size of the PreListenWnd int newWidth = winRect.Width()*2/3,margin=20,newHeight=24; prevWndRect.bottom = winRect.bottom - margin; prevWndRect.top = prevWndRect.bottom - newHeight; prevWndRect.left = winRect.left + (winRect.Width()-newWidth)/2; prevWndRect.right = prevWndRect.left + newWidth; //Pre-Listen Window m_cwndPreview.Create(pWnd,WS_CHILD | MCIWNDF_NOMENU,prevWndRect,""); ... } }
当选定的文件更改时,该文件将在预听窗口中打开
void CSoundFileDlg::OnFileNameChange() { if(!m_bOpenFileDialog){ CFileDialog::OnFileNameChange(); return; } CString Path = GetPathName(); CFile chkFile; if(!chkFile.Open(GetPathName(),CFile::modeRead|CFile::shareDenyNone)) m_cwndPreview.Close(); else { chkFile.Close(); m_cwndPreview.Open((LPCSTR)Path,0); } //Redraw preview window because if not a strange line is drawn after // Open or Close ResizePreviewWindow(); if(m_chkAutoPrev.GetCheck()) m_cwndPreview.Play(); }
CPreListenWnd 参考
此预览是一个非常简单的类,派生自 CWnd
,它具有一些 MCIWnd
。
构造/初始化
CPreListenWnd();
BOOL
Create
(CWnd* pParentWnd, DWORD dwStyle, const RECT& rect, LPCSTR szFile=NULL);
文件和设备管理
LONG Open
(LPCSTR szFileName, DWORD flags=0);
LONG Close
();
播放选项
LONG Play
();
LONG Stop
();
兼容性
在 Windows XP 上使用带有 MFC 的 VC++ 7 进行了测试。 在其他 Windows 操作系统(95/98/NT/ME/200)上也应该可以正常工作。 演示文件是 VC++ 7,由 Stephane Rodriguez 的 VC++7 到 VC++6 项目转换器转换为 VC++6,我没有在 VC6 上进行测试,所以我不知道是否存在任何不兼容性,我认为它可以正常工作。
结论
在我编写此代码之前,我以为一切都已编写(也许已经编写了),但我没有在任何地方找到这个代码,我认为这不是一个坏主意,至少我发现它很有用。 欢迎任何建议、改进或检测到的错误。