Jak zmienić kolor tekstu tekstu tekstowego CStatic? Czy istnieje prosty sposób inny niż przy użyciu CDC :: SetTextColor?MFC - zmiana koloru tekstu sterowania tekstem spoczynkowym
Dzięki ...
Jak zmienić kolor tekstu tekstu tekstowego CStatic? Czy istnieje prosty sposób inny niż przy użyciu CDC :: SetTextColor?MFC - zmiana koloru tekstu sterowania tekstem spoczynkowym
Dzięki ...
można zaimplementować ON_WM_CTLCOLOR
w klasie dialogowego, bez konieczności tworzenia nowej klasy CStatic pochodzącą:
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);
}
}
Zauważmy, że powyższy kod ustawia tekst wszystkich kontroli statycznych w oknie dialogowym. Możesz jednak użyć zmiennej pWnd
, aby odfiltrować wybrane formanty.
niestety nie znajdzie sposobu SetTextColor w klasie CStatic. Jeśli chcesz zmienić kolor tekstu CStatic, będziesz musiał napisać nieco więcej.
Moim zdaniem najlepszym sposobem jest stworzenie własnej klasy pochodnej CStatic (CMyStatic) i tamtej wiadomości powiadomienia 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);
}
Oczywiście można użyć zmiennej elementu i metody ustawiającej w celu zastąpienia koloru czerwonego (RGB (255,0,0)).
Pozdrawiam.
Dzięki za rozwiązanie. Działa z nieoczekiwanym efektem ubocznym. Teraz moja kontrola statyczna ma inny kolor tła kontrolnego niż mój widok główny, a tło tekstu jest białe. – Sheen
Wystarczy postępować aż do wydania malarstwa (przezroczystym tłem), co spowodowane * zwrotu (HBRUSH) GetStockObject (NULL_BRUSH), *
Łatwa zmiana, jak poniżej:
HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC &&
pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));
return hBrush;
nadzieję, że ten pomaga.
Z podanych tu odpowiedzi i innych miejsc nie było oczywiste, jak utworzyć klasę pochodną, która ma być używana zamiast CStatic, która obsługuje samo kolorowanie.
Oto, co działa dla mnie, używając MSVS 2013 Wersja 12.0.40629.00 Aktualizacja 5. Mogę umieścić "Statyczny tekst" -kontrolę w edytorze zasobów, a następnie zastąpić typ zmiennej składowej TColorText.
W .h-file:
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...
};
w .cpp akt:
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
}
bardzo pomocne.
https://msdn.microsoft.com/de-de/library/0wwk06hc.aspx
podobny do
HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC &&
pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));
return hBrush;
Masz rację. To jest inny sposób na zrobienie tego. Właśnie wspomniałem o tym, jak myślę, że jest lepszy. W tym drugim przypadku musisz dodać kod do każdego okna, w którym chcesz wyświetlić etykiety w innym kolorze. –
Tak, zgadzam się, w tym przypadku Twoja droga jest lepsza. Mój sposób może być użyty, jeśli ktoś chce przeprowadzić gruntowne przebudowanie w całym oknie dialogowym (lub aplikacji). – djeidot
Zwrot (HBRUSH) GetStockObject (NULL_BRUSH); spowoduje problem z malowaniem (lub funky przezroczystego tła "funkcja"). Prawdopodobnie chcesz powrócić (HBRUSH) GetStockObject (WHITE_BRUSH); –