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

bes*_*and 1 c++ mfc

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

Ben*_*Ben 5

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

其次,CWnd*返回的CWnd::FromHandle是现存的CWnd,或者如果没有,则是一个围绕着的轻量级包装HWND.如果返回flyweight包装器CEdit,即使底层HWND引用了编辑控件,它也不会是a .

CEdit如果你已经创建了一个CEdit来保存,你将只获得一个HWND.

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

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

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

  • 不,你需要做`GetClassName(HWND)`. (4认同)