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;
}