![]() |
Delphi-Version: 5
Klicken in Bereich auf Image
Hallo zusammen
Ich arbeite an einem Projekt zur Darstellung von Veranstaltungsplänen. Solch ein Saalplan wird mittels XML definiert. Um zwischen verschiedenen Ebenen zu wechseln kann dem Plan ein Vorschaubild beigefügt werden. Wird nun auf einen gewissen Teil des Bildes geklickt, erfolgt eine Aktion. Diese Bereiche werden ebenfalls im XML definiert und ich habe mich hier von dem HTML-Tag "area" inspirieren lassen: Beispiel HTML
Code:
Beispiel XML
<map name="planetmap">
<area shape="rect" coords="0,0,82,126" href="sun.htm"> <area shape="poly" coords="48,311,105,248,96,210,75,205,38,234,8,310" href="moon.htm"> </map>
Code:
Beine Überlegung ist nun folgende: Bei einem Klick auf das Bild überprüfe ich, ob die Koordinaten in einer der Regionen sind.
<zones>
<zone type="rect"> <coords>0,0,82,126</coords> </zone> <zone type="path"> <coords>48,311,105,248,96,210,75,205,38,234,8,310</coords> </zone> </zones> Mit PtInRect ist es einfach dies bei einem Rechteck zu überprüfen. Aber gibt es auch etwas für "freie" Koordinaten? Und meine Mathematikkenntnisse reichen dafür auch nicht aus. Kann ich eine Region auf einem Bild definieren? Hat da jemand Idee? :-) Herzlichen Dank! RedOne |
AW: Klicken in Bereich auf Image
|
AW: Klicken in Bereich auf Image
Ich bastle mir das Schild gleich selbst... Danke, das hat geholfen :-)
Für alle zukünftigen Threadbesucher. So kann's klappen:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var rgn : HRGN; plist : array [0..4] of TPoint; begin Canvas.Brush.Color := clRed; plist[0] := Point(104,150); plist[1] := Point(147,148); plist[2] := Point(151,287); plist[3] := Point(98,284); rgn := CreatePolygonRgn(plist,4,Winding); if PtInRegion(rgn, x, y) then ShowMessage('in'); end; |
AW: Klicken in Bereich auf Image
DeleteObject nicht vergessen sonst gehen Dir (Windows) irgendwann die Handels aus ...
|
AW: Klicken in Bereich auf Image
Und eine Prüfung auf eine gültige Region wäre auch zu empfehlen.
Delphi-Quellcode:
rgn := CreatePolygonRgn(plist,4,Winding);
if rgn <> 0 then begin if PtInRegion(rgn, x, y) then ShowMessage('in'); DeleteObject(rgn); end; |
AW: Klicken in Bereich auf Image
Delphi-Quellcode:
Zufrieden? :-)
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var rgn : HRGN; plist : array [0..4] of TPoint; begin plist[0] := Point(104,150); plist[1] := Point(147,148); plist[2] := Point(151,287); plist[3] := Point(98,284); rgn := CreatePolygonRgn(plist,4,Winding); try if (rgn <> 0) and (PtInRegion(rgn, x, y)) then ShowMessage('in'); finally DeleteObject(rgn); end; end; |
AW: Klicken in Bereich auf Image
Japp, besser. Wobei ich mich allerdings frage, wo eine Exception auftreten soll, aber funktionieren sollte es so zuverlässig.
[edit] Wenn man aber mal davon ausgeht, dass es nicht beim ShowMessage bleibt, macht der Ressourcen-Schutzblock wahrscheinlich Sinn. [/edit] |
AW: Klicken in Bereich auf Image
Irgendwo im Code der noch kommen wird ;-)
Ich bin der Meinung dass, wenn du willst, dass etwas wirklich freigegeben wird, mach ein try drumrum. |
AW: Klicken in Bereich auf Image
Da hat sich gerade Dein Post mit meinem Edit überschnitten :lol:
|
AW: Klicken in Bereich auf Image
Zitat:
Es beginnt mit dem Vorschaubild. In das Vorschaubild werden nun mit einem Grafikprogramm farbige Flächen eingezeichnet. Die Farben müssen vorher festgelegt werden und haben jeweils eine bestimmte Bedeutung. (z.B. rot=Preis 1. Klasse, orange=Preis 2.Klasse, grün=Stehplätze) Dieses Bild wird gespeichert und anschliessend werden per Software alle Punkte auf Schwarz gesetzt, die nicht den vordefinierten Flächen entsprechen. Das ergibt das Maskenbild. Vorschaubild und Maskenbild werden nun überlagert (90% Vorschaubild, 10% Maskenbild) und dem Benutzer angezeigt. Wenn der Benutzer auf dieses Bild klickt braucht man nur in das Maskenbild schauen und dort die Farbe auslesen. Aus der Farbe ergibt sich die Bedeutung des Punktes. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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