2012-08-17 104 views
9

我知道它可以用OnCtlColor()来完成,但是当表单被加载并且要绘制静态文本时它会改变颜色,我想在加载表单后用一个计时器来做,我可以搜索但我没有找到一个明确的一个解决方案,这是我写的:需要如何在mfc中更改静态文本控件的背景颜色(当按下按钮或定时器时)?

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; 
} 
+1

OnCtlColor应在每次重绘控件时调用。尝试使窗口无效,然后编写根据当前状态工作的OnCtlColor函数 - 例如,使用由WM_TIMER处理程序设置的一些变量。 – 2012-08-17 13:23:12

+0

@AlexFarber:无论如何,只有一个窗体的控件不是整个窗体才会失效吗?因为当我使用无效它重绘整个表单,并导致眨眼! – 2012-09-02 14:15:24

回答

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(); 
} 
+1

反正只有一个控件无效,而不是整个窗体?因为当我使用无效它重绘整个表单,并导致眨眼! – 2012-09-02 14:16:11

+2

@SamanHakimzadeh不容易,因为OnCtlColor被对话框而不是控件覆盖。如果你只想让控件失效,那么你必须继承CStatic控件的子类,只覆盖它的OnCtlColor(而不是对话框的),并且只调用它的Invalidate。 – acraig5075 2012-09-02 17:21:45

+1

使用你的代码,它只改变了书写文本区域的背景颜色。它不会绘制静态文本控件的整个背景颜色。我怎样才能做到这一点? – Nipun 2014-05-01 11:03:57

相关问题