5

我正在研究 MFC win32 项目。我有 2 个 CMFCEditBrowseCtrl 控件的对话框。用户在这些控件上指定文件后,如何从这些控件中获取文件路径?

更新:这是我的代码

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(已解决):

我设法通过实现回调来获取路径文本

BEGIN_MESSAGE_MAP(SpecifyInputDialog, CDialogEx)
  ON_EN_CHANGE(IDC_MFCEDITBROWSE1, &SpecifyInputDialog::OnEnChangeMfceditbrowse1)
END_MESSAGE_MAP()  

在处理程序方法中:

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

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

4

3 回答 3

4

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

更新

做就是了:

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

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

于 2012-04-30T13:28:41.447 回答
0

您不能在 DoModal 之后调用 dlg.(any control).GetWindowTextA - 此时对话框窗口(以及所有子控件)不再存在。请尝试使用 MFC 的 DDX(将所需控件绑定到 CString)或在对话框中覆盖 OnOk 方法 - 在此方法中可以访问控件。

于 2012-05-07T14:10:15.780 回答
0

您收到一个错误,因为在 DoModal() 返回后窗口关闭,并且 GetWindowTextA 是一个从窗口句柄获取文本的通用函数。相反,您希望在 MFC 的 DDX 交换期间将此值放入字符串中。使用类向导,选择您的 SpecifyInputDialog 类,然后选择 Member Variables 选项卡(默认为 Commands 选项卡),在该选项卡下选择浏览编辑控件的控件 ID,然后选择 Add Variable。在类别下,将控制更改为值。这会将变量类型从 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

代码向导生成的 DDX 如下所示:

void SpecifyInputDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_BROWSE, inFileText);
}
于 2017-05-30T18:42:44.580 回答