Как изменить цвет текста элемента управления CStatic? Есть ли простой способ использовать CDC :: SetTextColor?MFC - изменить цвет текста cstatic text control
благодаря ...
Как изменить цвет текста элемента управления CStatic? Есть ли простой способ использовать CDC :: SetTextColor?MFC - изменить цвет текста cstatic text control
благодаря ...
Вы можете реализовать 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
для фильтрации требуемых элементов управления.
к сожалению, вы не найдете способ 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)).
С уважением.
Спасибо за ваше решение. Он работает с неожиданным побочным эффектом. Теперь мой статический контроль имеет другой цвет фона управления с моего основного вида, также, текст фона белый. – Sheen
Просто следовать до выпуска картины (прозрачный фон), которая причинила * возвращение (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;
Надежда это помогает.
Из приведенных здесь ответов и других мест не было очевидно, как создать производный класс, который будет использоваться вместо 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
}
Очень полезно.
https://msdn.microsoft.com/de-de/library/0wwk06hc.aspx
Alike к
HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC &&
pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));
return hBrush;
Вы правы. Это еще один способ сделать это. Я только что упомянул, как я думаю, лучше. В этом втором случае вам нужно добавить код в каждый диалог, который вы хотите отображать на этикетках другого цвета. –
Да, я согласен, в этом случае ваш путь - лучший способ. Мой способ может быть использован, если кто-то хочет сделать серьезную переделку во всем диалоге (или приложении). – djeidot
Возврат (HBRUSH) GetStockObject (NULL_BRUSH); вызовет проблему с картинкой (или фанкой прозрачного фона). Вероятно, вы захотите вернуться (HBRUSH) GetStockObject (WHITE_BRUSH); –