Domanda

Sto cercando di far funzionare qualcosa di molto sottile, sembra davvero orribile in questo momento. Sto cercando di dipingere lo sfondo di un TGroupBox di cui ho sovraccaricato la funzione di disegno in modo che gli angoli vengano mostrati attraverso l'oggetto principale. Ho un sacco di caselle di gruppo nidificate che sembrano molto decenti senza XPThemes.

Esiste un modo per dipingere parte di uno sfondo trasparente in fase di esecuzione. Sto programmando il generatore di moduli, non usando la vista del design di Delphi.

È stato utile?

Soluzione

Sto cercando di duplicare questo problema con i seguenti passaggi:

1: imposta il tema sull'impostazione predefinita di Windows XP

2 - Rilascia un TGroupBox su un modulo vuoto (align = alNone)

3 - Rilascia due TGroupBox all'interno del primo, con align = alBottom e align = alClient

Ma visivamente mi sembra perfetto.

Puoi fornire ulteriori informazioni su come hai progettato il modulo? Qualche codice incollato dal .DFM andrebbe bene.

Ecco la parte rilevante del mio 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

Altri suggerimenti

quando ho avuto una situazione del genere, inizialmente ho lavorato con TGroupBox ma poi ho deciso di utilizzare TPaintBox (chiamato pb in questo esempio) e simulare invece la parte grafica di TGroupBox.

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;

Ah, che era zoppo, dovevo solo non impostare ParentBackground: = false nel mio costruttore e dipingere l'interno della casella di gruppo quando appropriato.

  

Ah, che era zoppo, dovevo solo non impostare ParentBackground: = false nel mio costruttore e dipingere l'interno della casella di gruppo quando appropriato.

forse c'è qualcosa che non conosco ma nella mia recente esperienza, non è così semplice come sembra a causa di temi e amp; sapendo esattamente quale area dipingere. anche TCanvas.FloodFill non funziona in modo affidabile per questo lavoro, probabilmente perché a volte il sistema operativo non ha bisogno di ridipingere tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top