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/)
-   -   Delphi TPageControl ändern der BevelKind bei TabPosition tbLeft (https://www.delphipraxis.net/199693-tpagecontrol-aendern-der-bevelkind-bei-tabposition-tbleft.html)

completestranger 12. Feb 2019 17:26

TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

man nehme eine TPageControl, gibt dieser eine NewPage und ändert die TabPosition auf tbLeft.

Dann merkt man schnell, dass die Anzeigefläche rechts neben den Tabs ein BevelKind von bkRaised aufweist. Bei TabPosition tbTop ist das nicht der Fall.

Weißt jemand wie man diese entfernen kann?

Ich bin davon überzeugt, dass die Ursache in VCL zu finden sein muss, da bei einer SysTabControl32 (WC_TABCONTROL) mit TCS_VERTICAL dies nicht der Fall ist.

"Beweise" sind im Anhang zu finden.

Vielen Dank.

Uwe Raabe 12. Feb 2019 18:56

AW: TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Zitat:

Zitat von completestranger (Beitrag 1425373)
Ich bin davon überzeugt, dass die Ursache in VCL zu finden sein muss, da bei einer SysTabControl32 (WC_TABCONTROL) mit TCS_VERTICAL dies nicht der Fall ist.

Die VCL zeichnet bei einem TPageControl eigentlich nichts selbst. Zeig doch mal den Code für das SysTabControl32. Dann könnte man das mit dem des TPageControl vergleichen.

completestranger 12. Feb 2019 20:40

AW: TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Da wurde ich falsch verstanden, glaube ich. Ich bin der Meinung, dass eben TPageControl eine normale SysTabControl32 ist. Und bei einer normalen SysTabControl32 das eben nicht passiert.
Sondern VCL irgendwas noch hinzufügt.

Das TPageControl ist ein SysTabControl32.
Code:
TPageControl = class(TCustomTabControl)

...

procedure TCustomTabControl.CreateParams(var Params: TCreateParams);
...
begin
...
CreateSubClass(Params, WC_TABCONTROL);
...
Und WC_TABCONTROL ist in Winapi.CommCtrl.pas als
Code:
const
  {$EXTERNALSYM WC_TABCONTROL}
  WC_TABCONTROL = 'SysTabControl32';
definiert.

Ich dachte immer:
Die Controls die von TWinControl abstammen sind alles native Windows Controls.
In Vcl.ComCtrls sind alles native Common Controls aus ComCtl32.dll.
TPageControl = SysTabControl32
TToolBar = ToolbarWindow32
TMonthCalendar = SysMonthCal32
...

Uwe Raabe 12. Feb 2019 22:12

AW: TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Zitat:

Zitat von completestranger (Beitrag 1425388)
Da wurde ich falsch verstanden, glaube ich.

Das glaube ich nicht.

Zitat:

Zitat von completestranger (Beitrag 1425388)
Ich bin der Meinung, dass eben TPageControl eine normale SysTabControl32 ist.

Das ist auch so.

Zitat:

Zitat von completestranger (Beitrag 1425388)
Und bei einer normalen SysTabControl32 das eben nicht passiert.

Was ist denn ein "normales" SysTabControl32?

Zitat:

Zitat von completestranger (Beitrag 1425388)
Sondern VCL irgendwas noch hinzufügt.

Oder weglässt.

Es geht mir darum, die Sourcen des funktionierenden Beispiels mit denen der VCL zu vergleichen. Deswegen weine Frage danach.

peterbelow 13. Feb 2019 12:25

AW: TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Man beachte, dass die Darstellung der common controls von Windows Themes und den Desktop-Settings (Aero oder classic) beeinflußt wird und TPagecontrol (auch auf der API Ebene) Tabs links und rechts nicht so gut unterstützt wie oben und unten. Wenn man das Standard-Windows Theme verwendet (default) wird ein TTabcontrol oder TPagecontrol etwas anders gezeichnet wenn die Tabs vertikal sind. Das fällt besonders bei TTabcontrol auf, da sich auch die Hintergrundfarbe der client area ändert. Verwendet man einen der custom styles passiert das nicht.

Da TCustomTabcontrol on TWinControl abstammt erbt es auch den ganzen zusätzlichen Code zur Unterstützung der Style-Engine sowie Desktop composition, und es nicht gerade einfach, da zu erkennen was nun von Windows gezeichnet wird und was von der VCL...

completestranger 14. Feb 2019 16:19

AW: TPageControl ändern der BevelKind bei TabPosition tbLeft
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Uwe Raabe (Beitrag 1425391)
Oder weglässt.

Ja, ich habe den "Trick" gefunden der hier verwendet wird.

Ich zitiere aus https://docs.microsoft.com/en-us/win...control-styles:

Zitat:

The following styles can be modified after the control is created.

...
TCS_VERTICAL
Der Trick hierbei ist anscheinend, dass bei CreateWindowEx() der BorderStyle, etc. bereits festgelegt werden. Wenn man nun zur Laufzeit via

Code:
var
  TempStyle: NativeInt;
begin
  TempStyle := GetWindowLong(PCContent.Handle, GWL_STYLE);
  TempStyle := TempStyle or TCS_VERTICAL;
  SetWindowLong(PCContent.Handle, GWL_STYLE, TempStyle);
end;
den Style auf TCS_VERTICAL ändert, dann behält dieser den ursprünglichen BorderStyle bei und es sieht schön (für den Geschmack des Projektleiters) aus.

Und ja, wenn es komplett neu gezeichnet bzw. neu erstellt wird, z. B. durch ReCreate, dann sieht es hier auch wieder bescheiden aus.

Ich habe einen Screenshot für TabPosition := tpLeft zur Design- und Laufzeit angehängt.


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