2012-08-17 15 views
9

Sé que se puede hacer con OnCtlColor(), pero cambia de color cuando se carga el formulario y se dibujan los textos estáticos, quiero hacerlo después de cargar el formulario, con un temporizador tal vez, busqué una solución, pero no encontré una clara, esto es lo que escribí:cómo cambiar el color de fondo de un control de texto estático (cuando se presiona un botón o en un temporizador) en 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

Se debe llamar a OnCtlColor cada vez que se vuelve a dibujar un control. Intente invalidar la ventana y escriba la función OnCtlColor, que funciona según el estado actual, por ejemplo, usando algunas variables establecidas por el controlador WM_TIMER. –

+0

@AlexFarber: ¿Hay alguna forma de invalidar un solo control del formulario, no el formulario completo? porque cuando uso invalidar, vuelve a dibujar todo el formulario y provoca un parpadeo! –

Respuesta

9

Sin temporizador es necesario. Aquí tengo un bool m_coloured miembro de la clase initialized to false, y al presionar el botón presiona. OnCtlColor dibujará en rojo o en el color del sistema dependiendo del valor de m_coloured. Funciona bien

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

¿Hay alguna forma de invalidar un solo control del formulario y no el formulario completo? porque cuando uso invalidar, vuelve a dibujar todo el formulario y provoca un parpadeo! –

+2

@SamanHakimzadeh No es fácil porque OnCtlColor se reemplaza para el diálogo y no para el control. Si solo desea que el control se invalide, debe subclasificar el control CStatic, anular solo que es OnCtlColor (no el diálogo) y llamar solo a Invalidate. – acraig5075

+1

Usando su código, solo cambió el color de fondo del área de texto escrito. No dibuja todo el color de fondo del control de texto estático. ¿Cómo puedo hacer esto? – Nipun

Cuestiones relacionadas