2017-01-02 44 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)參數提取單個顏色分量,可以使用 GetRValueGetGValue,並 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