winapi - usar - Cambiar el color del fondo y el título en MFC Control
winapi tutorial (1)
Puedo afirmar que traté de usar en OnCtlColor
en un CDialog
y funcionó para los controles estáticos y de edición.
Todo lo que tienes que hacer es:
Para cambiar el color de fondo, debe crear un pincel que aún exista fuera de esa función y devolver su
HBRUSH
conreturn (HBRUSH) m_brush.GetSafeHandle();
Por lo tanto, debe crear una variable (
m_brush
en este código) que sea miembro o estática (recomiendo la primera), y en la inicialización del diálogo debe crear el pincel que desee.Pensé que tal vez algunos controles no funcionarían con esto, y para aquellos que también hice
pDC->SetBkColor(RGB(0,0,255));
Pero parece no hacer nada; está en el código de seguridad.
Para cambiar el color del texto, lo hice
pDC->SetTextColor(RGB(255,0,0));
Estas experiencias funcionaron bien para ediciones y estáticas, ¡pero no funcionaron para groupboxes!
Los Groupboxes son una entidad extraña en MFC, una especie de platyplus: son un CButton
con BS_GROUPBOX
, pero en esta función, su nCtlColor
es CTLCOLOR_STATIC
lugar de CTLCOLOR_BTN
. Hice esto por ellos
UINT nStyle = (UINT)(pWnd->GetStyle() & 0x0F);
if(nStyle == BS_GROUPBOX)
{
return (HBRUSH) m_brush2.GetSafeHandle();
}
¡y lo que se pintó fue el pequeño rectángulo detrás del título de groupbox!
¡No pude cambiar el color del texto de las cajas de grupo!
Si tiene grupos de grupos y es realmente importante cambiar el color del texto de sus títulos, puede obtener uno de http://www.codeproject.com/Articles/29016/XGroupBox-an-MFC-groupbox-control-to-display -text y obtener sus partes esenciales del código: derivadas de los CStatic
, OnPaint()
y DrawItem()
. No olvide también ON_WM_PAINT()
en el mapa de mensajes. No sé si la OnEraseBkgnd()
y su ON_WM_ERASEBKGND()
son tan esenciales. También es necesario cambiarlos para que sean controles de texto estático en los recursos, declarar una variable XGroupBox
y hacer un Control
DDX_ de la misma. Lo probé y realmente funciona.
Para botones, con CButtons no funcionó. Pero, para cada botón, simplemente declaraba una variable CMFCButton
en la clase e hice un DDX_Control
de cada uno. Después, tuve dos opciones:
Establezca su propiedad
m_bTransparent
enTRUE
en el constructor de formularios (busque esta variable en el archivo afxbutton.cpp para referencia) para los que yo quería que tengan el mismo color que el formulario (también pinté el formulario, en mi caso estaba implementando temas en Una aplicación)Establezca el color de fondo con
SetFaceColor()
y establezca el Color del texto conSetTextColor()
en la inicialización del formulario.
Cuando el CMFCButton
no tiene estos elementos configurados, obtuvo su color de la combinación de temas del CMFCVisualManager
seleccionado actualmente.
Nota: También reemplacé mis entidades CSpinButton
con CMFCSpinButon
, porque quería colores del tema seleccionado.
En OnCtlColor
, la variable nCtlColor
es importante porque le permitirá personalizar diferentes colores para diferentes tipos, sin probar el éxito o el fracaso de dynamic_cast
para cada control.
No olvide agregar ON_WM_CTLCOLOR()
a su mapa de mensajes.
ACTUALIZACIÓN 1: después de seguir el consejo de la respuesta aceptada en http://social.msdn.microsoft.com/Forums/vstudio/en-US/53f47162-078a-418f-8067-ee61a81ceeac/checkbox-transparent-color-not- working-in-vs2008? forum = vcgeneral , hice mi propia clase de Groupbox, y ahora es como:
class CMyGroupBox: public CButton
{
protected:
virtual void PreSubclassWindow()
{
SetWindowTheme(*this, _T(""), _T(""));
#pragma comment(lib, "UxTheme.lib")
}
};
Acabo de declarar uno de estos, e hice DDX_Control
con su ID de control respectivo, y ahora puedo ver el texto en el color que proporcioné a SetTextColor
. Si devuelve un HBRUSH para este control, lo que se pinta es un rectángulo no relleno dibujado alrededor del título del grupo.
ACTUALIZACIÓN 2: Acabo de generalizar CMyGroupBox
para que sea CMyButton
, para usar su método PreSubClassWindow
no solo en PreSubClassWindow
, sino también en casillas de verificación y botones. En las casillas de verificación funciona bien, en los botones, no estoy tan satisfecho con los resultados.
ACTUALIZACIÓN 3: Estaba tratando de eliminar algún efecto extraño en la representación del texto y acabo de comentar el pDC->SetBkColor(RGB(0,0,255));
línea; el resultado fue un rectángulo feo al otro lado del texto :(. Luego lo reemplacé con pDC->SetBkMode(TRANSPARENT);
y también veo ese extraño efecto :(
ACTUALIZACIÓN 4: Para evitar tener que declarar todas mis casillas de verificación, grupos de cajas y botones como la clase que contiene el método PreSubClassWindow, investigué y descubrí que no es necesario hacerlo. El código
SetThemeAppProperties(0);
#pragma comment(lib, "UxTheme.lib")
AfxGetMainWnd()->SendMessage(WM_THEMECHANGED, 0U, 0L);
desactiva la creación de temas para todos los controles en todo el nivel de la aplicación.
Quiero cambiar el color del texto y el color de fondo para mi EDIT CONTROL, STATIC CONTROL y BUTTON CONTROL en la aplicación MFC. El control está en un diálogo CDialogEx
.
Intento agregar OnCtlColor (con el asistente en el estudio visual, en el mensaje WM_CTLCOLR) pero no puedo establecer el color del control estático y el control de botones.
También puse un punto de OnCtlColor
en la función OnCtlColor
(en la construcción IF), pero no recibo nada.
También traté de usar la función SetTextColor
recuperando el control del control de GetDlgItem
, pero no puedo cambiar el color como quiero.
Por favor, ayúdame.