![]() |
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.... |
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 ;)
|
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. |
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 |
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. |
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 :) |
Re: runde Schaltflächen
Darf auch ein paar € kosten? Dann probier mal das
![]() |
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. |
Re: runde Schaltflächen
Wenn Du mit ner Transparenzfarbe arbeitest, dann check doch einfach ab, ob der Click auf der Transparenzfarbe ausgeführt wurde.
|
Re: runde Schaltflächen
Hey.... das is clever
|
Re: runde Schaltflächen
![]() sind ganz nett, ham nen style manager dabei, und sind kostenlos. weiss aber leider die inet-adr... clickediclick.... ![]() |
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:
dagegen funktioniert das:
if Image1.Canvas.Pixels[x,y]=Image1.Picture.Bitmap.TransparentColor then ....
Delphi-Quellcode:
sogar, wenn man die TransparentColor vorher auf clWhite setzt, passiert nix bei der ersten, aber bei der zweiten.
if Image1.Canvas.Pixels[x,y]=clWhite then ....
is das nich komisch? meine Meinung! Wat denkt ihr darüber? |
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 ;-) |
Re: runde Schaltflächen
Zitat:
mfg Christian |
Re: runde Schaltflächen
Hi...
Warum nicht so:
Delphi-Quellcode:
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.
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; regards Toni |
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)
|
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