我正在使用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);
同样的" Debug Assertion Failed"错误。我将尝试在对话未被解除的情况下获取文本。
更新3(已解决):
我设法通过实现回调
来获取路径文本BEGIN_MESSAGE_MAP(SpecifyInputDialog, CDialogEx)
ON_EN_CHANGE(IDC_MFCEDITBROWSE1, &SpecifyInputDialog::OnEnChangeMfceditbrowse1)
END_MESSAGE_MAP()
在处理程序方法中:
void SpecifyInputDialog::OnEnChangeMfceditbrowse1()
{
this->inFileCtrl.GetWindowText(this->inFileString);
}
所以你在对话框关闭时获取文本的想法是正确的。请更新您的答案,以便我将其标记为解决方案。
答案 0 :(得分:4)
CMFCEditBrowseCtrl从CEdit扩展,您可以使用GetWindowText
/ SetWindowText
访问当前显示的文件名。
<强>更新强>
只是做:
CString strText;
dlg.inFileCtrl.GetWindowText(strText);
失败的断言可能是由于多种原因(追查它以查明原因)。您可能必须在对话框关闭之前抓取对话框代码中的文本。
答案 1 :(得分:0)
你无法调用dlg。(任何控件).GetWindowTextA在DoModal之后 - 此时对话框窗口(以及所有子控件)不再存在。请尝试使用MFC的DDX(将所需的控件绑定到CString)或覆盖对话框中的OnOk方法 - 在此方法控件中可以访问。
答案 2 :(得分: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);
}