CEdit 编辑框的 hwnd 为空

Posted

技术标签:

【中文标题】CEdit 编辑框的 hwnd 为空【英文标题】:CEdit edit_box has hwnd null 【发布时间】:2016-01-28 13:15:21 【问题描述】:

我的 MFC 对话框上有 CEdit 控件:

class ODBC_Dialog : public CDialog

CEdit sql_edit_;
;

但是 ctor 后面的 sql_edit_ 变量的 hWnd = 0x00000000;

我怀疑它应该具有除此之外的一些值,因为它基本上具有 nullptr 值,所以我无法使用它,并且在尝试使用它时出现运行时错误。我应该以某种方式初始化这个变量吗?

【问题讨论】:

当您使用类向导将其添加为控制变量时,MFC 应该已经完成​​了必要的管道,以便您将成员变量与控件的资源标识符链接起来。例如,在 ::DoDataExchange 方法中应该有一个 DDX_Control 映射。 @dlatikay 是的,确实有:DDX_Control(pDX, IDC_EDIT1, sql_edit_); 尝试两件事:1) 确保 IDC_EDIT1 值实际上是分配给 resource.h 中控件的值,这些东西在移动时有时会变得不同步 2) 设置该 DDC_Control... 行上的断点并检查调试器是否在您希望变量被初始化的点之前被命中。不要指望这和ctor调用一样早,它会更晚。 @dlatikay 有趣的是,只有在我单击此对话框上的“确定”后才会调用 DoDataExchange。任何想法为什么?!?!? 你曾经在代码中使用过 sql_edit_ 变量吗?它可能已被优化为未使用的变量,从而欺骗了调试器。你将有一个 ::OnInitDialog 函数。尝试在那里为您的编辑框分配一些东西,例如 'sql_edit_.SetWindowText(L"some text")' 【参考方案1】:

检查是否在 ::DoDataExchange 中提到了控制变量。检查资源标识符是否与控件的标识符匹配。如果

::DoDataExchange()

不被调用,MFC 框架生命周期可能会被破坏,例如不调用重写的 ::On...Dialog... 成员函数的基类:

https://social.msdn.microsoft.com/Forums/en-US/872b8e39-db53-4635-87a8-42b2235a43d9/dodataexchange-not-called?forum=vclanguage

【讨论】:

是的,必须调用 Parent::OnInitDialog

以上是关于CEdit 编辑框的 hwnd 为空的主要内容,如果未能解决你的问题,请参考以下文章

CEdit框的NM_KILLFOCUS被调用两次

MFC,是不是有任何方便的方法可以在其成员函数中获取编辑框的内容?

MFC的Dialogbox多行文本框(CEdit)有最大字符限制,默认最大显示长度是?怎么实现显示160KB大小的文件

MFC中CEdit实现快捷键

CEdit编辑框

小 CEdit 控件的 CSpinButtonCtrl 绘图问题