2017-01-02 12 views

ответ

0
CBrush newBrush; 
COLORREF color = 0xFF00FFFF; 
newBrush.CreateSolidBrush(color); 

Надеюсь, это поможет.

+0

Это нарушает [документацию] (https://msdn.microsoft.com/en-us/library/dd183449.aspx): * «Байт высокого порядка должен быть равен нулю». * – IInspectable

1

CreateSolidBrush принимает аргумент типа COLORREF. COLORREF является псевдонимом для DWORD, так что вы могли просто присвоить ему значение:

COLORREF color = 0xFF00FF; 
HBRUSH hbr = ::CreateSolidBrush(color); 

Убедитесь придерживаться документированной договора:

высокого порядка байтов должен быть равен нулю.

Более безопасный альтернативы можно было бы использовать вместо RGB macro:

COLORREF color = RGB(0xFF, 0x0, 0xFF); 
HBRUSH bhr = ::CreateSolidBrush(color); 

В RGB макро гарантирует, что полученная COLORREF значение соответствует требуемой компоновке памяти.


Если вам нужно извлечь отдельные компоненты цветов из COLORREF (или DWORD) аргумента, вы можете использовать GetRValue, GetGValue и GetBValue макросов:

DWORD dwCol = 0xFF00FF; 
BYTE r = GetRValue(dwCol); 
BYTE g = GetGValue(dwCol); 
BYTE b = GetBValue(dwCol); 

Хотя это работа, она вводит специфический для архитектуры код. В этот момент вы можете просто использовать начальный DWORD вместо COLORREF (как показано в первом абзаце).

-1

Я нашел решение.

#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)))); 
+0

Извините, нет. Если вы чувствуете настоятельную необходимость писать свои собственные макросы препроцессора, по крайней мере, делайте это правильно. В этом случае: ** Всегда ** завершать все выражение в круглых скобках. Конечно, повторное изобретательство колеса не очень полезно в любом случае (см. Мой ответ). – IInspectable