Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   BackgroundColor von eigener Klasse weitergeben (ParentColor) (https://www.delphipraxis.net/186503-backgroundcolor-von-eigener-klasse-weitergeben-parentcolor.html)

Waaaghboss 7. Sep 2015 22:05

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.

Jumpy 8. Sep 2015 08:25

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.

Waaaghboss 8. Sep 2015 08:57

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;

HolgerX 8. Sep 2015 12:38

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:
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

DeddyH 8. Sep 2015 15:22

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
 
Und nicht vergessen, die Region nach Gebrauch mit DeleteObject wieder zu entsorgen ;)

Waaaghboss 8. Sep 2015 16:21

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:


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?

DeddyH 8. Sep 2015 16:34

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 IGDI+.

frankyboy1974 8. Sep 2015 16:37

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
 
hallo,

also den Thread-Titel finde ich nun wieder etwas missverständlich
Zitat:

BackgroundColor von eigener Klasse weitergeben (ParentColor)
mfg

Waaaghboss 9. Sep 2015 14:12

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

HolgerX 9. Sep 2015 14:22

AW: BackgroundColor von eigener Klasse weitergeben (ParentColor)
 
Zitat:

Zitat von DeddyH (Beitrag 1315148)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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