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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top