INFO: Usar el mensaje WM_CTLCOLOR

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

3.00 3.10 kbprg de WINDOWS

Resumen

WM_CTLCOLOR se envía un mensaje a una ventana cada vez que uno de sus controles de ventana secundaria (botón de opción, casilla de verificación, barra de desplazamiento etc.) se va a dibujar en la pantalla. Este mensaje precede a la pintura del control. Cuando es conveniente cambiar la apariencia de los controles, esto puede hacerse por procesar el mensaje WM_CTLCOLOR.

Más información

Cuando se envía WM_CTLCOLOR, wParam contiene un identificador para el contexto de presentación para la ventana secundaria (en este caso, el control). El LOWORD de lParam identifica la ventana secundaria por su número de identificación y el HIWORD de lParam contiene uno de los siguientes valores, especificando el tipo de control que se dibujará:

   CTLCOLOR_BTN            button control
CTLCOLOR_DLG dialog box
CTLCOLOR_EDIT edit control
CTLCOLOR_LISTBOX list box
CTLCOLOR_MSGBOX message box
CTLCOLOR_SCROLLBAR scroll bar
CTLCOLOR_STATIC static text, frame, or rectangle

Cuando se procesa WM_CTLCOLOR, debe devolverse un identificador de un pincel. Error al devolver un identificador de pincel resultará en una salida irrecuperable de ventanas en el monitor de depuración en la versión de depuración de Windows.


DefWindowProc() ya devuelve un identificador en respuesta a este mensaje; Sin embargo, una aplicación puede devolver un identificador diferente para personalizar el color de los controles. El identificador devuelto especifica el pincel para pintar el control. Por ejemplo, en Windows 2.x, el siguiente código dibuja el fondo de color gris claro de todos los botones:

   case WM_CTLCOLOR:      if (HIWORD(lParam) == CTLCOLOR_BTN)
return (GetStockObject(LTGRAY_BRUSH));

return (GetStockObject(WHITE_BRUSH));

En este caso, los fondos de todos los demás controles están pintados de blanco. Tenga en cuenta que GetStockObject() devuelve un identificador para el pincel material especificado por el parámetro. Para cambiar el color de fondo de un control de botón de Windows 3.0 y versiones posteriores, es necesario crear un botón de dibujo del propietario.


Devuelve un identificador del pincel presenta varias posibilidades interesantes porque los selectores del pincel no se limitan a los devueltos por GetStockObject(). Pinceles de motivo pueden generarse desde los mapas de bits. Si se devuelve un identificador de pincel de patrón en respuesta a un mensaje WM_CTLCOLOR, se utilizaría el pincel para pintar el fondo de los controles.


El código siguiente cambia la pintura del área de pista de una barra de desplazamiento pulgar en el patrón de trama de cesta encontrado en Paint:

   /* Add these global variables. The array of WORDs specifies the */    /* pattern for the brush                                        */ 
HBRUSH hBrush;
HBITMAP hBitmap;
WORD wWeave[]={0x0F, 0x8B, 0xDD, 0xB8, 0x70, 0xE8, 0xDD, 0x8E};

...

/* Add these lines to WinMain */
hBitmap = CreateBitmap(8, 8, 1, 1, (LPSTR)wWeave);
hBrush = CreatePatternBrush(hBitmap);

...

/* Add this case to the Windows procedure or wherever the */
/* messages are processed. */
case WM_CTLCOLOR:
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
return (hBrush);

return (GetStockObject(WHITE_BRUSH));

El mensaje WM_CTLCOLOR también se aplica a las cinco clases siguientes de controles:


  1. Casillas de verificación, botones de opción y botones de comando: pinta el área rectangular en la que se coloca el control con el pincel seleccionado; forma de control y el texto se dibuja sobre el modelo pintado.
  2. Control de edición: pinta el área de edición.
  3. Cuadro de grupo: pinta el área rectangular detrás del texto del título.
  4. Las barras de desplazamiento: pinta el área alrededor de la pista de control de posición.
  5. Cuadro de lista: pinta el área del anuncio.
Rectángulos, marcos y texto estático no se ven afectados por WM_CTLCOLOR.


Nota: en Windows 3.0 y versiones posteriores, una aplicación no puede cambiar el color de una imagen de botón. Sin embargo, el usuario puede utilizar el Panel de Control para cambiar los colores del botón para todas las aplicaciones del sistema. Esto puede realizarse mediante la modificación de la sección [colores] del archivo WIN. INI para añadir un "ButtonFace =" línea que especifica el valor de color RGB para el color de la cara de botón.


Procesar el mensaje WM_CTLCOLOR, sólo cambia el color de las ventanas secundarias creados por una aplicación. Windows envía el mensaje WM_CTLCOLOR a la ventana primaria de cada uno de estos controles. Controles de edición que se incluyen Windows como parte de las barras de desplazamiento o cuadros de lista no se ven afectados. El área de la pista de control de posición de las barras de desplazamiento generados por el sistema sólo puede cambiarse en WIN. INI o a través del Panel de Control.


También es posible pintar todo el fondo de un cuadro de diálogo. El código siguiente puede utilizarse para proporcionar un color del cuadro de diálogo:

   long FAR PASCAL MainWindowProc(....);
...

case WM_CREATE:
hTempBrush = LoadBitmap(hInst, (LPSTR)"MyPatternBrush");
hBrush = CreatePatternBrush(hTempBrush);
DeleteObject(hTempBrush);

...

case WM_DESTROY:
DeleteObject(hBrush);

...

BOOL FAR PASCAL
MyDialogProc(....);

...

case WM_CTLCOLOR:
if (bMonoChrome)
return (FALSE); // Do nothing if on a monochrome monitor
// bMonoChrome is a global set during
// initialization.

if (CTLCOLOR_DLG == HIWORD(lParam))
UnrealizeObject(hBrush);

SelectObject((HDC)wParam, hBrush);

if (CTLCOLOR_DLG == HIWORD(lParam))
SetBrushOrg((HDC)wParam, 0, 0);

SetBkMode((HDC)wParam, TRANSPARENT);

SetTextColor((HDC)wParam, RGB(0, 0, 0));

return(hBrush);

...

Este código garantiza que un mapa de bits con trama se alineará correctamente en el cuadro de diálogo completo. "MyPatternBrush" es el nombre de un mapa de bits creado mediante SDKPaint. Este mapa de bits debe estar incluido en el. Archivo RC.
Propiedades

Id. de artículo: 32685 - Última revisión: 01/17/2017 - Revisión: 1

Comentarios