Comment dessiner des zones de groupe de Delphes pour avoir des fonds transparents
-
03-07-2019 - |
Question
J'essaie d'obtenir quelque chose de très subtil au travail, ça a l'air vraiment affreux en ce moment. J'essaie de peindre l'arrière-plan d'un TGroupBox dont j'ai surchargé la fonction de peinture afin que les angles soient visibles jusqu'à leur objet parent. J'ai un tas de groupes imbriqués qui ont l'air très décent sans XPThemes.
Existe-t-il un moyen de peindre une partie d'un fond transparent lors de l'exécution? Je programme le générateur de formulaire, sans utiliser la vue de conception Delphi.
La solution
J'essaie de reproduire ce problème en procédant comme suit:
1 - Définissez le thème sur Windows XP par défaut
2 - Déposez un TGroupBox sur un formulaire vide (align = alNone)
3 - Déposez deux TGroupBoxes dans le premier, avec align = alBottom et align = alClient
Mais visuellement, ça me va très bien.
Pouvez-vous fournir des informations supplémentaires sur la manière dont vous avez conçu le formulaire? Certains codes collés à partir du fichier .DFM conviendraient.
Voici la partie pertinente de mon 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
Autres conseils
quand j’ai eu une telle situation, j’ai travaillé avec TGroupBox au départ, mais j’ai ensuite décidé d’utiliser TPaintBox (appelé pb dans cet exemple) et de simuler la partie graphique de TGroupBox à la place.
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, c'était nul, je devais simplement ne pas définir ParentBackground: = false
dans mon constructeur et peindre l'intérieur de la zone de groupe, le cas échéant.
Ha, c'était nul, je devais juste ne pas définir ParentBackground: = false dans mon constructeur et peindre l'intérieur de la zone de groupe, le cas échéant.
Peut-être y a-t-il quelque chose que je ne sais pas mais, dans mon expérience récente, ce n'est pas aussi simple que cela en a l'air à cause des thèmes & amp; sachant exactement quel domaine peindre. Même TCanvas.FloodFill ne fonctionne pas de manière fiable pour ce travail probablement, car parfois, le système d'exploitation n'a pas besoin de tout repeindre.