2012-08-22 24 views
10

En una aplicación Delphi 2010 con temas habilitados Tengo dos TPageControls (uno dentro del otro) en una forma con un fondo clMoneyGreen:Cómo reparar el color de fondo de TPageControl sin perder el tema del sistema?

enter image description here

El control de la página externa dibujar correctamente su fondo con el color de la componente principal, el control de página interno sin embargo dibuja su fondo con clBtnFace (puntos suspensivos rojos en la imagen) en lugar de su control principal (TTabSheet) 's blanco. ¿Hay alguna manera de solucionar esto sin devolver el control de página a su aspecto clásico de Windows (perder el tema de Windows)?

Todas las correcciones que he encontrado en Google y aquí en Stack Overflow involucran OwnerDraw que hacen que el control de página pierda su temática.

He intentado crear un nuevo componente de control de la página heredada de TPageControl con un método para manejar el mensaje ventanas WM_ERASEBKGND:

procedure TMyPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd); 
begin 
    if Parent is TCustomPageControl then 
    begin 
    Brush.Color := clWhite; 
    Windows.FillRect(Msg.dc, ClientRect, Brush.Handle); 
    Msg.Result := 1; 
    end 
    else 
    inherited; 
end; 

Se pinta el fondo blanco sino algún otro método llamado después WM_ERASEBKGND (supongo TWinControl de Método WM_PAINT) repinta gris sobre el fondo blanco.

Nota: Estoy investigando esto porque estoy implementando el tema en una aplicación grande portada desde Delphi 7, es por eso que estoy tratando de resolver este problema a través de un componente derivado: puedo buscar y reemplazar fácilmente todos los 207 TPageControl ocurre con mi nueva clase, pero colocar paneles detrás de algunos de ellos requeriría mucho más tiempo.

Respuesta

11

Es un error conocido en Delphi 2010. Puede solucionarlo agregando un panel que es un elemento secundario de la hoja de tabla más externa y es el elemento primario del control de página interno.

No tengo idea de por qué esto soluciona el problema. Solo descubrí la solución yo mismo porque noté que en mi aplicación, los únicos controles de página/pestaña anidados que se representaban correctamente eran aquellos con un panel adecuadamente interpuesto.

Si no recuerdo mal, el defecto no está presente en las últimas versiones de Delphi.

+2

Esta [página de embarcadero] (http://qc.embarcadero.com/wc/qcmain.aspx?d=80381) todavía informa el error como abierto –

+2

Por cierto, lea esta página para obtener más información acerca de aceptando respuestas: http://meta.stackexchange.com/questions/5234/ Gracias –

+0

Gracias a un amigo, he logrado tener en mis manos una instalación Delphi XE2 y el control de página funciona como se esperaba. Voy a esperar un poco más, si nadie más responde la pregunta, voy a elegir tu respuesta. –

Cuestiones relacionadas