是否使用CMFCeditBrowsSectrl选择文件?

是否使用CMFCeditBrowsSectrl选择文件?,mfc,Mfc,我不确定CMFCEditBrowseCtrl是否真的是为此而设计的,但我想使用它作为一种方式,让用户从对话框中选择一个文件,而不是手动使用一个按钮,该按钮的处理程序创建一个CFileDialog 我遇到的问题是,我想在选择文件时调用事件处理程序,但我不知道要捕获什么事件。我试图在“更改”上使用,但这使我的程序崩溃了-我点击了按钮,在“打开文件”窗口出现之前,我得到了一个奇怪的弹出窗口“无效文件选择”(或类似的,我这里没有代码),当我点击“确定”时,应用程序结束 这是控件的有效使用吗?如果是,最小

我不确定
CMFCEditBrowseCtrl
是否真的是为此而设计的,但我想使用它作为一种方式,让用户从对话框中选择一个文件,而不是手动使用一个按钮,该按钮的处理程序创建一个
CFileDialog

我遇到的问题是,我想在选择文件时调用事件处理程序,但我不知道要捕获什么事件。我试图在“更改”上使用
,但这使我的程序崩溃了-我点击了按钮,在“打开文件”窗口出现之前,我得到了一个奇怪的弹出窗口“无效文件选择”(或类似的,我这里没有代码),当我点击“确定”时,应用程序结束

这是控件的有效使用吗?如果是,最小样本是什么样的?

回答“最小样本”问题:

  • 使用MFC应用程序向导生成对话框应用程序

  • 在资源编辑器中,将MFC EditBrowse控件拖动到对话框上

  • 右键单击该控件,选择添加事件处理程序…
;在
消息类型:
列表中选择
EN\u CHANGE
,并(可选)更改
函数处理程序名称:

  • (可选)再次右键单击控件并选择添加变量…;如果未选中控制变量,则选中
    复选框;键入一个
    变量名:
    ,例如
    m\u浏览器

  • 这将增加

    DDX_Control(pDX, IDC_MFCEDITBROWSE1, m_browser);
    
    要使您的
    无效,请使用CMFCDlgDlg::DoDataExchange(CDATA Exchange*pDX)

    到消息映射,并使用此方法:

    void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
    {
    }
    
    我在演示中添加了以下代码:

    void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
    {
        CString str;
        m_browser.GetWindowTextW(str);
    }
    
    要回答您的“最小样本”问题,请执行以下操作:

    • 使用MFC应用程序向导生成对话框应用程序

    • 在资源编辑器中,将MFC EditBrowse控件拖动到对话框上

    • 右键单击该控件,选择添加事件处理程序…;在
      消息类型:
      列表中选择
      EN\u CHANGE
      ,并(可选)更改
      函数处理程序名称:

    • (可选)再次右键单击控件并选择添加变量…;如果未选中控制变量,则选中
      复选框;键入一个
      变量名:
      ,例如
      m\u浏览器

    这将增加

    DDX_Control(pDX, IDC_MFCEDITBROWSE1, m_browser);
    
    要使您的
    无效,请使用CMFCDlgDlg::DoDataExchange(CDATA Exchange*pDX)

    到消息映射,并使用此方法:

    void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
    {
    }
    
    我在演示中添加了以下代码:

    void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
    {
        CString str;
        m_browser.GetWindowTextW(str);
    }
    

    ON_EN_CHANGE
    是获取
    CMFCEditBrowseCtrl
    结果的正确方法。你做错了什么。什么使你的程序崩溃了?是否捕获更改上的
    事件?或者你在处理程序中做了什么?我更新了更多细节。因此,在选择文件并关闭“文件浏览器”对话框后,应启动“更改”上的
    “更改”
    ?当编辑框中的文本以任何方式更改(用户键入、文件浏览器dlg关闭等)时,您将获得“更改”上的
    。当您出现该弹出窗口时,您能进入调试器并查看调用堆栈中的内容吗?
    ON_EN_CHANGE
    是获取
    CMFCEditBrowseCtrl
    结果的正确方法。你做错了什么。什么使你的程序崩溃了?是否捕获更改上的
    事件?或者你在处理程序中做了什么?我更新了更多细节。因此,在选择文件并关闭“文件浏览器”对话框后,应启动“更改”上的
    “更改”
    ?当编辑框中的文本以任何方式更改(用户键入、文件浏览器dlg关闭等)时,您将获得“更改”上的
    。当你有弹出窗口时,你能进入调试器看看调用堆栈中有什么吗?