Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klicken in Bereich auf Image (https://www.delphipraxis.net/170600-klicken-bereich-auf-image.html)

RedOne 25. Sep 2012 13:15

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:
<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>
Beispiel XML
Code:
<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>
Beine Überlegung ist nun folgende: Bei einem Klick auf das Bild überprüfe ich, ob die Koordinaten in einer der Regionen sind.
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

Sir Rufo 25. Sep 2012 13:18

AW: Klicken in Bereich auf Image
 
Wenn du Bei Google suchenPtInRect kennst, dann ist es ja ein einfaches auch auf Bei Google suchenPtInRegion zu kommen ;)

RedOne 25. Sep 2012 13:31

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;

Bummi 25. Sep 2012 15:16

AW: Klicken in Bereich auf Image
 
DeleteObject nicht vergessen sonst gehen Dir (Windows) irgendwann die Handels aus ...

DeddyH 25. Sep 2012 15:20

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;

RedOne 25. Sep 2012 15:23

AW: Klicken in Bereich auf Image
 
Delphi-Quellcode:
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;
Zufrieden? :-)

DeddyH 25. Sep 2012 15:28

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]

RedOne 25. Sep 2012 15:30

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.

DeddyH 25. Sep 2012 15:32

AW: Klicken in Bereich auf Image
 
Da hat sich gerade Dein Post mit meinem Edit überschnitten :lol:

shmia 25. Sep 2012 15:50

AW: Klicken in Bereich auf Image
 
Zitat:

Zitat von RedOne (Beitrag 1184352)
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

Es gäbe aber auch noch einen alternativen Ansatz, der möglicherweise weniger Arbeit zur Aufbereitung des Saalplans bedeutet.

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 02:36 Uhr.
Seite 1 von 2  1 2      

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