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/)
-   -   Buttons ohne Rand möglich? (https://www.delphipraxis.net/191662-buttons-ohne-rand-moeglich.html)

Der schöne Günther 7. Feb 2017 18:18


Buttons ohne Rand möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich auf einem VCL-Formular einen
Delphi-Quellcode:
TButton
mit
Delphi-Quellcode:
Top = 0
platziere hat er einen unsichtbaren Rahmen von wohl einem Pixel (siehe Bild): Links ein Button mit
Delphi-Quellcode:
Top = 0
, rechts ein Button in einem Lila
Delphi-Quellcode:
TPanel
das man nicht sehen sollte: Der Button hat
Delphi-Quellcode:
Align = alClient
.

Mit anderen Komponenten wie einem Edit oder einer Combobox besteht das Problem nicht. Was kann man tun?

Auf Windows 10 ebenso wie in einer Windows 7-VM.

EWeiss 7. Feb 2017 18:21

AW: Buttons ohne Rand möglich?
 
SetWindowRgn?

gruss

Der schöne Günther 7. Feb 2017 18:35

AW: Buttons ohne Rand möglich?
 
So richtig?

Delphi-Quellcode:
procedure TForm10.Button2Click(Sender: TObject);
var
   newRegion: HRGN;
   buttonRect: TRect;
begin
   //
   buttonRect := Button1.ClientRect; // Oder BoundsRect?
   buttonRect.Inflate(+1, +1); // Bei -1 kommt raus was man erwartet
   newRegion := CreateRectRgn(
      buttonRect.Left,
      buttonRect.Top,
      buttonRect.Right,
      buttonRect.Bottom
   );
   {TODO -oGünther -cGeneral : HRGN später löschen?}

   Win32Check( SetWindowRgn(Button1.Handle, newRegion, True) <> 0 );
end;
Es hat leider keine Auswirkungen. Wenn ich die Region kleiner mache (oder z.B. zu einem Kreis) kommt raus was man erwarten würde. Mache ich es hingegen größer hat das keine sichtbaren Auswirkungen :(

EWeiss 7. Feb 2017 18:57

AW: Buttons ohne Rand möglich?
 
Also ich habe keinen Rahmen mehr unter Verwendung von Manifest und SetWindowRgn.
Beides sind Button.

Ich vermute mal das bei dir die Flags für die Button verändert werden müssen.
WS_CLIPSIBLINGS und (WS_CLIPCHILDREN nur Hauptanwendung TForm als Beispiel) andernfalls bleiben die Rahmen bestehen.
Wobei zweites nicht zwingend nötig.

EDIT:
Bin mir jetzt nicht 100% sicher aber buttonRect scheint nicht das richtige zu sein um die Höhe\Weite des Control inklusive der Border zu erhalten.
Versuch es mal mit GetSystemMetrics

gruss

himitsu 7. Feb 2017 23:43

AW: Buttons ohne Rand möglich?
 
Und da wir hier über was Aktuelleres (Seattle) reden, könnte man auch auf die Idee mit 'nem VCL-Style eines randlosen Buttons kommen. :stupid:

EWeiss 8. Feb 2017 00:48

AW: Buttons ohne Rand möglich?
 
Zitat:

Zitat von himitsu (Beitrag 1361073)
Und da wir hier über was Aktuelleres (Seattle) reden, könnte man auch auf die Idee mit 'nem VCL-Style eines randlosen Buttons kommen. :stupid:

yep.. wäre eine alternative.
Wobei man aber berücksichtigen muss das die Styles auch entsprechende Ressourcen benötigen.. Die Styles halt.
Ob sich das lohnt für einen Button? Wenn man sie ansonsten nicht benötigt.

gruss

Sherlock 8. Feb 2017 06:54

AW: Buttons ohne Rand möglich?
 
Meines Wissens ist ein randloser Button einfach ein
Delphi-Quellcode:
TSpeedButton
mit
Delphi-Quellcode:
Flat := True
.

Sherlock

Der schöne Günther 8. Feb 2017 09:25

AW: Buttons ohne Rand möglich?
 
Falls ich mich schlecht ausgedrückt habe: Ich meine keine gemalten Pixel-Ränder, sondern optische "Abstände": Auf dem Bild oben hat der Button
Delphi-Quellcode:
Top = 0
aber man sieht trotzdem noch das knallgelbe Formular zwischen der Titelleiste und dem Button. Bei Comboboxen, Edits usw. ist das nicht so.

Der schöne Günther 8. Feb 2017 20:38

AW: Buttons ohne Rand möglich?
 
Ich merke grade: Eine WinForms-Anwendung macht das genauso. Ich dachte ich müsste die VCL beschuldigen, aber das scheint dann wirklich so in den Windows Common Controls drin zu sein, oder?

Schrecklich :?

EWeiss 8. Feb 2017 21:24

AW: Buttons ohne Rand möglich?
 
Ich behaupte einfach mal das der Button Rahmen 2 Pixel und der Rahmen bsp. für ein Memo 1 Pixel beträgt.
Das kannst du aber über GetSystemMetrics heraus finden.

Auf dem Anhang sehr gut zu sehen der Rahmen der um den Button gezogen wird.
Im vergleich dazu das Memo..
Zum Abschluss noch ohne Visuelle Style.

Nach dem vergleich must du davon ausgehen das dieses Problem durch die Style verursacht wird.
Das erste Pixel wird durch die Style Transparent gezeichnet.

Das meine Behauptung stimmt kannst du am letzten Bild sehen da habe ich den WS_BORDER Style zum Button addiert wie du siehst sitzt der Button
exakt auf 0 was auch richtig ist.

Ich denke ohne Ownerdraw wirst du das nicht ändern können.
Oder aber zu jedem Button den Style WS_BORDER addieren was meiner Meinung nach bescheiden aussieht.
Das letzte was mir noch einfällt wäre die Button aus den Themes auszuschließen..

Delphi-Quellcode:
SetWindowTheme(ButtonHandle, '' , '');

Ich muss das zum Beispiel bei meinen ToolTips machen damit ich diese andersfarbig auslegen kann.

gruss

jaenicke 9. Feb 2017 06:59

AW: Buttons ohne Rand möglich?
 
Das ist so im Standard-Theme von Windows drin, ja. Da die UI Guidelines für Windows aber ohnehin einen gewissen Abstand zu anderen Elementen vorschlagen, hatte ich damit noch nie ein Problem. Die Abstände aus den Guidelines schlägt die IDE ja auch meistens vor.

Und auch rein ästhetisch finde ich Oberflächen, bei denen Buttons an Ränder gequetscht werden, problematisch. :?

Der schöne Günther 9. Feb 2017 08:17

AW: Buttons ohne Rand möglich?
 
Zitat:

Zitat von jaenicke (Beitrag 1361125)
hatte ich damit noch nie ein Problem. Die Abstände aus den Guidelines schlägt die IDE ja auch meistens vor.

Und auch rein ästhetisch finde ich Oberflächen, bei denen Buttons an Ränder gequetscht werden, problematisch. :?

Mein Anwendungsfall war ganz einfach: GridPanel mit linke Spalte eine Combobox, in der rechten Spalte ein Button mit einem Plus-Zeichen. Und man sieht eigentlich direkt dass Button und Combobox nicht bündig verlaufen. Sieht nicht schön aus.

EWeiss 9. Feb 2017 13:31

AW: Buttons ohne Rand möglich?
 
Zitat:

Da die UI Guidelines für Windows aber ohnehin einen gewissen Abstand zu anderen Elementen vorschlagen, hatte ich damit noch nie ein Problem
Nur das es hier keinen Abstand gibt der Button sitzt da wo er soll auf 0.
Noch deutlicher wie ich das über Bilder dokumentiert habe geht es wohl nicht.

Zitat:

Und man sieht eigentlich direkt dass Button und Combobox nicht bündig verlaufen.
Die sind bündig es werden lediglich mit Theme die 2 Pixel des Rahmen nicht gezeichnet.
Es gibt KEINEN Border bei den Themed Button deshalb ist der Bereich Transparent bzw. wird gar nicht erst gezeichnet.

gruss

jaenicke 9. Feb 2017 13:50

AW: Buttons ohne Rand möglich?
 
Zitat:

Zitat von EWeiss (Beitrag 1361174)
Nur das es hier keinen Abstand gibt der Button sitzt da wo er soll auf 0.
Noch deutlicher wie ich das über Bilder dokumentiert habe geht es wohl nicht.

Das habe ich in den Beispielen durchaus gesehen, aber die entsprechen auch nicht den UI Guidelines. Deshalb habe ich das auch nur als Beispiel gesehen.

Das genannte Gridpanel oder generell die Ausrichtung von Komponenten an einer Linie funktioniert aber nicht immer optimal, das stimmt. Das beschränkt sich auch nicht auf Buttons. Da bleibt manchmal nur zirkeln und/oder die Größen nicht gleich setzen...

EWeiss 9. Feb 2017 13:57

AW: Buttons ohne Rand möglich?
 
Zitat:

Das habe ich in den Beispielen durchaus gesehen, aber die entsprechen auch nicht den UI Guidelines. Deshalb habe ich das auch nur als Beispiel gesehen.
Auf Deutsch.
Wenn du damit meinst das es nicht den Richtlinien des Aufbaus einer Grafische Benutzeroberfläche entspricht.
Ja dann muss ich dir recht geben.

Ansonsten wie gesagt der Button ist auf 0 und wird halt nur kleiner gezeichnet.
Und da kann man ohne selbst Zeichnen (Ownerdraw) nichts dran ändern.. Das ist Fakt.
Bin raus aus dem Thread da alles gesagt wurde.

gruss


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