Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo cambiar el color de fondo del botón en VC++

Cómo cambiar el color de fondo del botón en VC++

1. En la programación de VC, se puede cambiar el color de fondo de los controles (como CView, CFrameWnd o CWnd, etc.) procesando mensajes específicos. Pero si desea cambiar el color del botón, solo puede usar botones autodibujados (también se pueden usar botones de mapa de bits) y no puede cambiarlo mediante OnCtlColor ().

2. En una aplicación MFC, se puede cambiar el color de fondo de un control sobrecargando la función OnCtlColor(). El método consiste en establecer el color requerido en esta función y luego devolver un controlador de pincel para volver a dibujar el color de fondo del control. La función OnCtlColor() procesa el color de fondo del control capturando el mensaje de control correspondiente. Los mensajes comúnmente utilizados de este tipo son:

Cuadro de diálogo CTLCOLOR_DLG

Cuadro de edición CTLCOLOR_EDIT

Cuadro de lista CTLCOLOR_LISTBOX

Cuadro de mensaje CTLCOLOR_MSGBOX

Control deslizante CTLCOLOR_SCROLLBAR

CTLCOLOR_STATIC cuadro de texto estático, rectángulo, etc.

 

El siguiente código de muestra ilustra cómo cambiar el color de fondo del control anterior:

//Definición de CmyDialog.h

clase CMyDialog: public Cdialog // Derive su propia clase de diálogo

{

……..

// Implementación

protegida:

// Funciones de mapa de mensajes generados

//{{AFX_MSG(CMyDialog)

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ;

…….

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

/ /CmyDialog definición de cpp

……

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

cambiar (nCtlColor) {

caso CTLCOLOR_EDIT:

caso CTLCOLOR_MSGBOX:

caso CTLCOLOR_DLG:

caso CTLCOLOR_EDIT: // Agregue aquí el mensaje de control cuyo color de fondo desea cambiar

pDC->SetBkMode(TRANSPARENT);

HBRUSH B = CreateSolidBrush(COLOR); //COLOR es el color que desea; para configurar

HBRUSH B = CreateSolidBrush(COLOR); //COLOR es el color que desea configurar

p>

return (HBRUSH) B;

predeterminado : //Otros controles establecen su propio color predeterminado y pincel de fondo.

return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

}}

Nota:

1), los mensajes anteriores se pueden procesar por separado para lograr diferentes colores de fondo para diferentes controles.

2). Este método no se aplica a los controles de botones.

3. Personaliza los botones para lograr diferentes colores.

Paso uno: deriva tu propio botón

//CcolorButton.h

clase CColorButton: public CButton

{

DECLARE_DYNAMIC(CColorButton)

público:

CColorButton();

virtual ~CColorButton();

BOOL Adjuntar( const UINT nID, CWnd* pParent,

const COLORREF BGColor = RGB(192, 123, 192), // El color de fondo del botón

const COLORREF FGColor = RGB (1 , 1, 1), //Color del texto

);

protegido:

virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //Redefinir la función virtual DrawItem<; /p>

void DrawFrame(CDC *DC, CRect R); //Dibujar marco del botón

void DrawFilledRect(CDC *DC, CRect R, COLORREF color); p>

void DrawLine(CDC *DC, CRect EndPoints, color COLORREF);

void DrawLine(CDC *DC, larga izquierda, larga arriba, larga derecha, larga abajo, color COLORREF);

void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);

//Dibuja el texto en el botón

COLORREF GetFGColor( ) { return m_fg }

COLORREF GetBGColor() { return m_bg }

privado:

COLORREF m_fg, m_bg;

p>

};

#endif

Paso 2: Definir cada función

//CcolorButton.cpp

… …

// CColorButton

IMPLEMENT_DYNAMIC(CColorButton, CButton)

CColorButton::CColorButton()

{ }

CColorButton ::~CColorButton()

{

}

//Definir la función Adjuntar()

BOOL CColorButton: :Attach( const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor)

{

if (!SubclassDlgItem(nID, pParent))

return FALSE ;

m_fg = FGColor;

m_bg = BGColor;

devuelve VERDADERO;

}

// Sobrecargar DrawItem()

voi

d CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)

{

CDC* pDC = CDC::FromHandle(lpDIS->hDC);

Estado UINT = lpDIS ->itemState;

CRect focusRect, btnRect;

focusRect.CopyRect(&lpDIS->rcItem); //Cuadro de puntos seleccionado del botón

btnRect( &lpDIS->rcItem);

//Establece el cuadro de puntos que indica que el botón está seleccionado

focusRect.left += 4;

focusRect.right - = 4;

focusRect.top += 4;

focusRect.bottom -= 4;

// Título del botón

const int bufSize = 512;

TCHAR buffer[bufSize];

GetWindowText(buffer, bufSize);

//Dibujar y etiquetar botones

DrawFilledRect(pDC, btnRect, GetBGColor());

DrawFrame(pDC, btnRect);

DrawButtonText(pDC, btnRect, buffer, GetFGColor()); >

//Si el botón está seleccionado, dibuja un cuadro de puntos seleccionado en él

if (state & ODS_FOCUS) {

DrawFocusRect(lpDIS->hDC, (LPRECT) &focusRect);

}

}

void CColorButton::DrawFrame(CDC *DC, CRect R)

{ //Dibujar Botones Los usuarios pueden personalizar botones de diferentes formas personalizando esta función.

DrawLine(DC, R.izquierda, R.arriba, R.derecha, R.arriba, RGB(255, 255, 255));

DrawLine(DC, R. left, R.top, R.left, R.bottom, RGB(255, 255, 255));

//A continuación se dibuja el borde exterior del botón para que tenga tres sensación dimensional

p>

DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));

// Dibuja los bordes izquierdo y superior del botón

DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB( 1, 1, 1 ));

//Dibuja los bordes derecho e inferior del botón

}

//Rellena el marco del botón con color

void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)

{

CBrush B;

B.CreateSolidBrush (color);

DC->FillRect(R, &B);

}

// DrawLine se usa para dibujar botones, es una función polimórfica

void CColorButton::DrawLine(CDC *DC, CRect EndPoints, color COLORREF)

{

}

void CColorButton::DrawLine(CDC *DC, largo izquierda, largo arriba, largo derecha, largo abajo, color COLORREF)

{

……

}

//Dibujar texto del botón

void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)

{

COLORREF prevColor = DC->SetTextColor(TextColor);

DC->SetBkMode(TRANSPARENTE);

DC->DrawText(Buf, strlen (Buf) , R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

DC->SetTextColor(prevColor);

}

Paso 3: hacer referencia a la clase personalizada

Personaliza cualquier cuadro de diálogo CColorDlg y dibuja un botón de control en él. La identificación es IDOK.

//CColorDlg.h

clase CColorDlg: CDialog público

{

…..

/ / Implementación

protegida:

CColorButton m_btnOK;

}

//CColorDlg.cpp

…… .

BOOL CColorBtnSampleDlg::OnInitDialog()

{

CDialog::OnInitDialog();

…….

VERIFY(m_btnOK.Attach(IDOK, esto, ROJO, AZUL, AMARILLO));

…….

}