Como desenhar caixas de grupo Delphi para ter fundos transparentes
-
03-07-2019 - |
Pergunta
Eu estou tentando obter algo muito sutil para o trabalho, ele parece muito terrível agora. Eu estou tentando pintar o fundo de uma TGroupBox que tenho sobrecarregado a função de pintura de modo que os cantos são mostrados através de seu objeto pai. Eu tenho um monte de caixas de grupo aninhadas que parecem muito decente sem XPThemes.
Existe uma maneira de pintar parte de um fundo transparente em tempo de execução. Eu estou programando o gerador de formulários, não usando Delphi opinião do projeto.
Solução
Estou tentando duplicar este problema com as seguintes etapas:
1 - Set tema padrão do Windows XP
2 - gota uma TGroupBox numa forma vazia (align = alNone)
3 - Gota dois TGroupBoxes no interior do primeiro, com align = alBottom e align = alClient
Mas visualmente parece muito bem para mim.
Você pode fornecer mais algumas informações sobre exatamente como você projetou o formulário? Algum código colado da .DFM seria ótimo.
Aqui está a parte relevante da minha 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
Outras dicas
quando eu tinha uma situação como essa, eu trabalhei com TGroupBox inicialmente, mas depois decidiu usar TPaintBox (chamado pb na amostra) e simular a parte gráfica do TGroupBox vez.
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, que era coxo, eu só precisava ParentBackground := false
não definir no meu construtor e pintar o interior da caixa de grupo quando apropriado.
Ha, que era coxo, eu só precisava não definir ParentBackground:. = False no meu construtor e pintar o interior da caixa de grupo quando apropriado
talvez haja algo que eu não sei, mas em minha experiência recente, não é tão simples como parece, porque de temas e saber exatamente o que área para pintar. mesmo TCanvas.FloodFill não funciona de forma confiável para este trabalho provavelmente porque, às vezes, o sistema operacional não precisa de tudo repaint.