Visual c++ CMFCeditBrowsSectrl正在裁剪文件名
我使用Visual c++ CMFCeditBrowsSectrl正在裁剪文件名,visual-c++,mfc,Visual C++,Mfc,我使用CMFCEditBrowseCtrl选择一个图像,其名称为: D:\WhatsApp Image 2020-04-02于13.03.48.jpeg 因此,它现在在控件中被选中: 现在,我决定再次点击浏览按钮: 看到了吗 D:\WhatsApp Image 2020-04-02于13.03.48。jpeg在13.03.48似乎被截断为。jpeg。但当我将鼠标点击文件名控件时,它会显示正确: 如果单击编辑框,它不会总是再次显示全名。但可以保证,如果单击“确定”,它将是正确和完整的 这会让
CMFCEditBrowseCtrl
选择一个图像,其名称为:
D:\WhatsApp Image 2020-04-02于13.03.48.jpeg
因此,它现在在控件中被选中:
现在,我决定再次点击浏览按钮:
看到了吗
D:\WhatsApp Image 2020-04-02于13.03.48。jpeg
在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, 0, NULL, 0, fname, _MAX_FNAME, NULL, 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, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
break;
}
但是,它仍然有我描述的这种奇怪的行为
更新4 此问题在技术上与
CFileDialog
有关。如果我只是尝试:
CFileDialog dlgOpen(TRUE,_T(“MWB”),_T(“123456789abcdefghijklmnopqrstuvxyz.MWB”),of n_路径必须存在| of n_隐藏,strFilter,this)代码>
然后,所有可见的选择都是“rstuvwxyz.mwb”
更新5
其中一份答复说:
这真的不是MFC问题。坏角色是shell的COM对象,它实现了MFC在后台使用的IFileDialog接口。下面的示例使用COM(不含任何MFC代码)再现了该问题
#包括
#包括
int WINAPI wWinMain(HINSTANCE hInst、HINSTANCE hPrevious、LPWSTR szCommandline、int nShow)
{
HRESULT hr=共同初始化(nullptr);
如果(成功(hr))
{
IFileDialog*pfd=nullptr;
hr=CoCreateInstance(CLSID_文件打开对话框,
nullptr,
CLSCTX_INPROC_服务器,
IID_PPV_参数(&pfd));
如果(成功(hr))
{
COMDLG_过滤器规范rgFileSpec[]={
{L“MWB文件(*.MWB)”,L“*.MWB”},
{L“所有文件(**)”,L“*.*}
};
hr=pfd->SetFileTypes(ARRAYSIZE(rgFileSpec),rgFileSpec);
hr=pfd->SetFileName(L“123456789abcdefghijklmnopqrstuvwxyz.mwb”);
hr=pfd->显示(空);
pfd->Release();
}
}
coninitialize();
返回0;
}
不确定为什么会发生这种情况,但可以尝试清除选择?如果您的控件是,请说myEBC
,然后尝试:myEBC.SetSel(-1,0,FALSE)代码>如果您可以在单击“浏览”按钮之前将其放入某个位置。@AdrianMole我在对话框OnInitDialog
中尝试了您的想法,但没有任何区别。@AdrianMole最后我想我必须重写此控件并显示我自己的文件对话框。它没有智慧。它不会将文件类型索引设置为与现有文件名匹配。它不会将文件类型索引设置为与默认扩展名类型匹配(未指定任何文件)。我只是希望开箱即用以避免额外的类。相关(但没有解决方案):FWIW,我在我的项目中大量使用CMFCEditBrowseCtrl
。但是,我有一个“内置”自定义版本,在这个版本中,我覆盖了OnBrowse
函数,并在处理程序中使用我自己的CFileDialog。
#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, NULL, 0, NULL, 0, fname, _MAX_FNAME, 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,
strFile,
m_dwFileDialogFlags,
!m_strFileFilter.IsEmpty() ? (LPCTSTR)m_strFileFilter : (LPCTSTR)NULL, 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, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
#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;
}