c++ - 默认文件名在 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();
}
}
解决方案
通过将焦点设置到另一个控件并返回到文件名编辑框,我找到了解决此问题的方法。
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;
}
推荐阅读
- xamarin - LinkAssemblies 任务意外失败。- Xamarin.Forms (Android)
- xml - 错误:“文件过早结束。” 在jsp页面上
- c# - 我可以使用泛型类型参数作为返回类型吗?
- python-3.x - 过滤,替换python图中的组值
- python-3.x - 如何更改导出的默认数据类型?
- php - PHP登录系统不起作用
- python - 在 Pytest 中使用 excel 参数化测试
- javascript - TinyMCE 4.3 只上传一张图片
- javascript - 将href更改为同一页面上的锚点
- iis-7.5 - IIS 7.5 - 网站的友好 URL