2017-01-02 11 views

답변

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

희망이 있습니다.

+0

이것은 [documentation] (https://msdn.microsoft.com/en-us/library/dd183449.aspx)를 위반합니다 : * "상위 바이트는 0이어야합니다."* – IInspectable

1

CreateSolidBrushCOLORREF 인수를 취합니다.

상위 바이트 :

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

하는 문서화 된 계약을 준수해야합니다 : 당신이 단순히에 값을 할당 할 수 있도록 COLORREFDWORD의 별칭입니다 0이어야합니다.

더 안전한 대안은 RGB macro 대신 사용하는 것입니다 :

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

RGB 매크로 보장 결과 COLORREF 값이 필요한 메모리 레이아웃을 준수 함. 이 작품은, 그것은 소개 않지만

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

: 당신이 COLORREF (또는 DWORD) 인수에서 개별 색상 구성 요소를 추출해야하는 경우


, 당신은 GetRValue, GetGValueGetBValue 매크로를 사용할 수 있습니다 아키텍처 특정 코드. 그 시점에서 COLORREF 대신에 처음으로 DWORD을 사용할 수 있습니다 (첫 번째 단락에서 설명한대로).

-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