6

我是 ATL 的新人。所以请原谅我问这个问题。

问题描述:CEdit ATL 对话框类中增加了 一个控件。它附加在对话框初始化函数中。

//Define the edit control
ATLControls::CEdit  m_txtInput;

//In the OnInitDialog function
m_txtInput.Attach(GetDlgItem(IDC_INPUT_LINE));

m_txtInput.SetWindowText(_T("New directory"));

//In the public memeber function of the dialog GetInput()
//I have tried three kinds of method to get the text. But all of them are throw an 
//assert exception, IsWindow() failed. 
//1.
GetDlgItemText(IDC_INPUT_LINE, input);
//2.
ZeroMemory(m_lptstrInput, MAX_PATH);
m_txtInput.GetLine(0, m_lptstrInput, MAX_PATH);
//3.
BSTR input; 
m_txtInput.GetWindowText(input);

是一个关于如何从中获取文本的主题,CEdit但它不起作用。

为什么CEdit控件可以用函数设置文本,SetWindowText()但不能通过函数获取文本GetWindowText()?这真的让我很困惑。如果有人可以为我解释,非常感谢。

4

2 回答 2

7

CEdit不是 ATL 类。命名空间ATLControls从何而来?有一个具有此名称的 WTL 类,从中获取文本很容易:

    ATLASSERT(Edit.IsWindow()); // Make sure the control holds a handle
    CString sWindowText;
    Edit.GetWindowText(sWindowText);

然而,该方法GetWindowText来自 ATL,并包含GetWindowTextLengthAPI GetWindowText。后面的 MSDN 文章也有一个代码片段,显示了典型用法。

既然你提到这IsWindow对你不起作用,最可能的问题是你的编辑控件包装类变量没有真正的控件句柄,因此从无到有获取文本是不可能的。

于 2013-01-29T07:24:35.803 回答
1

这已经用 MFC & VS2015 测试过:

//
// Get char string/CString from CEdit m_ceDate;
// where
// DDX_Control(pDX, IDC_EDIT_DATE, m_ceDate);

char cdateBuf[128];
UINT nCountOfCharacters = GetDlgItemText(IDC_EDIT_DATE, cdateBuf, 16);
CString csDate = cdateBuf; 
于 2017-03-29T01:02:42.557 回答