1006150804 发表于 2025-1-15 20:39:48

编译器

VS2022 这么用hOldBrush = SelectObject(hdc, hBrush);报错误不能将(HGDIOBJ)类型的值分配到(HBRUSH)类型的实体

FishC 发表于 2025-1-15 20:40:11

这是由于 SelectObject 函数返回的是 HGDIOBJ 类型,而 hOldBrush 被定义为了 HBRUSH 类型,两者类型不匹配。

解决方法是将返回值强制类型转换为 HBRUSH。


hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);


注意强制类型转换需要小心使用,确保类型是匹配的,避免引发潜在错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

1006150804 发表于 2025-1-15 20:43:17

FishC 发表于 2025-1-15 20:40
这是由于 SelectObject 函数返回的是 HGDIOBJ 类型,而 hOldBrush 被定义为了 HBRUSH 类型,两者类型不匹配 ...

为什么课件教学时不用强制类型转换

FishC 发表于 2025-1-15 20:43:30

1006150804 发表于 2025-01-15 20:43
FishC 发表于 2025-1-15 20:40
这是由于 SelectObjec ...

这个问题的原因在于编译器版本和语言标准的不同。Visual Studio 的不同版本对类型转换的要求存在一些差异,同时新的编译器会进行更严格的类型检查。

在较早的开发环境(例如旧版本的 VS 或课程演示时使用的编译器)中,编译器可能默认允许从 HGDIOBJ 隐式转换为 HBRUSH,不会抛出类型不匹配的错误。所以在教学课件中可以省略强制类型转换。

而在新的编译器(如 VS2022)中,为了提高代码的安全性,类型检查变得更加严格,因此需要显式地进行强制类型转换。

总结:
1. 老版编译器: 类型转换可能是隐式允许的。
2. 新版编译器: 强调类型安全,必须进行显式转换。

如果代码需要兼容现代编译器,将返回值强制转换为目标类型是更为可靠的解决方案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 编译器