c++ - 在 MFC 中将 CWnd 指针转换为 CEdit 指针

标签 c++ mfc

发现了一些奇怪的问题。在我的 MFC 应用程序中,我试图将 CWnd 指针转换为 CEdit 之一。我通过 GetFocus 函数检索 CWnd 指针。当我在做 dynamic_cast<CEdit*>(pWnd) , 它返回 0。它可以是什么?

最佳答案

首先,MFC 库不是在启用 RTTI 的情况下编译的,因此 dynamic_cast 无论如何都不会工作。

其次,CWnd::FromHandle 返回的 CWnd* 要么是现存的 CWnd,要么是享元包装器围绕一个 HWND。如果返回享元包装器,它将不是 CEdit,即使底层 HWND 引用编辑控件也是如此。

如果您已经创建了一个 CEdit 来保存 HWND,您将只会得到一个 CEdit

如果您想知道您获得的 CWnd* 是针对一个已经存在的对象,请使用 CWnd::FromHandlePermanent

要获得 CEdit*,您需要显式创建一个,然后调用 Attach 将其附加到 HWND

或者,如果您想作弊,CEdit 没有数据成员或虚函数,而是直接从 CWnd 继承,因此您可以使用(理论上不安全的)static_cast ,因为它具有完全相同的内存布局。

关于c++ - 在 MFC 中将 CWnd 指针转换为 CEdit 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444940/

相关文章:

C++ : How do I only look at one dimension of a 2-Dimensional array?

c++ - 在没有终端或 SSH 访问权限的情况下编译 C++?

C++17 十六进制浮点文字单精度后缀冲突?

c++ - VC++创建Cdialog类断言错误

C++ MFC Windows - NVIDIA 3D Active Shutter API 替代方案

c++ - 删除指针成员数组,然后重新分配它

c++ - 优先级队列的自定义比较器

.net - 如何重新分发 .Net Framework

c++ - 链接时出现非常奇怪的错误(LNK1000)?

c++ - MFC中如何改变弹出窗口的默认位置