1

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

4

1 回答 1

6

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

其次,CWnd*返回的CWnd::FromHandle要么是现存的CWnd,或者如果没有,则为围绕 a 的享元包装器HWNDCEdit如果返回享元包装器,即使底层HWND引用编辑控件,它也不会是 a 。

如果您CEdit已经创建了一个CEdit来保存HWND.

如果你想知道CWnd*你得到的是一个已经存在的对象,使用CWnd::FromHandlePermanent

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

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

于 2012-05-04T10:38:28.447 回答