在 MFC 中将 CWnd 指针强制转换为 CEdit 指针

Casting CWnd pointer to CEdit pointer in MFC

本文关键字:指针 转换 CEdit 中将 CWnd MFC      更新时间:2023-10-16

发现了一些奇怪的问题。在我的 MFC 应用程序中,我正在尝试将 CWnd 指针投射到 CEdit 一个。我通过GetFocus函数检索CWnd指针。当我做dynamic_cast<CEdit*>(pWnd)时,它返回 0。能是什么?

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

其次,CWnd::FromHandle返回的CWnd*要么是现存的CWnd,要么如果没有,则围绕HWND的蝇量级包装。如果返回蝇量级包装器,即使基础HWND引用编辑控件,它也不会是CEdit

只有当您已经创建了一个CEdit来保存HWND时,您才会获得CEdit

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

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

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