2017-01-02 1 views

Répondre

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

Espérons que cela aide.

+0

Cela enfreint la [documentation] (https://msdn.microsoft.com/en-us/library/dd183449.aspx): * "L'octet de poids fort doit être égal à zéro." * – IInspectable

1

CreateSolidBrush prend un argument de type COLORREF. Un COLORREF est un alias pour un DWORD, de sorte que vous pouvez attribuer simplement une valeur à elle:

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

Assurez-vous d'adhérer au contrat documenté:

L'octet de poids fort doit être zéro.

Une alternative plus sûre serait d'utiliser la place RGB macro:

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

Les RGB macro assure, que la valeur COLORREF résultante est conforme à la mise en page de mémoire requise.


Si vous avez besoin d'extraire les composants de couleur individuels à partir d'un argument COLORREF (ou DWORD), vous pouvez utiliser les GetRValue, GetGValue et GetBValue macros:

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

Bien que cela fonctionne, il introduit code spécifique à l'architecture. À ce stade, vous pouvez simplement utiliser le DWORD initial à la place d'un COLORREF (comme illustré dans mon premier paragraphe).

-1

J'ai trouvé la solution.

#define GET_RVAL(num) (num & 0xff0000) >> 16 
#define GET_GVAL(num) (num & 0x00ff00) >> 8 
#define GET_BVAL(num) (num & 0x0000ff) 

créer pinceau en utilisant

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

Désolé, non. Si vous ressentez le besoin impérieux d'écrire vos propres macros de préprocesseur, faites-le au moins correctement. Dans ce cas: ** Toujours ** envelopper l'expression entière entre parenthèses. Bien sûr, réinventer la roue n'est pas très utile de toute façon (voir ma réponse). – IInspectable