2012-04-30 152 views
5

我正在使用MFC win32项目。我有2个CMFCEditBrowseCtrl控件的对话框。用户在这些控件上指定文件后,如何从这些控件获取文件路径?如何从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

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

更新

只要做到:

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

的断言失败可能是由于各种原因(跟踪到它看到的原因)。在对话框关闭之前,您可能必须抓取对话框代码中的文本。

+1

文档的GetWindowText函数:http://msdn.microsoft.com/en-us/library /db50wx7h(v=vs.100).aspx –

0

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

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); 
}