C++ 如何从CMFCeditBrowsSectrl获取路径文本?

C++ 如何从CMFCeditBrowsSectrl获取路径文本?,c++,visual-studio-2010,winapi,mfc,C++,Visual Studio 2010,Winapi,Mfc,我正在从事MFC win32项目。我有两个CMFCeditBrowsSectrl控件的对话框。用户在这些控件上指定文件后,如何从这些控件获取文件路径 更新:这是我的代码 SpecifyInputDialog dlg; // this is my dialog inherited from CDialogEx dlg.DoModal(); CString strText; dlg.inFileCtrl.GetWindowTextA(strText.GetBuffer(), 500); // inF

我正在从事MFC win32项目。我有两个CMFCeditBrowsSectrl控件的对话框。用户在这些控件上指定文件后,如何从这些控件获取文件路径

更新:这是我的代码

SpecifyInputDialog dlg; // this is my dialog inherited from CDialogEx
dlg.DoModal();
CString strText;
dlg.inFileCtrl.GetWindowTextA(strText.GetBuffer(), 500); // inFileCtrl is CMFCEditBrowseCtrl object
最后一行出现“调试断言失败”错误

更新2:

CString strText;
dlg.inFileCtrl.GetWindowText(strText);
相同的“调试断言失败”错误。我将尝试在对话框未丢失时获取文本

更新3(已解决):

CString strText;
dlg.inFileCtrl.GetWindowText(strText);
我通过实现回调来获取路径文本

BEGIN_MESSAGE_MAP(SpecifyInputDialog, CDialogEx)
  ON_EN_CHANGE(IDC_MFCEDITBROWSE1, &SpecifyInputDialog::OnEnChangeMfceditbrowse1)
END_MESSAGE_MAP()  
在handler方法中:

void SpecifyInputDialog::OnEnChangeMfceditbrowse1()
{
    this->inFileCtrl.GetWindowText(this->inFileString);
}

所以您关于在对话框未关闭时获取文本的想法是正确的。请更新您的答案,以便我将其标记为解决方案。

CMFCeditBrowsSectrl是从CEdit扩展而来的,您可以使用
GetWindowText
/
SetWindowText
访问当前显示的文件名

更新

只要做:

 CString strText;
 dlg.inFileCtrl.GetWindowText(strText);

失败的断言可能是由多种原因造成的(跟踪它以查看原因)。您可能必须在对话框关闭之前获取对话框代码中的文本。

您不能调用dlg。(任何控件)。在DoModal之后获取WindowTextA-此时对话框窗口(以及所有子控件)不再存在。请尝试在对话框中使用MFC的DDX(将所需控件绑定到CString)或重写OnOk方法-在此方法中,控件是可访问的。

您将收到一个错误,因为在DoModal()返回后窗口关闭,而GetWindowTextA是一个从窗口句柄获取文本的通用函数。相反,您希望在MFC的DDX交换期间将该值放入字符串中。使用类向导,选择SpecifyInputDialog类,然后选择成员变量选项卡(默认为命令选项卡),并在该选项卡下选择浏览编辑控件的控件ID,然后选择添加变量。在“类别”下,将“控制”更改为“值”。这将把变量类型从CMFCEditBrowseCtrl更改为CString。给你的CString起个名字(比如inFileText),其余的都是自动的。您可以通过以下方式访问此字符串:

SpecifyInputDialog dlg; // this is my dialog inherited from CDialogEx
dlg.DoModal();
CString strText;
strText = dlg.inFileText; // after the data exchange, this has what you need
void SpecifyInputDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_BROWSE, inFileText);
}
代码向导生成的DDX如下所示:

SpecifyInputDialog dlg; // this is my dialog inherited from CDialogEx
dlg.DoModal();
CString strText;
strText = dlg.inFileText; // after the data exchange, this has what you need
void SpecifyInputDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_BROWSE, inFileText);
}
GetWindowText的文档: