![]() |
BackgroundColor von eigener Klasse weitergeben (ParentColor)
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend an alle Delphianer,
seit mehreren Tagen bemühe ich die Forensuchen und finden keine passende Antwort auf mein Problem. Es mag auch daran liegen, dass ich nicht genau weiß mit welchen Begriffen ich suchen sollte. Ich habe eine eigene Klasse abgeleitet von TCustomControl erstellt (TMyPanel), die ein Rechteck mit Abgerundeten Ecken zeichnet. Soweit funktioniert alles, aber wenn ich dann auf ein TPanel (1) mein TMyPanel (2) ein weiteres TMyPanel (3) lege, nehmen die Ecken (von 3) außerhalb der Rundung die Farbe von dem Panel (1) und nicht von (2) an. Welche Methode oder Eigenschaft muss implementiert werden damit in meinem TMyPanel es genau so aussieht, wie bei TPanel? Da ich mich warscheinlich ein wenig kompliziert ausgedrückt habe, anbei ein Screenshot. |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Vielleicht kannst du ja mal den Code von deinem Panel zeigen, damit man sehen kann, wie du das umgesetzt hast.
|
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Etwas Code hätte ich natürlich mitschicken können, aber ich dachte das könntet ihr mir auch ohne sagen, aber hier der Code:
Delphi-Quellcode:
... protected procedure Click; override; procedure DoEnter; override; procedure DoExit; override; procedure KeyPress(var Key: Char); override; procedure Paint; override; ... public constructor Create(AOwner: TComponent); override; destructor Destroy; override; ... constructor TMyPanel.Create(AOwner: TComponent); begin inherited; ControlStyle := ControlStyle + [csAcceptsControls] - [csSetCaption] + [csParentBackground]; self.DoubleBuffered := True; FHover := True; FMouseOver := False; FOwner := AOwner; FBorder := True; FBorderColor := clGreen; FBorderColorChecked := clRed; FBorderColorFocused := clYellow; FBorderColorHover := clGreen; FBorderWidth := 1; FBorderWidthChecked := 1; FBorderWidthFocused := 1; FBorderWidthHover := 1; ... end; procedure TMyPanel.Paint; var r: TRect; begin inherited; if (csDesigning in ComponentState) or (not FMouseOver) then begin Canvas.Brush.Style := FBrushStyle; Canvas.Brush.Color := FPanelColor; Canvas.Pen.Color := FBorderColor; Canvas.Pen.Width := FBorderWidth; end; case FPanelStyle of psRect: Canvas.Rectangle(0, 0, Width, Height); psRoundRect: Canvas.RoundRect(0, 0, Width, Height, FPanelRounding, FPanelRounding); psCircle: Canvas.Ellipse(FBorderWidth, FBorderWidth, Width, Height); end; PaintCaption; end; |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Versuch mal deinem Panel auch tatsächlich die entsprechende Form zu geben.
Beispiel für ein Rechteck mit abgerundeten Ecken:
Delphi-Quellcode:
Für andere Formen stehen noch andere Rgn zur Verfügung:
procedure SetRegion(AControl : TWinControl;ARadius : integer = 10);
var rgn: HRGN; begin rgn := CreateRoundRectRgn(0,// x-coordinate of the region's upper-left corner 0, // y-coordinate of the region's upper-left corner AControl.Width, // x-coordinate of the region's lower-right corner AControl.Height, // y-coordinate of the region's lower-right corner (ARadius * 2), // height of ellipse for rounded corners (ARadius * 2)); // width of ellipse for rounded corners SetWindowRgn(AControl.Handle, rgn, True); end; CreateEllipticRgn CreatePolyPolygonRgn CreatePolygonRgn CreateRectRgn CreateRoundRectRgn |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Und nicht vergessen, die Region nach Gebrauch mit DeleteObject wieder zu entsorgen ;)
|
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Tipps, ich habe sie umgesetzt und es sieht auc besser aus, allerdings für mich noch zu pixelig.
Ich werde wohl noch mit den Variablen rumspielen müssen. Mein jetztiger Code:
Delphi-Quellcode:
Könnte man sonst noch etwas optimieren?procedure TMyPanel.SetRegion(AControl : TWinControl; X1, Y1, X2, Y2, ARadius : Integer); var rgn: HRGN; begin try rgn := CreateRoundRectRgn(X1, Y1, AControl.Width - X2, AControl.Height - Y2, ARadius,ARadius); SetWindowRgn(AControl.Handle, rgn, True); finally DeleteObject(rgn); end; end; procedure TMyPanel.Paint; begin ... case FPanelStyle of ... psRoundRect: begin Canvas.RoundRect(Canvas.Pen.Width div 2, Canvas.Pen.Width div 2, Width - Canvas.Pen.Width div 3, Height - Canvas.Pen.Width div 3, FPanelRounding, FPanelRounding); SetRegion(Self, 0, 0, -1, -1, FPanelRounding); end; ... end; Wenn ich jetzt noch Antialiasing haben möchte, muss ich doch auf Alternativen wie z.B. Grafic32 oder GDI+ umsteigen oder? |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Wenn Du nicht umständlich selbst rechnen willst, ist das zu empfehlen. Für GDI+ gibt es aber von Mitov eine schöne Kapselung namens
![]() |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
hallo,
also den Thread-Titel finde ich nun wieder etwas missverständlich Zitat:
|
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Danke DeddyH, ich werde es mir mal anschauen.
@frankyboy: Wie soll ich den Thread nennen? Grüße Waaaghboss |
AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
Zitat:
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz