65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (4投票s)

2002年10月15日

2分钟阅读

viewsIcon

115602

downloadIcon

3464

CSoundFileDlg 类允许您使用声音文件的文件打开对话框,但在打开之前允许您听到声音。

Sample Image

引言

使用 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 上进行测试,所以我不知道是否存在任何不兼容性,我认为它可以正常工作。

结论

在我编写此代码之前,我以为一切都已编写(也许已经编写了),但我没有在任何地方找到这个代码,我认为这不是一个坏主意,至少我发现它很有用。 欢迎任何建议、改进或检测到的错误。

© . All rights reserved.