2009-10-28 2 views

ответ

29

Вы можете реализовать ON_WM_CTLCOLOR в своем классе диалога, без необходимости создавать новый 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); 
    } 
} 

Обратите внимание, что приведенный выше код устанавливает текст всех статических элементов управления в диалоговом окне. Но вы можете использовать переменную pWnd для фильтрации требуемых элементов управления.

+0

Вы правы. Это еще один способ сделать это. Я только что упомянул, как я думаю, лучше. В этом втором случае вам нужно добавить код в каждый диалог, который вы хотите отображать на этикетках другого цвета. –

+1

Да, я согласен, в этом случае ваш путь - лучший способ. Мой способ может быть использован, если кто-то хочет сделать серьезную переделку во всем диалоге (или приложении). – djeidot

+2

Возврат (HBRUSH) GetStockObject (NULL_BRUSH); вызовет проблему с картинкой (или фанкой прозрачного фона). Вероятно, вы захотите вернуться (HBRUSH) GetStockObject (WHITE_BRUSH); –

7

к сожалению, вы не найдете способ SetTextColor в классе CStatic. Если вы хотите изменить цвет текста CStatic, вам придется немного кодировать код.

На мой взгляд, лучший способ - создать свой собственный CStatic-производный класс (CMyStatic), и там будет сообщено уведомление 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); 
} 

Очевидно, что вы можете использовать переменную-член и метод установки для замены красного цвета (RGB (255.0.0)).

С уважением.

+1

Спасибо за ваше решение. Он работает с неожиданным побочным эффектом. Теперь мой статический контроль имеет другой цвет фона управления с моего основного вида, также, текст фона белый. – Sheen

6

Просто следовать до выпуска картины (прозрачный фон), которая причинила * возвращение (HBRUSH) GetStockObject (NULL_BRUSH); *

Легкое изменение, как показано ниже:

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

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

return hBrush; 

Надежда это помогает.

2

Из приведенных здесь ответов и других мест не было очевидно, как создать производный класс, который будет использоваться вместо CStatic, который обрабатывает сам цвет.

Так что работает для меня, используя MSVS 2013 Version 12.0.40629.00 Update 5. Я могу поместить в редактор ресурсов «Static Text» -control, а затем заменить тип переменной-члена TColorText.

В .h-файле:

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... 
}; 

в .cpp-файл:

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 
} 
Смежные вопросы