SDK实现多文件的选择 不指定 2007/09/08

| |
SDK实现多文件选择:按住Ctrl,或鼠标拖动可实现多选。
最让人奇怪的是:缓冲区必须初始化,否则第一次选择文件可以成功,但第二次将失败!

LRESULT CDlgFRMusic::OnMusicAddFile(WORD, WORD, HWND, BOOL&)
{
    // 必须先初始化,否则无法打开对话框
    TCHAR szBuf[MAX_PATH * sizeof(TCHAR) * MAX_LIST_NUM] = { 0 };
    PCTSTR pszFilter = \
        _T("MP3 Audio Files (*.mp3)\0*.mp3\0") \
        _T("Wave Files (*.wav)\0*.wav\0") \
        _T("Windows Media Files (*.wma)\0*.wma\0") \
        _T("MIDI Files (*.mid)\0*.mid\0") \
        _T("All Files (*.*)\0*.*\0\0");
    OPENFILENAME opfile;
    ZeroMemory(&opfile, sizeof(OPENFILENAME));
    opfile.lStructSize = sizeof(OPENFILENAME);
    opfile.hwndOwner = m_hWnd;
    opfile.lpstrFilter = pszFilter;
    opfile.lpstrFile = szBuf;
    opfile.nMaxFile = _Number(szBuf);
    opfile.Flags = OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_EXPLORER;
    if (!::GetOpenFileName(&opfile))
    {
        return 0;
    }

    TCHAR szFile[MAX_PATH];
    StrCopy(szFile, _Number(szFile), opfile.lpstrFile);
    PTSTR p = opfile.lpstrFile;
    while (*p++);
    if (*p == NULL) // 只选了一个文件
    {
        int i = m_List.GetItemCount();
        if (i < MAX_LIST_NUM)
        {
            AddMusic(szFile, &i);
        }
    }
    else    // 多选,循环取出文件
    {
        int i = m_List.GetItemCount();
        while (*p)
        {
            if (i >= MAX_LIST_NUM - 1)
            {
                break;
            }
            PathRemoveFileSpec(szFile);
            PathAppend(szFile, p);
            AddMusic(szFile, &i);
            while (*p++);
        }
    }
    return 0;
}
发表评论

昵称

网址

电邮

打开HTML 打开UBB 表情 打开表情 隐藏 记住我 [注册]