Cómo dibujar cuadros de Delphi Group para tener fondos transparentes.
-
03-07-2019 - |
Pregunta
Estoy tratando de hacer que algo muy sutil funcione, se ve bastante horrible en este momento. Estoy tratando de pintar el fondo de un TGroupBox del que he sobrecargado la función de pintura para que las esquinas se vean a través de su objeto principal. Tengo un grupo de cuadros de grupo anidados que parecen muy decentes sin XPThemes.
¿Hay una forma de pintar parte de un fondo transparente en el tiempo de ejecución? Estoy programando el generador de formularios, no uso la vista de diseño de Delphi.
Solución
Estoy tratando de duplicar este problema con los siguientes pasos:
1: establecer el tema en el valor predeterminado de Windows XP
2: suelte un TGroupBox en un formulario vacío (align = alNone)
3 - Suelta dos TGroupBoxes dentro del primero, con align = alBottom y align = alClient
Pero visualmente se ve bien para mí.
¿Puede proporcionar más información sobre cómo diseñó el formulario exactamente? Algún código pegado desde el .DFM estaría bien.
Aquí está la parte relevante de mi DFM:
object GroupBox1: TGroupBox
Left = 64
Top = 56
Width = 481
Height = 361
Margins.Left = 10
Caption = 'GroupBox1'
ParentBackground = False
TabOrder = 0
object GroupBox2: TGroupBox
Left = 2
Top = 254
Width = 477
Height = 105
Align = alBottom
Caption = 'GroupBox2'
TabOrder = 0
end
object GroupBox3: TGroupBox
Left = 2
Top = 15
Width = 477
Height = 239
Align = alClient
Caption = 'GroupBox3'
TabOrder = 1
end
end
Otros consejos
cuando tuve una situación como esa, trabajé con TGroupBox inicialmente pero luego decidí usar TPaintBox (llamado pb en esta muestra) y simular la parte gráfica del TGroupBox en su lugar.
procedure TfraNewRTMDisplay.pbPaint(Sender: TObject);
const
icMarginPixels=0;
icCornerElipsisDiameterPixels=10;
begin
pb.Canvas.Pen.Color:=clDkGray;
pb.Canvas.Pen.Width:=1;
pb.Canvas.Pen.Style:=psSolid;
pb.Canvas.Brush.Color:=m_iDisplayColor;
pb.Canvas.Brush.Style:=bsSolid;
pb.Canvas.RoundRect(icMarginPixels,
icMarginPixels,
pb.Width-icMarginPixels*2,
pb.Height-icMarginPixels*2,
icCornerElipsisDiameterPixels,
icCornerElipsisDiameterPixels);
end;
Ha, eso fue poco convincente, solo necesitaba no establecer ParentBackground: = false
en mi constructor y pintar el interior del cuadro de grupo cuando sea apropiado.
Ha, eso fue escaso, solo necesitaba no establecer ParentBackground: = falso en mi constructor y pintar el interior del cuadro de grupo cuando sea apropiado.
tal vez haya algo que no sé, pero en mi experiencia reciente, no es tan simple como parece debido a los temas & amp; Sabiendo exactamente qué área pintar. incluso TCanvas.FloodFill no funciona de manera confiable para este trabajo, probablemente porque a veces, el sistema operativo no necesita volver a pintar todo.