c++ - MFC 类和 C++ 样式转换

标签 c++ casting mfc

我想知道我是否还没有完全理解 C++ 强制转换与旧 C 风格强制转换。在 MFC 中我有这个方法:

CWnd * GetDlgItem(UINT uResId);

我期待一个 CComboBox(或 CEdit),它是 derived来自 CWnd,需要这种转换:

dynamic_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
// for CEdit:
dynamic_cast<CEdit *>(GetDlgItem(IDC_EDIT1));

但是这个操作导致了使用空指针的崩溃,这意味着转换失败了。使用:

reinterpret_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
// for CEdit:
reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1));

解决了问题,但我很失望。 我错过了什么?

最佳答案

问题是 GetDlgItem 可能会返回一个临时的 CWnd* 指针。

如果窗口是 CWnd 派生类并且窗口是使用 CWnd::Create(Ex) 创建的或者窗口是子类,RTTI 将工作。

当窗口由 Windows 创建(由于对话框模板)并且窗口不是由 MFC 子类化时(使用 DDX_Control ow CWnd::SubclassWindow) ,GetDlgItem 只是返回一个临时的CWnd*,带有CWnd::FromHandle。此窗口句柄始终是基本类型 CWnd

如果您想检查此窗口是否真的是一个Edit 控件,您可以使用CWnd::GetClassName。转换为 CEdit* 既安全又方便,因为 CEdit 控件仅通过 Window 消息与其对应的 HWND 进行通信。所以这适用于所有基本的集成窗口类。

关于c++ - MFC 类和 C++ 样式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47324497/

相关文章:

c++ - 如何使用 STL 排序函数根据第二列对二维数组进行排序?

c++ - 如何为 MyClass** 传递 MyClass[][]?

java - Java 中子类和集合之间的类转换异常问题

通过指针将整数转换为 float

c++ - CString.Format 在 32 位中崩溃

c++ - 使用 OpenCV 2.4 在 MFC SDI View 或 Control 中加载图像

c++ - 允许访问命名空间外类的 protected 成员函数

c++ - 程序跳过一行代码

c++ - Qt 图像中的可点击区域?

c++ - 如何为 MFC 线程设置超时