首页 > 解决方案 > 默认文件名在 Windows IFileDialog 中出现截断

问题描述

使用 WindowsIFileDialog界面启动文件浏览器对话框时,如果提供的默认文件名超过一定数量的字符,我会遇到问题。

文件名似乎被截断了,尽管它只是简单地包裹起来,所以我们只能看到最后几个字符。似乎问题在于 Windows 文件浏览器对话框。每当提供的默认文件名超过 12-13 个字符时,它就会被环绕。

有没有人遇到过这样的问题?有什么解决方法吗?

操作系统详细信息:
Windows 10,版本 1709(操作系统内部版本 16299.1625)

对话截图: 带有包装的默认文件名的文件浏览器对话框

下面共享的代码片段:
这是在单击按钮“BrowseFile”时从 MFC 应用程序调用的函数。

void CCustomFileBrowserNewDlg::OnBnClickedBrowseFile()
{
    IFileDialog* pfd = nullptr;
    IID id = CLSID_FileSaveDialog;

    const COMDLG_FILTERSPEC c_rgSaveTypes[] =
    {
        {L"Word Document (*.doc)",       L"*.doc"},
        {L"Web Page (*.htm; *.html)",    L"*.htm;*.html"},
        {L"Text Document (*.txt)",       L"*.txt"},
    };


    HRESULT hr = CoCreateInstance(id, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
    if (SUCCEEDED(hr))
    {
        hr = pfd->SetFileTypes(ARRAYSIZE(c_rgSaveTypes), c_rgSaveTypes);
        if (SUCCEEDED(hr))
        {
            hr = pfd->SetFileTypeIndex(1);
            if (SUCCEEDED(hr))
            {
                //pfd->SetFileName(L"Filename.txt");       // This is okay
                pfd->SetFileName(L"SomeLongFilename.txt"); // This name gets wrapped around
                pfd->Show(::GetActiveWindow());
            }
        }

        pfd->Release();
    }
}

标签: c++winapimfcifiledialog

解决方案


通过将焦点设置到另一个控件并返回到文件名编辑框,我找到了解决此问题的方法。

STDMETHODIMP MyFileDialogEventsImplementation::OnSelectionChange(IFileDialog* pfd)
{   
    if (!m_bInitialized)
    {
        m_bInitialized = true;

        IOleWindow* pOleWindow;
        if (SUCCEEDED(pfd->QueryInterface(IID_PPV_ARGS(&pOleWindow))))
        {
            HWND hwnd;
            if (SUCCEEDED(pOleWindow->GetWindow(&hwnd)))
            {
                CWnd* pDialog = CWnd::FromHandle(hwnd);
                
                if (pDialog != nullptr)
                {
                    CWnd* pCtrlWithFocus = pDialog->GetFocus();
                    
                    if (pCtrlWithFocus != nullptr)
                    {
                        CWnd* pNextDlgTabItem = pDialog->GetNextDlgTabItem(pCtrlWithFocus);

                        if (pNextDlgTabItem != nullptr)
                        {
                            pNextDlgTabItem->SetFocus();
                            pCtrlWithFocus->SetFocus();
                        }
                    }
                }

            }
            pOleWindow->Release();
        }
    }

    return S_OK;
}

推荐阅读