none
Erfolgte Mausklick auf Figur? RRS feed

  • Frage

  • In C++ gibt es eine funktion namens PtInRect(...) mit der man ermitteln kann ob der Benutzer in einen Bestimmten Bereich in der Anwendung geklickt hat. So etwas wollte ich nun auch in C# versuchen. Ich habe mich mit folgendem Code probiert:
    [DllImport("user32.dll")]
    static extern bool PtInRect(Rectangle lprc, Point pt);
    ...
    if(PtInRect(new Rectangle(objects[0].Points[i].X-4, objects[0].Points[i].Y-4, objects[0].Points[i].X + 4, objects[0].Points[i].Y + 4), new Point(e.X, e.Y)))
    {...}

    Ich will heraufinden ob der Klick in einem 9*9 Pixel große Bild statt gefunden hat. Es kommt jedoch folgender Fehler:
    Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in DrawTest.exe aufgetreten.
    
    Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Außerdem habe ich das Problem, das die Bitmap eilweise Transparent ist und ich nun befürchte das, auch wenn man in den nicht sichtbaren bereich klickt, die Abfrage true zurück liefert.

    Also nun meine Frage: Gibt es nicht auch in C# eine Funktion für solche sachen?

    PS: Ich benutze eine Windows Form.


    Koopakiller - http://koopakiller.ko.ohost.de/
    Mittwoch, 21. Dezember 2011 17:20

Antworten

  • Hallo,

    da gibt es überhaupt keinen Grund auf unmanaged zurückzugreifen -
    System.Drawing kapselt fast vollständig GDI+, so dass alles Grundlegende vorhanden ist.

    Das bietet bereits die Rectangle-Struktur über die Contains Methode

    Dem Rechteck wiederum ist vollkommen egal, ob Deine Bitmap transparent oder kariert ist ;-)
    Wenn Du eine Bitmap als Grundlage hast, so wirst Du wohl oder übel,
    die Transparenz an der Stelle auswerten müssen, siehe GetPixel

    Gruß Elmar

    • Als Antwort markiert KK Senior Donnerstag, 22. Dezember 2011 16:56
    Mittwoch, 21. Dezember 2011 20:13
    Beantworter

Alle Antworten

  • Hi Koopakill,

     

    Die Funktion PTInRect ist nicht Verwalteter Code mit deimen new Rectangle gibtst du den nicht Verwalteten Code die Möglichkeit in deinen Verwalteten Code zu schrbeien. Was die Runtime aber nicht zuläst.

     

    Ich denke deine Befürchtung ist Richtig, die Funktion sollte dir True zurück lifern für alle Punkte die in den Angegeben Rechteck liegen.

     

    Wenn du zB. die PicturBox verwendest, könntest du einfach das MousClick-Event zum abfangen der eingabe benutzen und das MouseEnter/Leave um die Hintergundfarbe zu änder, so das der Benutzer weis das er jetzt Klicken kann.

     

    MFG

    Björn

     

     

     

     

     

    Mittwoch, 21. Dezember 2011 18:01
  • Bei meinem Programm soll der Benutzer etwas zeichnen. Danach soll er das gezeichnete Objekt auswählen können, dazu wollte ich solche Punkte wie in MS Word benutzen, an denen die Größe und Position verändert werden kann.
    Koopakiller - http://koopakiller.ko.ohost.de/
    Mittwoch, 21. Dezember 2011 18:06
  • Ich denke das ist einfacher mit WPF als Windows Forms.

    Hier mal ein Link für den einstieg.

    http://msdn.microsoft.com/de-de/library/bb531278%28v=vs.90%29.aspx

     

    Ich muss gestehen ein Zeichenprogramm, ab ich mit Windows Forms noch nicht umgesetzt und hab da aus dem stehgreif auch keine Lösung.

     

    MFG

    Björn

     

    Mittwoch, 21. Dezember 2011 18:20
  • Hallo,

    da gibt es überhaupt keinen Grund auf unmanaged zurückzugreifen -
    System.Drawing kapselt fast vollständig GDI+, so dass alles Grundlegende vorhanden ist.

    Das bietet bereits die Rectangle-Struktur über die Contains Methode

    Dem Rechteck wiederum ist vollkommen egal, ob Deine Bitmap transparent oder kariert ist ;-)
    Wenn Du eine Bitmap als Grundlage hast, so wirst Du wohl oder übel,
    die Transparenz an der Stelle auswerten müssen, siehe GetPixel

    Gruß Elmar

    • Als Antwort markiert KK Senior Donnerstag, 22. Dezember 2011 16:56
    Mittwoch, 21. Dezember 2011 20:13
    Beantworter
  • Gut, dann mache ich mich mal an WPF.
    Koopakiller - http://koopakiller.ko.ohost.de/
    Donnerstag, 22. Dezember 2011 16:56