Entwickler-Ecke

WinForms - Bildbereiche klickbar


naeschd - Di 02.03.10 17:51
Titel: Bildbereiche klickbar
Hey zusammen

ich möchte bestimmte Ereignisse ausführen wenn auf einen bestimmten Bildbereich geklickt wird (Es gibt viele verschiedene Klickbereiche im Bild). Ein Aufbau aus mehreren Einzelbildern ist nicht möglich).
Das Bild ist über eine PictureBox im Form eingebunden.
Wie kann ich das machen, dass beim Klick auf verschiedene Bereich verschiedene Ereignisse ausgeführt werden?
Ich habe es schon mit Transparenten Panels versucht, die in die PictureBox geschoben werden. Jedoch verdecken die wenn sie im Vordergrund sind das Bild. Im Hintergrund sind diese jedoch nicht klickbar! Ich habe es schon mit transparenten Panels versucht. Jedoch habe ich das nicht hinbekommen!
Könnt ihr mir weiterhelfen? Bitte Laienverständlich. Bein leider noch blutiger Anfänger
Ich danke euch für eure Hilfe!


danielf - Di 02.03.10 18:11

Hallo und :welcome:,

Events auf bestimmte Bereiche eines Bildes kann man nicht setzen, dafür aber auf die ganze PictureBox, wie du ja bereits festgestellt hast. Im Code kannst du dann überprüfen in welchem Bereich der Benutzer geklickt hat und dementsprechend die Eingabe verarbeiten.


1) Click-Event der PictureBox registrieren
2) Bereiche definieren (Rectangle)
3) In der OnClick-Methode überprüfen ob der Klick in einem Rectangle (Rectangle.Contains) liegt
4) Diese Informationen verarbeiten

Gruß Daniel


naeschd - Di 02.03.10 18:25

Ok danke für deinen Tip!

Bin gerade dabei ein Rectangle zu erstellen (und um es sichtbar zu machen auch zu zeichnen)...
Ich sehe das Rectangle jetzt nicht (da es im Hintergrund dargestellt wird). Macht das was aus oder müsste das ganze trotzem funtionieren?

und kannst du mir einen kleinen Hinweis geben wie das mit dem Rectangle.Contains funktioniert? Ich muss da doch irgendwie die Mausposition mitverarbeiten, oder?


danielf - Di 02.03.10 18:37

Du sollst keins Zeichnen, nur welche Definieren die dir als Regionen dienen.


C#-Quelltext
1:
2:
3:
List<Rectangle> _regions = new List<Rectangle>();

_regions.Add(new Rectangle(0,0,100,100));



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private void click(..)
{
   PictureBox pb = (PictureBox) sender;
   Point imageCoordiante= pb.PointToClient(MousePosition);

   foreach(var item in _regions)
   {
      if (item.Contains(imageCoordiante))
      {
           // ...
      }
   }
}


Praktisch ist wen du das Rectangle-Objekt um spezifische Eigenschaften erweiterst oder ein Dictionary verwendest.


naeschd - Di 02.03.10 18:47

Super! Das funktioniert schonmal sehr gut! Jetzt brauche ich nur noch eine Unterscheidung welches Rectangle angeklickt wurde :-) Dann bin ich zufrieden :-D
Danke für deine asuführliche Hilfe!


danielf - Di 02.03.10 22:57

Wie gesagt, dafür kannst du ein Dictionary verwenden oder du erweitest eben das Rectangle (eigner Typ) der dann die gewünschten Parameter hat.

Gruß Daniel