Mfc 使用十六进制颜色值创建SolidBrush

Mfc 使用十六进制颜色值创建SolidBrush,mfc,gdi+,brush,Mfc,Gdi+,Brush,如何使用CreateSolidBrush方法在mfc应用程序中创建笔刷,并为颜色指定任何十六进制值 CBrush newBrush; COLORREF color = 0xFF00FFFF; newBrush.CreateSolidBrush(color); 希望这有帮助。接受类型为的参数。COLORREF是DWORD的别名,因此您可以简单地为其赋值: COLORREF color=0xFF00FF; HBRUSH hbr=::CreateSolidBrush(颜色); 确保遵守书面合同

如何使用CreateSolidBrush方法在mfc应用程序中创建笔刷,并为颜色指定任何十六进制值

CBrush newBrush;
COLORREF color = 0xFF00FFFF;  
newBrush.CreateSolidBrush(color);
希望这有帮助。

接受类型为的参数。
COLORREF
DWORD
的别名,因此您可以简单地为其赋值:

COLORREF color=0xFF00FF;
HBRUSH hbr=::CreateSolidBrush(颜色);
确保遵守书面合同:

高阶字节必须为零

一个更安全的替代方案是使用:

COLORREF color=RGB(0xFF,0x0,0xFF);
HBRUSH bhr=::CreateSolidBrush(颜色);
RGB
宏确保生成的
COLORREF
值符合所需的内存布局


如果需要从
COLORREF
(或
DWORD
)参数中提取各个颜色分量,可以使用、和宏:

DWORD dwCol=0xFF00FF;
字节r=GetRValue(dwCol);
字节g=GetGValue(dwCol);
字节b=GetBValue(dwCol);
虽然这确实有效,但它引入了特定于体系结构的代码。在这一点上,您可以简单地使用首字母
DWORD
代替
COLORREF
(如我的第一段所示)。

我找到了解决方案

#define GET_RVAL(num) (num & 0xff0000) >> 16
#define GET_GVAL(num) (num & 0x00ff00) >> 8
#define GET_BVAL(num) (num & 0x0000ff)
使用创建笔刷

hBrush = CreateSolidBrush(COLORREF(RGB(GET_RVAL(0xbfbfbf), GET_GVAL(0xbfbfbf), GET_BVAL(0xebfbfbf))));

MFC和GDI+是不同的库。您使用的是哪一个?这违反了“高阶字节必须为零”的规定。对不起,不是。如果您觉得迫切需要编写自己的预处理器宏,至少要正确执行。在这种情况下:始终将整个表达式包装在括号内。当然,重新发明轮子并没有多大帮助(见我的答案)。