我不确定
CMFCEditBrowseCtrl
是否真的是为此设计的,但我想用它作为一种让用户从对话框中选择文件的方式,而不是手动使用一个按钮,其处理程序创建一个 CFileDialog
。
我遇到的问题是我想在选择文件时调用事件处理程序,但我不知道要捕获什么事件。我尝试使用
ON_EN_CHANGE
但这使我的程序崩溃了 - 我单击了按钮,在打开文件窗口出现之前,我得到了一个奇怪的弹出窗口“无效的文件选择?????????” (或类似的,我这里没有代码),当我单击“确定”时,应用程序结束。
这是控件的有效使用吗?如果是,最小样本会是什么样子?
回答您的“最小样本”问题:
使用MFC App Wizard生成Dialog应用程序。
在资源编辑器中,将
MFC EditBrowse Control
拖到对话框上。右键单击该控件,选择
Add Event Handler...
;在 EN_CHANGE
列表中选择 Message type:
并(可选)更改 Function handler name:
。(可选)再次右键单击控件并选择
Add Variable...
;如果未选中,请选中 Control variable
复选框;输入 Variable name:
,例如 m_browser
。这将添加
DDX_Control(pDX, IDC_MFCEDITBROWSE1, m_browser);
给你的
void CMFCDlgDlg::DoDataExchange(CDataExchange* pDX)
,
ON_EN_CHANGE(IDC_MFCEDITBROWSE1, &CMFCDlgDlg::OnEnChangeMfceditbrowse1)
到消息映射,这个方法:
void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
{
}
我已将此代码添加到演示中,它可以工作:
void CMFCDlgDlg::OnEnChangeMfceditbrowse1()
{
CString str;
m_browser.GetWindowTextW(str);
}
void CBrowseEditDlg::OnEnChangeMfceditbrowse1()
{
UpdateData(TRUE); // This call sends data from the dialog
// controls to the attached member variables,
// in this case the chosen file name.
// Use FALSE to send data the opposite direction.
// Do something with the file name
AfxMessageBox(_T("You chose ") + m_chosen_file);
}