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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top