AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls BackgroundColor von eigener Klasse weitergeben (ParentColor)
Thema durchsuchen
Ansicht
Themen-Optionen

BackgroundColor von eigener Klasse weitergeben (ParentColor)

Ein Thema von Waaaghboss · begonnen am 7. Sep 2015 · letzter Beitrag vom 9. Sep 2015
Antwort Antwort
Benutzerbild von Waaaghboss
Waaaghboss

Registriert seit: 28. Okt 2003
Ort: Schwerin
15 Beiträge
 
Delphi 11 Alexandria
 
#1

BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 7. Sep 2015, 22:05
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.
Miniaturansicht angehängter Grafiken
tmypanel.png  
Zu denken, was wir hätten tun können, ist eine Tätigkeit, die uns zu denken geben sollte...
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 08:25
Vielleicht kannst du ja mal den Code von deinem Panel zeigen, damit man sehen kann, wie du das umgesetzt hast.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Waaaghboss
Waaaghboss

Registriert seit: 28. Okt 2003
Ort: Schwerin
15 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 08:57
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;
Zu denken, was wir hätten tun können, ist eine Tätigkeit, die uns zu denken geben sollte...

Geändert von Waaaghboss ( 8. Sep 2015 um 10:28 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 12:38
Versuch mal deinem Panel auch tatsächlich die entsprechende Form zu geben.

Beispiel für ein Rechteck mit abgerundeten Ecken:

Delphi-Quellcode:
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;
Für andere Formen stehen noch andere Rgn zur Verfügung:

CreateEllipticRgn
CreatePolyPolygonRgn
CreatePolygonRgn
CreateRectRgn
CreateRoundRectRgn
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 15:22
Und nicht vergessen, die Region nach Gebrauch mit DeleteObject wieder zu entsorgen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Waaaghboss
Waaaghboss

Registriert seit: 28. Okt 2003
Ort: Schwerin
15 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 16:21
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:


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;
Könnte man sonst noch etwas optimieren?

Wenn ich jetzt noch Antialiasing haben möchte, muss ich doch auf Alternativen wie z.B. Grafic32 oder GDI+ umsteigen oder?
Miniaturansicht angehängter Grafiken
tmypanel.png  
Zu denken, was wir hätten tun können, ist eine Tätigkeit, die uns zu denken geben sollte...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 16:34
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 IGDI+.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#8

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 8. Sep 2015, 16:37
hallo,

also den Thread-Titel finde ich nun wieder etwas missverständlich
Zitat:
BackgroundColor von eigener Klasse weitergeben (ParentColor)
mfg
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von Waaaghboss
Waaaghboss

Registriert seit: 28. Okt 2003
Ort: Schwerin
15 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 9. Sep 2015, 14:12
Danke DeddyH, ich werde es mir mal anschauen.

@frankyboy: Wie soll ich den Thread nennen?

Grüße Waaaghboss
Zu denken, was wir hätten tun können, ist eine Tätigkeit, die uns zu denken geben sollte...
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#10

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)

  Alt 9. Sep 2015, 14:22
Und nicht vergessen, die Region nach Gebrauch mit DeleteObject wieder zu entsorgen
Leider falsch!!!!!!!

https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

Zitat:
After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz