如何解决CMFCEditBrowseCtrl裁剪文件名
我使用CMFCEditBrowseCtrl
选择一个图像,其名称为:
D:\ WhatsApp Image 2020-04-02 at 13.03.48.jpeg
因此现在在控件中将其选中:
现在,我决定再次点击浏览按钮:
看到了吗?
D:\WhatsApp Image 2020-04-02 at 13.03.48.jpeg
似乎被截断为 at 13.03.48.jpeg
。但是当我将鼠标单击到文件名控件中时,它便显示正确:
如果您单击编辑框,它并不总是再次显示全名。但是可以保证,如果单击确定,它将是正确且完整的。
这会使用户感到困惑。
更新1
如果我单击文件名,然后单击键盘上的HOME按钮,那么其余文件名就会显示。
更新2
我已经深入研究了MFC源代码,这就是它的样子:
case BrowseMode_File:
{
CString strFile;
GetWindowText(strFile);
if (!strFile.IsEmpty())
{
TCHAR fname [_MAX_FNAME];
_tsplitpath_s(strFile,NULL,fname,_MAX_FNAME,0);
CString strFileName = fname;
strFileName.TrimLeft();
strFileName.TrimRight();
if (strFileName.IsEmpty())
{
strFile.Empty();
}
const CString strInvalidChars = _T("*?<>|");
if (strFile.FindOneOf(strInvalidChars) >= 0)
{
if (!OnIllegalFileName(strFile))
{
SetFocus();
return;
}
}
}
CFileDialog dlg(TRUE,!m_strDefFileExt.IsEmpty() ? (LPCTSTR)m_strDefFileExt : (LPCTSTR)NULL,strFile,m_dwFileDialogFlags,!m_strFileFilter.IsEmpty() ? (LPCTSTR)m_strFileFilter : (LPCTSTR)NULL,NULL);
if (dlg.DoModal() == IDOK && strFile != dlg.GetPathName())
{
SetWindowText(dlg.GetPathName());
SetModify(TRUE);
OnAfterUpdate();
}
if (GetParent() != NULL)
{
GetParent()->RedrawWindow(NULL,RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
break;
}
更新3
我尝试推出自己的类,该类重写OnBrowse
处理程序。改进了用于设置默认过滤器索引和默认文件扩展名的逻辑:
#include "stdafx.h"
#include "MyMFCEditBrowseFileCtrl.h"
IMPLEMENT_DYNAMIC(CMyMFCEditBrowseFileCtrl,CMFCEditBrowseCtrl)
BEGIN_MESSAGE_MAP(CMyMFCEditBrowseFileCtrl,CMFCEditBrowseCtrl)
END_MESSAGE_MAP()
void CMyMFCEditBrowseFileCtrl::OnBrowse()
{
CString strFile,strFileExtension;
GetWindowText(strFile);
if (!strFile.IsEmpty())
{
TCHAR fname[_MAX_FNAME];
TCHAR ext[_MAX_EXT];
_tsplitpath_s(strFile,ext,_MAX_EXT);
CString strFileName = fname;
strFileName.TrimLeft();
strFileName.TrimRight();
if (strFileName.IsEmpty())
{
strFile.Empty();
}
strFileExtension = ext;
strFileExtension.Trim();
strFileExtension.MakeLower();
const CString strInvalidChars = _T("*?<>|");
if (strFile.FindOneOf(strInvalidChars) >= 0)
{
if (!OnIllegalFileName(strFile))
{
SetFocus();
return;
}
}
}
int iFilterIndex = 2; // jpg - fallback
m_strDefFileExt = _T("jpg");
if (strFileExtension == _T(".gif"))
{
iFilterIndex = 1;
m_strDefFileExt = _T("gif");
}
else if (strFileExtension == _T(".jpeg") || strFileExtension == _T(".jpg"))
{
iFilterIndex = 2;
m_strDefFileExt = _T("jpg");
}
else if (strFileExtension == _T(".png"))
{
iFilterIndex = 3;
m_strDefFileExt = _T("png");
}
else if (strFileExtension == _T(".tif") || strFileExtension == _T(".tiff"))
{
iFilterIndex = 4;
m_strDefFileExt = _T("tif");
}
else if (strFileExtension == _T(".bmp"))
{
iFilterIndex = 5;
m_strDefFileExt = _T("bmp");
}
CFileDialog dlg(TRUE,(LPCTSTR)m_strDefFileExt,NULL);
dlg.m_pOFN->nFilterIndex = iFilterIndex;
if (dlg.DoModal() == IDOK && strFile != dlg.GetPathName())
{
SetWindowText(dlg.GetPathName());
SetModify(TRUE);
OnAfterUpdate();
}
if (GetParent() != NULL)
{
GetParent()->RedrawWindow(NULL,RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
但是,它仍然具有我描述的这种奇怪的行为。
更新4
此问题在技术上与CFileDialog
有关。如果我只是尝试:
CFileDialog dlgOpen(TRUE,_T("MWB"),_T("123456789abcdefghijklmnopqrstuvwxyz.mwb"),OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,strFilter,this);
然后所有可见的选择是“ rstuvwxyz.mwb”。
更新5
其中here个答复中指出:
这确实不是MFC问题。坏的参与者是实现IFileDialog接口的外壳程序COM对象,该接口由MFC在后台使用。以下最小示例重现了使用不带任何MFC代码的COM的问题。
#include <Windows.h>
#include <ShlObj.h>
int WINAPI wWinMain(HINSTANCE hInst,HINSTANCE hPrevious,LPWSTR szCommandline,INT nShow)
{
HRESULT hr = CoInitialize(nullptr);
if (SUCCEEDED(hr))
{
IFileDialog *pfd = nullptr;
hr = CoCreateInstance(CLSID_FileOpenDialog,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
COMDLG_FILTERSPEC rgFileSpec[] = {
{L"MWB Files (*.mwb)",L"*.mwb"},{L"All Files (*.*)",L"*.*"}
};
hr = pfd->SetFileTypes(ARRAYSIZE(rgFileSpec),rgFileSpec);
hr = pfd->SetFileName(L"123456789abcdefghijklmnopqrstuvwxyz.mwb");
hr = pfd->Show(NULL);
pfd->Release();
}
}
CoUninitialize();
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。