2010-08-11 11 views
17

no estoy utilizando un cuadro de diálogo, im usando mi propia clase personalizada que me he registrado y luego se usa la llamada CreateWindow para crearlo, he preestablecer el color de fondo a rojo al registrarse:¿Cómo establecer el color de fondo de la ventana después de que la haya registrado?

WNDCLASSEX wc; 
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); 

pero ahora desea cambiar el color de fondo en tiempo de ejecución, por ejemplo haciendo clic en un botón para cambiarlo a azul.

He intentado utilizar la llamada SetBkColor() en WM_PAINT e intenté devolver un pincel desde el mensaje WM_CTLCOLORDLG, no funcionan.

¿Alguna ayuda?

Respuesta

17

De Window Background viene:

... El sistema pinta el fondo de una ventana o da la ventana de la oportunidad a hacerlo por enviándole un mensaje WM_ERASEBKGND cuando la aplicación llama a BeginPaint. Si una aplicación no procesa el mensaje sino que lo pasa a DefWindowProc, el sistema borra el fondo llenándolo con el patrón en el cepillo fondo especificado por la clase de la ventana .....

.. .... Una aplicación puede procesar el mensaje WM_ERASEBKGND aunque se haya definido un pincel de fondo de clase . Esto es típico en las aplicaciones que permiten al usuario cambiar el color o patrón de fondo de la ventana para una ventana especificada sin afectar otras ventanas en la clase. En tales casos , la aplicación no debe pasar el mensaje a DefWindowProc. .....

Por lo tanto, utilice el wParam del mensaje WM_ERASEBKGND para obtener el DC y pintar el fondo.

+0

Voy a intentar esto, gracias – Kaije

+0

sí, funcionó. manejé este mensaje y usé la llamada FillRect() para pintar mi fondo – Kaije

+0

Soy un poco nuevo en Windows C++. ¿A qué te refieres con 'DC' aquí? –

10

Puede intentar lo siguiente:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); 
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)brush); 
+0

Eso lo cambia para todas las instancias de esa clase. También deberá invalidar la ventana para que se borre y repinte. –

+0

Sí, esto funcionó, pero tengo mi propio contenedor de clases y la razón por la que quería configurarlo después de registrarlo es porque quiero que ventanas de la misma clase tengan diferentes colores de fondo. ¡ – Kaije

+0

funciona como un encanto en WTL! – sailfish009

4

Respuesta corta: Handle WM_ERASEBKGND. respuesta

más larga:

Cuando se registra la WNDCLASS, usted está proporcionando información sobre todas las ventanas de esa clase. Entonces, si desea cambiar el color de una sola instancia de la ventana, tendrá que manejarlo usted mismo.

Cuando sea el momento de volver a pintar la ventana, el sistema enviará a su wndproc un mensaje de WM_ERASEBKGND. Si no lo maneja, el DefWindowProc borrará el área del cliente con el color de la clase de ventana. Pero puede manejar el mensaje directamente, pintando cualquier color (o patrón de fondo) que desee.

Cuestiones relacionadas