【发布时间】:2012-01-17 22:08:18
【问题描述】:
我为 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);
}
这就是我将变量映射到控件的方式:
void CGateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_A, m_edit_a);
}
它是这样工作的:用户在编辑框中键入一些文本。然后他按下清除编辑框的“重置”按钮。这是一段代码,负责在点击重置按钮后清除编辑框:
void CGateDlg::OnBnClickedReset()
{
// clear edit box
m_edit_a.SetWindowTextW(L"");
}
应用程序启动时没有任何错误。我在 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);
}
我认为问题出在 hWnd:
this 0x0030fa54 {CEdit hWnd=0x00000000} CWnd * const
但是如何解决呢?
当我使用这个访问我的控件的值时一切正常:
CEdit *m_edit_a;
m_edit_a = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT_A));
m_edit_a->SetWindowTextW(L"");
我做错了什么?
【问题讨论】:
-
你能贴出全班的代码吗?
-
如何创建
CGateDlg?如果您不是从资源 id 创建它,那么DDX_Control可能对您不起作用,您可能需要在OnCreate重载中显式调用m_edit_a.Create以获取CGateDlg,然后才能使用CEdit -
“从资源 id 创建”到底是什么意思?您能否给我发一个链接或样本,让我可以看到它的外观?我现在正在工作,但我会在回家后尝试您的所有想法,并在必要时将整个标题和类粘贴在这里。