我为CEdit创建了一个控件的变量:
class CGateDlg : public CDialog
{
...
public:
// here is my control's variable
CEdit m_edit_a;
// here I map variable to control
virtual void DoDataExchange(CDataExchange* pDX);
}
Run Code Online (Sandbox Code Playgroud)
这就是我将变量映射到控件的方式:
void CGateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_A, m_edit_a);
}
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理:用户在编辑框中键入一些文本.然后他按下"重置"按钮,清除编辑框.这是一段代码,负责在单击"重置"按钮后清除编辑框:
void CGateDlg::OnBnClickedReset()
{
// clear edit box
m_edit_a.SetWindowTextW(L"");
}
Run Code Online (Sandbox Code Playgroud)
应用程序启动时没有任何错 我在EditBox中键入一些文本并点击"重置"按钮.然后我得到一个错误,导致我winocc.cpp,第245行(ENSURE(this)):
void CWnd::SetWindowText(LPCTSTR lpszString)
{
ENSURE(this);
ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}
Run Code Online (Sandbox Code Playgroud)
我认为问题在于hWnd:
this 0x0030fa54 {CEdit hWnd=0x00000000} CWnd * const
Run Code Online (Sandbox Code Playgroud)
但是如何解决呢?
当我使用以下方法访问控件的值时,一切正常:
CEdit *m_edit_a;
m_edit_a = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT_A));
m_edit_a->SetWindowTextW(L"");
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
我可以看到两种可能性:
对话框启动时控件不存在.CDialog :: OnInitDialog将要做的第一件事是调用DoDataExchange,所以如果你在初始化过程中稍后创建控件,那就太晚了.
您自己的OnInitDialog未调用CDialog :: OnInitDialog,因此未调用DoDataExchange.