Pregunta

Chicos, ¿puede alguien explicarme brevemente cómo cambiar el color de fondo de un control de CEdit en tiempo de ejecución? Quiero poder cambiar el fondo a rojo si el campo es de longitud cero y el blanco normal de lo contrario.

¿Fue útil?

Solución

No puedes hacerlo con un CEdit simple, necesitas anular algunos bits.

Implemente su propio controlador ON_WM_CTLCOLOR_REFLECT, luego devuelva su CBrush de color en el controlador:

(más o menos, deberá colocar la administración de recursos habitual allí, recuerde eliminar el pincel en el destructor)

class CColorEdit : public CEdit
{
  ....
  CBrush   m_brBkgnd;
  afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)
  {
    m_brBkgnd.DeleteObject();
    m_brBkgnd.CreateSolidBrush(nCtlColor);
  }
}

Otros consejos

Esto también se puede hacer sin derivar de CEdit:

  1. Agregue ON_WM_CTLCOLOR () al bloque de código BEGIN_MESSAGE_MAP () de su cuadro de diálogo.
  2. Agregue OnCltColor () a su clase de diálogo:

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    
  3. Implemente OnCtlColor () así:

    HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        if ((CTLCOLOR_EDIT == nCtlColor) &&
            (IDC_MY_EDIT == pWnd->GetDlgCtrlID()))
        {
            return m_brMyEditBk; //Create this brush in OnInitDialog() and destroy in destructor
        }
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    }
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top