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/)
-   -   Abgeleitete TCustomCombobox Button ändern (https://www.delphipraxis.net/200020-abgeleitete-tcustomcombobox-button-aendern.html)

Getox 12. Mär 2019 07:53

Abgeleitete TCustomCombobox Button ändern
 
Hallo mal wieder,

ich hänge mal wieder an einer Sache.

Ich habe eine eigene Combobox von TCustomCombobox abgeleitet. Diese hatte erst diesen 3D-artigen Rahmen, auch wenn ich ctl3d ausschalte. Dafür ist der Dropdown-Button so wie ich das möchte... einfach nur ein Pfeil auf weißem Hintergrund.

Jetzt wollte ich aber einen Rahmen um die Combobox haben, der nur eine einfache graue Line ist. Dafür habe ich jetzt im Constructor Bevelkind auf bkFlat gestellt und BevelInner auf bvNone. BevelOuter habe ich auf bvRaised gelassen, da sonst der Rahmen ganz verschwindet. Nun sieht der Rahmen so aus wie ich das will. ABER mit dem umstellen auf bevelKind = bkFlat hat sich nicht nur der Rahmen in die gewünschte Linie verändert. Der Dropdown-Button ist nun auch noch grau hinterlegt und hat einen eigenen Rahmen. Das möchte ich aber nicht. Ich möchte das da einfach nur das Dreieckzeichen rechts in der Combobox auf weißem Grund ohne irgendeine Abtrennung ist... so wie es halt war, bevor ich BevelKind umgestellt habe.

Wie kann ich das bewerkstelligen?

Vielen Dank :)

peterbelow 12. Mär 2019 11:32

AW: Abgeleitete TCustomCombobox Button ändern
 
Zitat:

Zitat von Getox (Beitrag 1427523)
Hallo mal wieder,

ich hänge mal wieder an einer Sache.

Ich habe eine eigene Combobox von TCustomCombobox abgeleitet. Diese hatte erst diesen 3D-artigen Rahmen, auch wenn ich ctl3d ausschalte. Dafür ist der Dropdown-Button so wie ich das möchte... einfach nur ein Pfeil auf weißem Hintergrund.

Jetzt wollte ich aber einen Rahmen um die Combobox haben, der nur eine einfache graue Line ist. Dafür habe ich jetzt im Constructor Bevelkind auf bkFlat gestellt und BevelInner auf bvNone. BevelOuter habe ich auf bvRaised gelassen, da sonst der Rahmen ganz verschwindet. Nun sieht der Rahmen so aus wie ich das will. ABER mit dem umstellen auf bevelKind = bkFlat hat sich nicht nur der Rahmen in die gewünschte Linie verändert. Der Dropdown-Button ist nun auch noch grau hinterlegt und hat einen eigenen Rahmen. Das möchte ich aber nicht. Ich möchte das da einfach nur das Dreieckzeichen rechts in der Combobox auf weißem Grund ohne irgendeine Abtrennung ist... so wie es halt war, bevor ich BevelKind umgestellt habe.

Wie kann ich das bewerkstelligen?

Vielen Dank :)

XE3 ist zu lange her :? . Gab's da schon Support für Aero und Styles? In Rio hat eine Standard-Combobox mit BevelKind bkNone jedenfalls genau das Aussehen, das Du wohl haben willst (mit dem Windows Theme enabled), eine einfache Linie als Border und den dropdown button ohne eigenen Rahmen.

Getox 12. Mär 2019 12:39

AW: Abgeleitete TCustomCombobox Button ändern
 
Nach etwas längerer Recherche bin ich jetzt auf eine funktionierende Lösung gekommen. Da ich noch nie wirklich mit Canvas gearbeitet habe, war es schon etwas rumgefummel... aber meine Erfahrungen sind wieder angewachsen :D

Ich habe einfach die WMPaint Methode überschrieben. Erst habe ich es mit Rectangle(ClientRect) versucht, aber da wurde auch der Dropdown-Pfeil überbügelt. Mit folgender Lösung ist es genau wie ich will:

Code:
procedure TAutoComboBox.WMPaint(var Message: TWMPaint);
var
  CC: TControlCanvas;
begin
  inherited;
  CC := TControlCanvas.Create;
  try
    CC.Control := Self;
    CC.Pen.Color := clGray;
    CC.Pen.Width := 1;
    CC.MoveTo(ClientRect.Left, ClientRect.Top);
    CC.LineTo(ClientRect.Right - 1, ClientRect.Top);
    CC.LineTo(ClientRect.Right-1, ClientRect.Bottom -1);
    CC.LineTo(ClientRect.Left, ClientRect.Bottom-1);
    CC.LineTo(ClientRect.Left, ClientRect.Top);
  finally
    CC.Free;
  end;
end;
Nach noch ein wenig Recherche bin ich nun auf folgende Lösung gekommen:
Code:
procedure TAutoComboBox.WMPaint(var Message: TWMPaint);
var
  CC: TControlCanvas;
begin
  inherited;
  CC := TControlCanvas.Create;
  try
    CC.Control := Self;
    CC.Brush.Color := clGray;
    CC.FrameRect(ClientRect);
  finally
    CC.Free;
  end;
end;


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