how to change background color of a static text control (when a button is pushed or in a timer) in mfc?

33,230

No timer is needed. Here I have a bool m_coloured member of the class initialized to false, and toggled in the button press. The OnCtlColor will draw in red or in the system colour depending on the value of m_coloured. Works nicely.

HBRUSH Cmfcvs2010Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    if (nCtlColor == CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_LABEL)
    {
        DWORD d = GetSysColor(COLOR_BTNFACE);

        COLORREF normal = RGB(GetRValue(d), GetGValue(d), GetBValue(d));
        COLORREF red = RGB(255, 0, 0);

        pDC->SetBkColor(m_coloured ? red : normal);

    }
    return hbr;
}


void Cmfcvs2010Dlg::OnBnClickedButton1()
{
    m_coloured = !m_coloured;
    Invalidate();
}
Share:
33,230
Saman Hakimzadeh Abyaneh
Author by

Saman Hakimzadeh Abyaneh

A Software engineer. I have experience coding with C, MATLAB, C++, C#, MFC, WPF, JAVA, JAVAScript, HTML and CSS, DBMS like Oracle and SQLServer, reporters like Stimulsoft and Crystal Report, also worked with SSIS, SSRS, PowerBI and PBI Report Server. But I'm only good at WPF and SQLServer. I had worked with small teams so I had to learn and do everything myself, not pro in any of them of course but became good at system design and production management.

Updated on August 17, 2022

Comments

  • Saman Hakimzadeh Abyaneh
    Saman Hakimzadeh Abyaneh almost 2 years

    I know it can be done with OnCtlColor(), but it changes colors when the form is being loaded and the static texts are to be drawn, I want to do it after form is loaded, with a timer maybe, I searched for a solution but I didn't find a clear one, this is what I wrote:

    void CTabFive::OnBnClickedButton1()
    {
        // TODO: Add your control notification handler code here
        CWnd* pWnd = this->GetDlgItem(IDC_Chromosome1);
        CDC* dc = pWnd->GetDC();
        dc->SetBkColor(RGB(200,0,0));
        pWnd->Invalidate();
        pWnd->UpdateWindow();
        Invalidate();
        UpdateWindow();
        //flag = true;
    }
    
  • Saman Hakimzadeh Abyaneh
    Saman Hakimzadeh Abyaneh almost 12 years
    Is there anyway to invalidate just one control of the form not the whole form? cause when I use invalidate it redraws the whole form and it causes a blink!
  • acraig5075
    acraig5075 almost 12 years
    @SamanHakimzadeh Not easily because the OnCtlColor is overriden for the dialog not the control. If you want only the control to invalidate, then you must subclass the CStatic control, override only it's OnCtlColor (not the dialog's), and call only it's Invalidate instead.
  • Nipun
    Nipun about 10 years
    Using your code, it only changed background color of written text area. It doesn't draw entire background color of static text control. How can I do this?
  • Gutblender
    Gutblender about 9 years
    @Nipun I can color the whole background by returning (HBRUSH)CreateSolidBrush(yourDesiredCOLORREF) from OnCtlColor. However, I have not managed to also color the modal frame border (if you have one).