Announcement

Collapse
No announcement yet.

Punkt in einer Region?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Punkt in einer Region?

    Hallo,

    Regionen sind eine feine Sache.
    Nur, wie kriege ich raus, ob ein Punkt zur Region gehört (ob die Maus gerade über der Region ist) oder nicht?

    Vielen Dank!
    Matthias

  • #2
    Dazu gibt es die <b>PtInRegion</b>-API-Funktion......<p>
    Aufruf:<br><pre>
    BOOL PtInRegion(
    HRGN hrgn, // handle to region
    int X, // x-coordinate of point
    int Y // y-coordinate of point
    );</pre><p>
    Gruß,<br>
    Bernhar

    Comment


    • #3
      Hallo Bernhard,

      ja schon...
      Aber dummerweise weiß ich nicht, wie ich den Punkt vom Formular ausgehend bekomme. Ich habe ein TImage als Kreis-Region. Wenn ich nun über der Region bin, wird FormMouseMove natürlich nicht ausgelöst.

      Allerdings wird damit das eigentliche Problem auch nicht erschlagen. Es geht mir nämlich eigentlich darum, wie ich ein TImage (und auch eine Region) zur Laufzeit in der Form verschieben kann.
      ReleaseCapture;
      image2.perform(WM_SysCommand, SC_DragMove, 0);
      scheint bei Images nicht zu klappen.

      Gruß
      Matthia

      Comment


      • #4
        Hi

        Korrekt, TImage ist ein Nachfahre von TGraphicControl, also OHNE ein echtes Fensterhandle. NUR Objecte die von TWinControl abgeleitet wurden besitzen ein hWnd und können mit obiger Methode verschoben werden. Lösung: nimm ein TPanel und setz ein TImage drauf. Im Image OnMouseDown Event dann Panel1.Perform(wm_SysCommand, ...) etc.
        Dadurch wird das Panel MIT Image verschoben.

        Das andere Problem: angenommen beim TImage ist Align=alClient und beim TPanel sind keinerlei Bevels bzw. BevelWidth = 0. Nun das OnMouseMove Event vom TImage:

        <pre>

        procedure Image1MouseMove(...., X, Y: Integer);
        var
        P: TPoint;
        begin
        P := Image1.ClientToScreen(Point(X, Y));
        // P enthält die absoluten Koordinaten zum Desktop
        P := Self.ScreenToClient(P); // Self = Form1
        // P enthält nun die Koordinaten relativ zum TForm

        if PtInRegion(Region, P.X, P.Y) then
        begin
        Self.Cursor := crHandPoint;
        end else
        begin
        Self.Cursor := ...
        end;
        end;

        procedure Image1OnMouseDown(Button, ...., X, Y: Integer);
        var
        P: TPoint;
        begin
        if Button <> mbLeft then Exit;
        P := Image1.ClientToScreen(Point(X, Y));
        P := Self.ScreenToClient(P); // Self = Form1
        if PtInRegion(Region, P.X, P.Y) then
        begin
        Panel1.Perform(wm_SysCommand, ....);
        end;
        end;

        </pre>

        Gruß hage

        Comment


        • #5
          Hallo Hagen,

          vielen Dank!
          Das Schlimme ist, dass immer irgendwas fehlt!
          Ich habe das (natürlich) alles probiert. (Regionen mache ich erst heute Abend.)
          Das TImage kann ich nicht verschieben. Ein Panel (mit dem Image drauf) kann ich verschieben, aber das Panel muss völlig transparent sein, damit ich das Image (ein anderes), dass darunter liegt, sehen kann. Das heißt, nicht nur transparent bei der Erstellung sondern auch bei und nach der Verschiebung mit dem Hintergrund am neuen Platz. Transparenz zu Anfang geht ja noch, aber nach dem Verschieben kriege ich es nicht hin.
          Und das ist immer noch nicht alles! Das Panel muss im Grunde auch eine Region sein, damit ich sofort außerhalb des auf dem Panel liegenden Images alles weitere auf dem darunterliegenden Image machen kann, ohne eine Störung des rechteckigen Panels (und des zwar transparenten aber recheckigen auf dem Panel liegenden Images).

          Am besten wäre vielleicht, sich dafür ein Extraformular zu basteln, aber da ist das Problem der Transparenz nach einer Verschiebung das gleiche ( muss ja eigentlich auch).

          Gruß
          Matthia

          Comment


          • #6
            Hi

            Du hast recht, einfach das Panel mit einer Region nutzen. Auf jedem Panel sitzt ein Image. Das wars, da die Fensterfunktionen von Windows alles andere selber erledigen -> meint Windows checkt beim Region-Panel autom. ob die Mouse in der Region ist, Windows schneidet die Darstellung des Images an der übergeordneten Region des Panels ab, etc.

            Gruß Hage

            Comment


            • #7
              Hi,

              danke Dir. Also ist die Richtung schon richtig.
              Nun darf ich probieren... <g>. man gönnt sich ja sonst nix!

              Gruß
              Matthia

              Comment


              • #8
                Jojo, aber so lernt man's richtig :

                Comment


                • #9
                  Hi Hagen,

                  ich hab's probiert und es funktioniert eigentlich ganz prima.
                  Nun habe ich als Nichtgrafikprogrammierer (erst mal) "nur noch" ein Problem:
                  Wie kann man ausgehend von einem Punkt auf Image.canvas den entsprechenden Punkt (oder den Mitteklpunkt des entsprechenden Bereiches) von Image.picture feststellen?
                  (Image.stretch:=true und Image.width<>image.picture.width bzw. alles für height)

                  Ich habe da zur Zeit nicht mal den Hauch einer Idee oder kiegt man das über einen Vergleich des originalen Seitenverhältnisses in Image.picture mit dem aktuelle Seitenverhältnis von Image?
                  Ich werde da mal als neue Frage ins Forum stellen.

                  Gruß
                  Matthia

                  Comment


                  • #10
                    Hi

                    Ja, das Seitenverhältniss/Größenverhältniss von originalem zum angezeigten Image ist wichtig. Mathematisch handelt es sich um den "Strahlensatz" oder einfach einer "Verhältnissgleichung".

                    Da Du aber von einem Punkt ausgehst, in einem verzerrten Image, und den Punkt im orginalen Image suchst, hast Du hier eine verschachtelte Verhältnissgleichung.

                    Als erstes wird das Seitenverhältniss von X und Y berechnet und anschließend der Zielpunkt berechnet.

                    <pre>
                    RatioX := Image.Width / Orginal.Width;
                    RatioY := Image.Height / Orginal.Height;

                    ZielX := Round(PointX * RatioX);
                    ZielY := Round(PointY * RatioY);
                    </pre>

                    Der Ziel Punkt beinhaltet nun die Koordinaten, relativ zum Ausgangspunkt, im orginalen Image.
                    Du meintest was vom "Mittelpunkt" ?

                    <pre>
                    MitteX := Image.Width div 2;
                    MitteY := Image.Height div 2
                    </pre>

                    Nun diesen Punkt mit obiger Verältnissgleichung umwandeln.

                    Gruß hage

                    Comment


                    • #11
                      Hi Hagen,

                      vielen Dank! Du weißt gar nicht, wie sehr ich Dir danke! Ich habe nämlich vor vielen Jahren mal theoretische Mathematik studiert. Das ist zwar eigentlich ganz gut, aber manchmal sieht man auch "den Wald vor lauter Bäumen nicht".
                      Ich wollte ja gleich mit mehrdeutigen Abbildungen ran...
                      Schließlich bleibt ja z. Bsp. beim Stauchen von mehreren Originalpixeln nur noch einer übrig und umgekehrt. Dann entspricht also ein Pixel des Image einem Bereich des Image.picture und deshalb meine Frage nach dem Mittelpunkt dieses Bereiches.
                      Aber das wäre wohl wirklich mit Kanonen auf Spatzen geschossen!

                      Also, vielen Dank noch mal!

                      Gruß
                      Matthias

                      PS: So wie Du hatte ich mir das zuerst auch gedacht. Aber dann - die Mathematik. Image und Image.Picture sind endliche (Pixel-)Mengen unterschiedlicher Mächtigkeit. In diesem Sinne wäre dann der Strahlensatz nicht anwendbar! Nur, wenn man annimmt, dass die Punkte dicht liegen - also die Mächtigkeit c haben, wie die rationalen Zahlen, funktioniert das eigentlich so

                      Comment


                      • #12
                        Hi

                        Korrekt, aber ich nehme mal an das die Fehlertoleranzen relativ unbedeutend sind, da

                        1. mit grobschlächtigen Pixel'n hantiert wird
                        2. die Seitenverhältnisse vom Orginal zum Edit-Image relativ gleich sind
                        3. Im Grunde berechnet obige Routine immer vom Mittelpunkt des Ausgangspixels zum Mittelpunkt der Zielpixel"gruppe".

                        Fehler wird es aber so immer geben. Ich schätze mal im günstigsten Fall +/- 0.5 Pixels, und das sollte vertetbar sein.

                        Gruß Hage

                        Comment


                        • #13
                          Hi,

                          genau!!! Das war mein Fehler. Ich habe mich eben an meine dunkle mathematische Vergangenheit erinnert und da musste alles soooo exakt sein. In der Realität sieht es ganz anders aus, da hast Du völlig Recht! Wer kann schon selbst 65000 Farben (mal als Beispiel) unterscheiden und bei Pixeln ist das nicht anders.

                          Gruß
                          Matthia

                          Comment

                          Working...
                          X