C++ 从HGDIOBJ到HBRUSH的转换

C++ 从HGDIOBJ到HBRUSH的转换,c++,winapi,g++,C++,Winapi,G++,(这个问题是在使用g++编译器的Win32API环境中提出的)。 我很难理解为什么下面这行代码不起作用 wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); wndclass是wndclass结构的一个实例,Windows API明确规定 其成员hbrBackground的类型为HBRUSH。此外,HBRUSH只是句柄的typedef,而句柄又是void*的typedef。因此,HBRUSH应为void*型。 现在,GetStockObje

(这个问题是在使用g++编译器的Win32API环境中提出的)。 我很难理解为什么下面这行代码不起作用

wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndclass是wndclass结构的一个实例,Windows API明确规定 其成员hbrBackground的类型为HBRUSH。此外,HBRUSH只是句柄的typedef,而句柄又是void*的typedef。因此,HBRUSH应为void*型。 现在,GetStockObject函数的返回类型是HGDIOBJ,它也被定义为句柄,因此是void*

Windows数据类型

GetStockObject

WNDCLASSEX

为什么编译时会出现以下错误:

invalid conversion from 'HGDIOBJ {aka void*}' to 'HBRUSH' [-fpermissive]
如果我显式地强制转换GetStockObject返回的值,它就会工作

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

谢谢任何帮助。

这是因为C++中禁止隐式转换>代码> VUT*>代码(不与C)。

作用

HGDIOBJ GetStockObject(int fnObject);
返回定义为
void*
HGDIOBJ

typedef void NEAR* HGDIOBJ;
您正在将其分配给HBRUSH,它是指向
struct

struct HBRUSH__;
typedef struct HBRUSH__ *HBRUSH;
(参见
windef.h

<> P>这种赋值在C中工作良好,C++中应该明确地表示:

wndclass.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
下面的某个地方声明\u HANDLE
定义为:

#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif

默认情况下,我们使用第6行的
DECLARE\u HANDLE
。在C++代码中,使用<代码> NoXialSux第9-10条。

< P> >,可以说<代码> GETStaseObjs< /Cord>返回<代码> GdiBase*/Cuff>,并且它需要一个强制转换派生类转换(例如,假定代码< HbApdiGDI < /代码>)。因此,您必须进行类型转换

class GDIBase;
class HBrushGDI : GDIBase;
GDIBase* GetStockObject(int);


HBrushGDI* pBrush;
pBrush = static_cast<HBrushGDI*>GetStockObject(WHITE_BRUSH);
GDIBase类;
HBrushGDI类:GDIBase;
GDIBase*GetStockObject(int);
HBrushGDI*pBrush;
pBrush=静态对象(白色笔刷);

它与类型转换从
GetProcAddress
返回的函数指针相同。因此,将类型转换为适当的类型是安全的(假设您知道正确的类型)。

我明白了,谢谢您的回答。然而,在我提供的链接(Windows数据类型)中,它清楚地指出:typedef HANDLE HBRUSH;此文档是否过时?@jensa这取决于是否定义了
STRICT
。如果是,Win32不透明对象类型具有不同的类型。如果没有,它们都是
void*
。在当前标题中,默认情况下,
STRICT
被定义为
1
,除非定义了
NO\u STRICT
。@jensa我通过添加一些关于
STRICT
@的信息改进了我的答案,感谢更新,特别是关于非常过时的Windows数据类型文档页面的信息。从现在起,我将查看头文件!
class GDIBase;
class HBrushGDI : GDIBase;
GDIBase* GetStockObject(int);


HBrushGDI* pBrush;
pBrush = static_cast<HBrushGDI*>GetStockObject(WHITE_BRUSH);