Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi runde Schaltflächen (https://www.delphipraxis.net/48729-runde-schaltflaechen.html)

Marvel 29. Jun 2005 16:55


runde Schaltflächen
 
Hi Leute.
folgendes Problem:
1. Ich will in meinem Prog nich einfach Buttons machen, die sind zu langweilig. Statdessen will ich Images nehmen, die halt als Buttons dienen.
2. Ich will keine rechteckigen Images nehmen, die sind mir zu langweilig ;-), sondern runde und abgerundete Images.

Nun kann man das natürlich einfach transparent werden lassen, aber dann wird das OnClick-Ereigniss trotzdem ausgelöst, wenn man auf transparente Stellen klickt. Das is sehr störend, so wie ich das machen will.
Jetzt hab ich schon ne Weile rumgesucht und mit den Regions experimentiert. Bei Buttons würde das auch ein A funktionieren, aber bei Images is nix... Versteh ich zwar nicht ganz, aber ihr habt da sicher ne Ahnung...

Also meine Frage: wie kann ich Images so beschneiden, dass das OnClick-Ereigniss (und andere) nur auf einer bestimmten Fläche ausgelöst werden?

Danke im Voraus. Ich hab wie immer großes Vertrauen in euch....

jfheins 29. Jun 2005 17:00

Re: runde Schaltflächen
 
Du könntest dir einen Image-Button ableiten, der das OnClick nur auslöst, wenn an dieser Stelle z.B. min. 50% Deckfähigkeit ist ;)

Jarmen_Kell 29. Jun 2005 17:10

Re: runde Schaltflächen
 
Oder dich davon einfach nicht stören lassen und am Anfang der OnClick-Prozedur abfragen, an welcher Stelle das passiert ist. (Da wäre dann natürlich MouseDown, -Up praktischer).
Wenn die Position innerhalb des Kreises, runden Rechtecks, was auch immer liegt, dann wird das Ereignis ausgelöst und wenn nicht ... tja dann wohl eher nicht.

r2c2 29. Jun 2005 17:19

Re: runde Schaltflächen
 
Oder du leitest von TButton - oder ne besser direkt von TWinControl ab. Den Button kannst du dann rund(oder wie auch immer) Zeichnen. Das hätte dann auch den Vorteil, dass man auch sieht, dass der Button gerade gedrückt wird(sofern du das natürlich so proggst). Du musst den Button dann nur Pseudo-3D Zeichnen. Is nicht so schwer, wie sich das jetzt vielleicht anhört. Sollte also machbar sein...

mfg

Christian

Marvel 29. Jun 2005 17:47

Re: runde Schaltflächen
 
Also erstma danke...
zu jfheins: was meinst du mit 50% Deckfähigkeit?

zu Jarmen_Kell: und wie kann ich das halbwegs praktisch prüfen? Muss ich ja ne Fläche festlegen, in der das Ereigniss ausgelöst wird. Was nehme ich da? wie prüfe ich, ob der Punkt drin is?

zu r2c2: mit Komponentenentwicklung kenn ich mich jetzt nich so aus... also das heißt.. ich hab keine Ahnung, wie ich das machen müsste.

Jarmen_Kell 29. Jun 2005 18:04

Re: runde Schaltflächen
 
Kommt auf die Form an.
Wenn es z.B. ein Kreis ist, ist es noch relativ simpel.
Den Mittelpunk hast du ja wohl (Zur Not Bei MouseD, - U: Object.Widht/2 und Object.Height/2)
Dann rechnest du den Abstand zwischen Klick-Punkt und Mittelpunkt aus und guckst, ob das im Kreisradius liegt.
Je komplizierter die Form ist, desto schwerer ist es natürlich, aber mit der guten Mathematik ist doch alles möglich :)

Bernhard Geyer 29. Jun 2005 18:27

Re: runde Schaltflächen
 
Darf auch ein paar € kosten? Dann probier mal das ElPack mit aktivierter eigener Theming-Engine aus. Du kannst die von XP definierten Themes-DLL auch unter Win98-2003 verwenden unabhängig von aktivierten XP-Theme. Und dort gibt es auch gerundete Buttons.

Marvel 29. Jun 2005 18:40

Re: runde Schaltflächen
 
kann man da nich irgendwie ne Fläche machen und dann irgendwie "if Point(X,Y) in Fläche" abfragen? Enttäuscht mich...

naja... nee, soll nix kosten.

Zettuu 29. Jun 2005 19:08

Re: runde Schaltflächen
 
Wenn Du mit ner Transparenzfarbe arbeitest, dann check doch einfach ab, ob der Click auf der Transparenzfarbe ausgeführt wurde.

Marvel 29. Jun 2005 19:49

Re: runde Schaltflächen
 
Hey.... das is clever

DGL-luke 29. Jun 2005 20:27

Re: runde Schaltflächen
 
Bei Google suchenRBControls

sind ganz nett, ham nen style manager dabei, und sind kostenlos. weiss aber leider die inet-adr... clickediclick.... www.delphipages.de :-D

Marvel 29. Jun 2005 21:53

Re: runde Schaltflächen
 
äh... die beiden Seiten funzen nich so recht.... trotzdem danke

noch ne Frage zu der Sache, mit dem vergleichen der Pixelfarbe mit der Transparent-Farbe. da wird folgendes nie true:

Delphi-Quellcode:
 if Image1.Canvas.Pixels[x,y]=Image1.Picture.Bitmap.TransparentColor then ....
dagegen funktioniert das:

Delphi-Quellcode:
 if Image1.Canvas.Pixels[x,y]=clWhite then ....
sogar, wenn man die TransparentColor vorher auf clWhite setzt, passiert nix bei der ersten, aber bei der zweiten.
is das nich komisch? meine Meinung!

Wat denkt ihr darüber?

mael 29. Jun 2005 22:36

Re: runde Schaltflächen
 
Du kannst mit Regions arbeiten und dann die Win-API PtInRegion verwenden.
Regions lassen mit Hilfe der JCL sehr leicht aus Bitmaps erzeugen.
Schau mal in JclGraphics.pas, dort gibt es eine sehr nützliche Routine namens CreateRegionFromBitmap.

Somit solltest Du alles haben was Du brauchst, hoffe ich zumindest ;-)

r2c2 30. Jun 2005 08:45

Re: runde Schaltflächen
 
Zitat:

Zitat von Marvel
zu r2c2: mit Komponentenentwicklung kenn ich mich jetzt nich so aus... also das heißt.. ich hab keine Ahnung, wie ich das machen müsste.

Schau dir mal n paar Tutorials dazu an; sollte nicht ganz so schwer sein. Runde Buttons sind nicht so schwer zu zeichnen. Ansonsten kann man das auch mit Bitmaps machen und - wie schon gesagt wurde mit MouseUp/Down arbeiten.

mfg

Christian

Tonic1024 30. Jun 2005 09:07

Re: runde Schaltflächen
 
Hi...

Warum nicht so:

Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Image1.Picture.Bitmap.Canvas.Pixels[X,Y] <> Image1.Picture.Bitmap.Canvas.Pixels[0,0] then
    Showmessage('Hit me');
end;
Wenn du tranzparenz einschaltest geht das - soweit ich weiss - immer vom ersten Pixel aus. Habs mal eben getestet und geht ganz gut... Hab ein Donut-Button benutzt und konnte auch wirklich nur auf den Ring klicken.

regards

Toni

Zettuu 30. Jun 2005 12:06

Re: runde Schaltflächen
 
Du solltest die Transparenzfarbe immer im Original-Bitmap abfragen, da sie ja leider direkt auf dem Button-Canvas nicht mehr existiert (spricht transparent ist)

Tonic1024 30. Jun 2005 12:24

Re: runde Schaltflächen
 
Doch, geht. Probiers doch mal aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz