如何在mfc中更改静态文本控件的背景颜色(按下按钮或在计时器中)?

Sam*_*neh 9 mfc visual-c++

我知道它可以使用OnCtlColor()来完成,但它在加载表单时会改变颜色并且要绘制静态文本,我想在加载表单后执行它,可能有一个计时器,我搜索了一个解决方案但我没有找到一个明确的,这是我写的:

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;
}
Run Code Online (Sandbox Code Playgroud)

acr*_*075 9

不需要计时器.这里我有一个初始化为false的类的bool m_coloured成员,并在按下按钮时切换.OnCtlColor将以红色或系统颜色绘制,具体取决于m_coloured的值.很好地工作.

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();
}
Run Code Online (Sandbox Code Playgroud)

  • @SamanHakimzadeh不容易因为对话框而不是控件的OnCtlColor被覆盖.如果你只希望控件无效,那么你必须继承CStatic控件的子类,只覆盖它的OnCtlColor(不是对话框的),而只调用它的Invalidate. (2认同)