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_OutputEditCE_OutputEdit 是作为OnInitDialog 的一部分创建和绑定的。检查GetDlgItem的返回值,只有当它返回非NULL时才执行你需要做的事情。

如果需要,在您调用 CDialog::OnInitDialog 并完成其他必要的初始化后,使用设置为 true 的变量。然后在OnSize 中使用此变量来确定您是否应该进行处理。不管怎样,你还是应该检查GetDlgItem的返回值

【讨论】:

呃,不要添加标志。只需检查GetDlgItem 的返回值。这就是你应该做的无论如何 同意,我已经更新了我的答案以更好地反映这一点。

以上是关于C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++(MFC)中开发 Maya 视口扩展 [关闭]

MFC(C++):为啥顶部的控件不接收事件?

c++ MFC访问多个文件

在 MFC (C++) 中捕获并保存窗口的屏幕截图

我安装vs2017时安装的c++没安mfc请问怎么单独添加这个组件

C++新手之详细介绍MFC