2009-10-28 11 views

Respuesta

29

Puede implementar ON_WM_CTLCOLOR en la clase de diálogo, sin tener que crear una nueva clase derivada de CStatic:

BEGIN_MESSAGE_MAP(CMyDialog, CDialog) 
    //{{AFX_MSG_MAP(CMyDialog) 
    ON_WM_CTLCOLOR() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor) 
{ 
    switch (nCtlColor) 
    { 
    case CTLCOLOR_STATIC: 
     pDC->SetTextColor(RGB(255, 0, 0)); 
     return (HBRUSH)GetStockObject(NULL_BRUSH); 
    default: 
     return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    } 
} 

en cuenta que el código anterior establece el texto de todos los controles estáticos en el diálogo. Pero puede usar la variable pWnd para filtrar los controles que desee.

+0

Tienes razón. Esta es otra forma de hacerlo. Acabo de mencionar la forma en que creo que es mejor. En este segundo caso, debe agregar el código a cada cuadro de diálogo que desea mostrar las etiquetas en otro color. –

+1

Sí, estoy de acuerdo, en este caso tu camino es la mejor manera. Mi camino podría ser utilizado si alguien quiere hacer una gran remodelación en todo el diálogo (o aplicación). – djeidot

+2

El retorno (HBRUSH) GetStockObject (NULL_BRUSH); causará un problema de pintura (o una "característica" funky de fondo transparente). Probablemente desee devolver (HBRUSH) GetStockObject (WHITE_BRUSH); –

7

por desgracia no se encontrará un método SetTextColor en la clase CStatic. Si desea cambiar el color del texto de un CStatic, deberá codificar un poco más.

En mi opinión, la mejor manera es crear su propia clase derivada de CStatic (CMyStatic) y allí el mensaje de notificación ON_WM_CTLCOLOR_REFLECT.

BEGIN_MESSAGE_MAP(CMyStatic, CStatic) 
    //{{AFX_MSG_MAP(CMyStatic) 
    ON_WM_CTLCOLOR_REFLECT() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
{ 
    pDC->SetTextColor(RGB(255,0,0)); 

    return (HBRUSH)GetStockObject(NULL_BRUSH); 
} 

Obviamente se puede utilizar una variable miembro y un método de selección para reemplazar el color rojo (RGB (255,0,0)).

Atentamente.

+1

Gracias por su solución. Funciona con algún efecto secundario inesperado. Ahora mi control estático tiene un color de fondo de control diferente de mi vista principal, también, el fondo de texto es blanco. – Sheen

6

Sólo un seguimiento de la cuestión pintura (fondo transparente), que causó por * retorno (HBRUSH) GetStockObject (NULL_BRUSH); *

Fácil cambio de la siguiente manera:

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 

if (nCtlColor == CTLCOLOR_STATIC && 
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd() 
) pDC->SetTextColor(RGB(255, 0, 0));  

return hBrush; 

Esperanza esta ayuda

2

De las respuestas dadas aquí y en otros lugares, no era obvio cómo crear una clase derivada para ser utilizada en lugar de CStatic que se encarga de colorear.

Lo que sigue es lo que funciona para mí, utilizando MSVS 2013 Versión 12.0.40629.00 Actualización 5. Puedo colocar un control "Static Text" en el editor de recursos, luego reemplazar el tipo de la variable miembro con TColorText.

En el .h-archivo:

class TColorText : public CStatic 
{ 
protected: 
    DECLARE_MESSAGE_MAP() 

public: 
    // make the background transparent (or if ATransparent == true, restore the previous background color) 
    void setTransparent(bool ATransparent = true); 
    // set background color and make the background opaque 
    void SetBackgroundColor(COLORREF); 
    void SetTextColor(COLORREF); 

protected: 
    HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); 

private: 
    bool MTransparent = true; 
    COLORREF MBackgroundColor = RGB(255, 255, 255); // default is white (in case someone sets opaque without setting a color) 
    COLORREF MTextColor = RGB(0, 0, 0); // default is black. it would be more clean 
             // to not use the color before set with SetTextColor(..), but whatever... 
}; 

en el .cpp archivo:

void TColorText::setTransparent(bool ATransparent) 
{ 
    MTransparent = ATransparent; 
    Invalidate(); 
} 

void TColorText::SetBackgroundColor(COLORREF AColor) 
{ 
    MBackgroundColor = AColor; 
    MTransparent = false; 
    Invalidate(); 
} 

void TColorText::SetTextColor(COLORREF AColor) 
{ 
    MTextColor = AColor; 
    Invalidate(); 
} 

BEGIN_MESSAGE_MAP(TColorText, CStatic) 
    ON_WM_CTLCOLOR_REFLECT() 
END_MESSAGE_MAP() 

HBRUSH TColorText::CtlColor(CDC* pDC, UINT nCtlColor) 
{ 
    pDC->SetTextColor(MTextColor); 
    pDC->SetBkMode(TRANSPARENT); // we do not want to draw background when drawing text. 
            // background color comes from drawing the control background. 
    if(MTransparent) 
    return nullptr; // return nullptr to indicate that the parent object 
        // should supply the brush. it has the appropriate background color. 
    else 
    return (HBRUSH) CreateSolidBrush(MBackgroundColor); // color for the empty area of the control 
} 
Cuestiones relacionadas