win32 usar tutorial introduccion español ejemplos como winapi mfc

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 con

    return (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 en TRUE 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 con SetTextColor() 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.