关于C#:默认文件名在Windows IFileDialog中被截断

Default filename appears truncated in Windows IFileDialog

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

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

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

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

对话框快照:
File browser dialog with wrapped default filename

以下共享的代码段:
当单击按钮" BrowseFile"时,这是从MFC应用程序调用的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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();
    }
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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;
}

您的示例中出现的错误很少。您提供的一个示例是"保存"对话框,而屏幕截图是"打开"对话框。

您要谈论的问题将永远不会在"保存"对话框中重现,因为过滤器组合框和"保存"按钮位于默认文本编辑控件的下一行。

enter image description here

现在,您的问题特定于打开对话框,并且由于同一行中的可用空间较少,默认文本不会向左截断。即,由于文件名静态文本,默认文本编辑控件和过滤器组合框在同一行,因此Windows将此解释为默认文本的可用空间较少,并将文本向左换行。如果将文本光标滚动到文件名静态控件,则将获得完整的文本。您可以向MSDN提出此问题。

enter image description here

现在,解决此问题的方法是以最大化模式显示打开文件对话框。一种方法是打开一个对话框,然后将其最大化。接下来的对话框将以最大化模式打开。