C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败
Posted
技术标签:
【中文标题】C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败【英文标题】:C++ MFC - code execution failure without throwing runtime error on CDialog::OnSize event (GetWindowRect) 【发布时间】:2014-05-15 10:41:12 【问题描述】:我正在尝试访问 CDialog::OnSize 事件处理程序中的控件大小属性。代码编译并运行,但似乎在 GetWindowRect 处失败。我可以看到没有引发运行时错误,但是包括和跟随 GetWindowRect 调用的代码无法运行。
我在发布和调试模式下运行,断点位于适当的位置(未命中 GetWindowRect)。我还使用了修改 GetWindowRect 之后的一些成员变量的代码作为附加测试,我也可以看到它没有运行。
virtual void CMainFormDialog::OnSize(UINT nType, int cx, int cy)
....
auto pOutputEdit = (CEdit*) GetDlgItem(CE_OutputEdit);
CRect pOutputEditRect;
// No code is executed following this statement...
pOutputEdit->GetWindowRect(&pOutputEditRect);
....
我在这里尝试访问我的 CEdit 控件属性的方式是否有问题,为什么它会静默失败?
谢谢。
【问题讨论】:
您确认 GelDlgItem 不返回 NULL 吗? 刚刚检查过,是的,它确实返回 NULL。我在主对话框成员函数中使用相同的代码没有问题。我需要在事件处理程序中做些什么不同的事情? 好的,我知道现在发生了什么。第一次点击代码是在加载 UI 时。控件尚未初始化。随后的 OnSize 事件以 pOutputEdit != NULL 运行。问题已解决,谢谢。 【参考方案1】:OnSize 可能在创建对话框时调用,此时可能尚未创建 CE_OutputEdit
。 CE_OutputEdit
是作为OnInitDialog
的一部分创建和绑定的。检查GetDlgItem的返回值,只有当它返回非NULL时才执行你需要做的事情。
如果需要,在您调用 CDialog::OnInitDialog
并完成其他必要的初始化后,使用设置为 true 的变量。然后在OnSize
中使用此变量来确定您是否应该进行处理。不管怎样,你还是应该检查GetDlgItem
的返回值
【讨论】:
呃,不要添加标志。只需检查GetDlgItem
的返回值。这就是你应该做的无论如何。
同意,我已经更新了我的答案以更好地反映这一点。以上是关于C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++(MFC)中开发 Maya 视口扩展 [关闭]