색상에 16 진수 값을 지정하여 CreateSolidBrush 메서드를 사용하여 mfc 응용 프로그램에서 브러시를 만드는 방법은 무엇입니까?색상의 16 진수 값을 사용하여 CreateSolidBrush
답변
CBrush newBrush;
COLORREF color = 0xFF00FFFF;
newBrush.CreateSolidBrush(color);
희망이 있습니다.
이것은 [documentation] (https://msdn.microsoft.com/en-us/library/dd183449.aspx)를 위반합니다 : * "상위 바이트는 0이어야합니다."* – IInspectable
CreateSolidBrush은 COLORREF 인수를 취합니다.
상위 바이트 :
COLORREF color = 0xFF00FF; HBRUSH hbr = ::CreateSolidBrush(color);
하는 문서화 된 계약을 준수해야합니다 : 당신이 단순히에 값을 할당 할 수 있도록
COLORREF
는DWORD
의 별칭입니다 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, GetGValue 및 GetBValue 매크로를 사용할 수 있습니다 아키텍처 특정 코드. 그 시점에서
COLORREF
대신에 처음으로
DWORD
을 사용할 수 있습니다 (첫 번째 단락에서 설명한대로).
해결책을 찾았습니다.
#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))));
죄송합니다. 자신 만의 전 처리기 매크로를 작성해야 할 필요가 있다고 생각한다면 적어도 그렇게하십시오. 이 경우 : ** 항상 ** 괄호 안에 전체 식을 둘러 쌉니다. 물론, 바퀴를 다시 발명하는 것은별로 도움이되지 않습니다 (내 답변 참조). – IInspectable
가 MFC와 GDI +는 다른 라이브러리이다 사용하여 브러시를 만들 수 있습니다. 어느 쪽을 사용하고 있습니까? – IInspectable