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 Komponentenentwicklung (runder Button) (https://www.delphipraxis.net/107383-komponentenentwicklung-runder-button.html)

DeddyH 26. Jan 2008 21:12


Komponentenentwicklung (runder Button)
 
Hallöle,

angeregt durch Hansas kürzlichen Thread bzgl. eines runden Buttons habe ich mir Gedanken gemacht, wie man so etwas möglichst einfach, aber dennoch optisch ansprechend umsetzen könnte. Hier fiel mir GDI+ ein (eine API dazu gibt es unter http://www.progdigy.com/modules.php?name=gdiplus, ich bin ja faul :mrgreen: ). Nun ist mein Gedankengang folgender:
- beim Erzeugen der Kompo werden 2 Bitmaps angelegt (Up und Down)
- wenn sich Größe oder Farben ändern, werden diese mit Hilfe von GDI+ neu gezeichnet (Farbverlauf und Antialiasing)
- OnPaint des Buttons wird je nach Zustand der linken Maustaste die eine oder andere Bitmap per BitBt als Hintergrund gezeichnet
- um den klickbaren Bereich einzuschränken, wird eine Region verwendet
- ist der Button "gedrückt", wird die Caption leicht rechts unten versetzt gezeichnet, ansonsten zentriert

Denke ich hier korrekt oder könnte man das noch optimieren? Mir ist klar, dass GDI+ auf dem Zielrechner vorhanden sein muss, aber die entsprechende DLL ist ja frei verfügbar. Ich bin mir auch nicht sicher, ob ich das jemals produktiv einsetzen werde, ich sehe das eher als Machbarkeitsstudie.

Danke schon jetzt für alle Vorschläge und Anregungen.

Hansa 27. Jan 2008 02:04

Re: Komponentenentwicklung (runder Button)
 
Du denkst also mit ? :mrgreen: Stand der Dinge ist folgender : soll der Bereich tatsächlich exakt anklickbar sein, dann kommt man um Regions kaum rum, trotz Alzaimar. :-D Zeichnet man etwas rundes, dann gibt es bei Verwendung von TImage etc. auch Ecken. Das wäre dann eben nicht 1:1. Solcherlei Effekte unsichtbar zu machen, bedeutet : selber mit RoundRect usw., alles zu zeichnen. Das widerum hat zur Folge : die Pixel-Struktur. Die schaffe ich nun aus der Welt, indem doch Grafiken verwendet werden. Die sind dann schön rund (ohne Pixel) und ich muss sie selber anfertigen. Dann noch pro Button zwei für jeweils Down oder Up. Das ist viel Arbeit für einen optischen Effekt. Ist das auch soweit fertig, dann braucht man irgendwann große Schriften und die Buttons sind schön rund, aber die Schriften sind pixelig. Und jetzt ? Ausweg wäre, Komponente zuzukaufen. Die sind aber meistens überdimensioniert, zumindest für diesen Zweck. Oft auch schlecht kommentiert. Bei 3-Zeilen Prozedur steht da beispielsweise hinter dem end; dass das zu dem begin kurz vorher gehört. 8) Von der Programm-Logik ist nicht mal was kommentiert.

bitsetter 27. Jan 2008 09:40

Re: Komponentenentwicklung (runder Button)
 
Zitat:

Zitat von Hansa
soll der Bereich tatsächlich exakt anklickbar sein, dann kommt man um Regions kaum rum, trotz Alzaimar. :-D Zeichnet man etwas rundes, dann gibt es bei Verwendung von TImage etc. auch Ecken. Das wäre dann eben nicht 1:1.

Man könnte noch ein TBitmap in ein Image laden und dann bmp.TransparentColor abfragen. Also wenn der Pixel unter dem Kursor <> TransparentColor dann wird ein onClick Ereignis ausgelöst. Dazu muss man allerdings die Bildvorlage vorher dementsprechend präparieren.

Die Buttons von Hansa sehen doch ziemlich 08/15 mäßig aus. :stupid:

alzaimar 27. Jan 2008 11:01

Re: Komponentenentwicklung (runder Button)
 
Zitat:

Zitat von Hansa
Du denkst also mit ? :mrgreen: Stand der Dinge ist folgender : soll der Bereich tatsächlich exakt anklickbar sein, dann kommt man um Regions kaum rum, trotz Alzaimar. :-D .

:mrgreen: Doch. Man kommt um Regions herum, aber das willst Du ja nicht hören. Das geht mit einer simplen TImage-Komponente und mindestens drei Bitmaps, sagen wir: Vier, damit man einen 'disabled' Buttoni auch darstellen kann.

1. Bitmap: Standard (Buttoni oben)
2. Bitmap: Gedrückt
3. Bitmap: Disabled
4. Bitmap: Maske (Schwarz = klickbar, weiss=außerhalb des Buttoni)

Das ist dann eine allgemeine Button-Komponente, die man mit geeigneten Bitmaps zu einem 'runden' Buttoni umformen kann. Das kann man natürlich noch erweitern, um 'MouseOver' Bitmaps, oder Animationen beim Drücken etc.

DeddyH's Ansatz, das zur Laufzeit zu rendern, ist natürlich insofern viel besser, weil man die Farben (Hinter- und Vordergrund) zur Laufzeit ändern kann. Hinsichtlich der Hintergrundfarbe ginge das natürlich mit einem Alpha-Kanal, den man als 5.Bitmap noch speichert.

Etwas zur Laufzeit zu rendern ist einfach, aber so, das es richtig gut aussieht, ist imho nicht trivial.

DeddyH 27. Jan 2008 11:35

Re: Komponentenentwicklung (runder Button)
 
Zitat:

Zitat von Hansa
, dann braucht man irgendwann große Schriften und die Buttons sind schön rund, aber die Schriften sind pixelig.

Die kann man aber auch per GDI+ zeichnen, dann ist nix pixelig ;)


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