Announcement

Collapse
No announcement yet.

Zeichenfläche

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

  • #16
    <html>

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <title>Neue Seite 1</title>
    </head>

    <body>

    <p>Bring mal die 4 Zeilen</p>
    <pre>myPen.Color=Color.Yellow;
    myPen.Width=1;
    Linie(0,-10000,0,10000,e,myPen);
    Linie(-10000,0,10000,0,e,myPen);
    </pre>
    <p>in die WinForm_Paint - Funktion rein. Dann kannst Du sehen, wo gerade der
    Koordinaten-Ursprung liegt, der ja durch xMitte und yMitte von der oberen Linken
    Fensterecke versetzt ist. Die Position, an der Du zeichnest, bezieht sich auf
    diesen Punkt. Die beiden Zeilen</p>
    <pre>xMitte=StartPt.X+xMitte;
    yMitte=StartPt.Y+yMitte;</pre>
    <p>sind auf jeden Fall noch falsch, da soll ja dafür gesorgt werden, daß der
    vorher gekennzeichnete Rahmen zum neuen Fensterinhalt wird. Ich tu mich im
    Moment etwas schwer, die richtige Formel dafür zu finden. Etwas besser, aber
    noch lange nicht optimal ist das hier:</p>
    <pre>xMitte=xMitte-StartPt.X+this.Width/2;
    yMitte=yMitte-StartPt.Y+this.Height/2;</pre>
    <p>Gruß,</p>
    <p>Günther</p>

    </body>

    </html&gt
    Günther

    Comment


    • #17
      Habe sie untergebracht. Ich denke man muss irgendwie den Mittelpunkt des 1. Koordinatensystems als 0/0 festlegen und dann die den Mittelpunkt des Zoomrechteckes davon abziehen.
      Ist aber nur ne Überlegung, die bis jetzt auch noch nicht so geklappt hat.
      Schon komisch, kann doch eigenlich gar nicht so schwer sein

      Comment


      • #18
        Gib es vielleicht noch andere Lösungsansätze ? Viellcht hat jemand ja noch eine Idee.

        Gruss
        Bod

        Comment


        • #19
          <html>

          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
          <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
          <meta name="ProgId" content="FrontPage.Editor.Document">
          <title>Neue Seite 1</title>
          </head>

          <body>

          <pre>Na, ist doch ganz einfach. Um von einem Punkt x,y der Zeichnung den zuggeordneten
          Punkt xs,ys auf dem Bildschirm zu ermitteln, haben wir die Formeln:

          xs = xMitte + x * zoom
          ys = yMitte - y * zoom

          Die Formeln kann man umstellen, um einen Bildschirmpunkt auf der Zeichnung wiederzufinden:

          x = ( xs - xMitte ) / zoom
          y = ( yMitte - ys ) / zoom

          Oder auch so:

          xMitte = xs - x * zoom
          yMitte = ys + y * zoom

          Wenn ich beginne, ein Zoomrechteck aufzuziehen, habe ich den alten Mittelpunkt des Bildschirms
          (Width/2, Height/2) und bereits auch den zukünftigen Mittelpunkt (mx, my).
          Aber wir brauchen nicht alle Formeln:

          xAlt = ( Width / 2 - xMitteAlt ) / zoomAlt
          yAlt = ( yMitteAlt - Height / 2 ) / zoomAlt

          xNeu = ( mx - xMitteAlt ) / zoomAlt
          yNeu = ( yMitteAlt - my ) / zoomAlt

          DeltaX = xAlt - xNeu
          DeltaY = yAlt - yNeu

          Der neue Zoomfaktor liegt fest, wenn ich die Maustaste loslasse:

          zoomNeu = zoomAlt * Width / MausRechteckBreite

          Und jetzt können wir berechnen:

          xMitteNeu = ( Width / 2 ) - xNeu * zoomNeu
          yMitteNeu = ( Height / 2 ) + yNeu * zoomNeu

          private void WinForm_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
          {
          if(Status==3)
          {
          if(MausRechteckBreite>0)
          {
          float xNeu = ( mx - xMitte ) / zoom;
          float yNeu = ( yMitte - my ) / zoom;
          zoom=zoom*this.Width/MausRechteckBreite;
          xMitte = ( this.Width / 2 ) - xNeu * zoom;
          yMitte = ( this.Height / 2 ) + yNeu * zoom;
          }
          Invalidate();
          }
          Status=0;
          }

          </pre>

          </body>

          </html&gt
          Günther

          Comment


          • #20
            statt der Fenster-Außengröße this.Height und this.Width ist es besser, die tatsächlichen Abmessungen der Zeichenfläche, this.ClientSize.Height und this.ClientSize.Width zu verwenden
            Günther

            Comment


            • #21
              Hallo!

              mx und my sind ja sie Startpunkte des Zoomrechteckes. xMitte und yMitte die Mittelpunkte der

              Zeichenfläche. So bleibt es nicht aus, dass yNeu bei Mausup einen negativen Wert hat. Das ist

              denke ich noch ein Fehler. Ich poste mal meinen Code, vielleicht endeckst Du ja noch mehrere

              Fehler. Durch das viele Testen, ist alles ein wenig durcheinander geraten.
              <pre>
              //Globale Variablen
              private int MausRechteckBreite;
              private int xMitte=0;
              private int yMitte=100;
              private int zoom=1;
              private Point StartPt;

              private void Linie(float x1, float y1, float x2, float y2,

              System.Windows.Forms.PaintEventArgs e, Pen P)
              {
              int ix1=(int)(xMitte+x1);
              int ix2=(int)(xMitte+x2);
              int iy1=(int)(yMitte-y1);
              int iy2=(int)(yMitte-y2);

              e.Graphics.DrawLine(P,ix1,iy1,ix2,iy2);
              }

              private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
              {
              Pen myPen = new Pen(Color.Black, 3);
              Linie(10,10,120,30,e,myPen);

              myPen.Color=Color.Yellow;
              myPen.Width=1;
              }

              private void Form1_MouseDown(object sender,

              System.Windows.Forms.MouseEventArgs e)
              {
              StartPt = new Point(e.X,e.X);
              xMitte = this.ClientSize.Width/2;
              yMitte = this.ClientSize.Height/2;
              }

              private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs

              e)
              {
              MausRechteckBreite = e.X - StartPt.X;
              int xNeu = ( StartPt.X - xMitte ) / zoom;
              int yNeu = ( yMitte - StartPt.Y ) / zoom;

              zoom = zoom * this.ClientSize.Width / MausRechteckBreite;
              xMitte = (this.ClientSize.Width/2) - xNeu * zoom;
              yMitte = (this.ClientSize.Height/2) + yNeu * zoom;
              Invalidate();
              }
              </pre&gt

              Comment


              • #22
                <html>

                <head>
                <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
                <meta name="ProgId" content="FrontPage.Editor.Document">
                <title>Neue Seite 2</title>
                </head>

                <body>

                Hallo!
                <p><i>So bleibt es nicht aus, dass yNeu bei Mausup einen negativen Wert hat. Das
                ist denke ich noch ein Fehler. </i>
                <p>Nein, das ist in Ordnung so.</p>
                <pre>
                private void Linie(float x1, float y1, float x2, float y2,System.Windows.Forms.PaintEventArgs e, Pen P)
                {
                int ix1=(int)(xMitte+x1<b><font color="#FF0000">*zoom</font></b>);
                int ix2=(int)(xMitte+x2<b><font color="#FF0000">*zoom</font></b>);
                int iy1=(int)(yMitte-y1<b><font color="#FF0000">*zoom</font></b>);
                int iy2=(int)(yMitte-y2<b><font color="#FF0000">*zoom</font></b>);
                e.Graphics.DrawLine(P,ix1,iy1,ix2,iy2);
                }

                private void Form1_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
                {
                StartPt = new Point(e.X,e.X);
                <b>xMitte = this.ClientSize.Width/2; <font color="#FF0000">// Falsch! Das hat hier nichts zu suchen!</font>
                yMitte = this.ClientSize.Height/2; <font color="#FF0000">// Falsch! Das hat hier nichts zu suchen!</font></b>
                }
                </pre>

                <p>xMitte und yMitte sind nicht die Mitte des Bildschirmfensters, sondern der
                Versatz obere Linke Ecke Bildschirmfenster zum Koordinatensystem der Zeichnung.
                Die Bezeichnungen sind vielleicht etwas irreführend gewählt, xVersatz und
                yVersatz wäre treffender.</p>
                <p>Gruß, Günther </p>

                </body>

                </html&gt
                Günther

                Comment


                • #23
                  Du hast in Deinem Code kein MouseMove mehr? In MouseUp sagst Du:
                  MausRechteckBreite = e.X - StartPt.X; Dann stimmt da auch was nicht. MausRechteckBreite = ( e.X - StartPt.X ) * 2; sollte das wohl immernoch heißen. Ansonsten wird zoom falsch berechnet
                  Günther

                  Comment


                  • #24
                    Soo, habe es abgeändert:

                    <pre>
                    private int MausRechteckBreite,MausRechteckHoehe;
                    private int xMitte=0;
                    private int yMitte=100;
                    private int zoom=1;
                    private Point StartPt;

                    private void Linie(float x1, float y1, float x2, float y2, System.Windows.Forms.PaintEventArgs e, Pen P)
                    {
                    int ix1=(int)(xMitte+x1*zoom);
                    int ix2=(int)(xMitte+x2*zoom);
                    int iy1=(int)(yMitte-y1*zoom);
                    int iy2=(int)(yMitte-y2*zoom);

                    e.Graphics.DrawLine(P,ix1,iy1,ix2,iy2);
                    }

                    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
                    {
                    Pen myPen = new Pen(Color.Black, 3);
                    Linie(10,10,120,30,e,myPen);

                    myPen.Color=Color.Yellow;
                    myPen.Width=1;
                    }

                    private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
                    {
                    StartPt = new Point(e.X,e.X);
                    }

                    private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
                    {
                    MausRechteckBreite = (e.X - StartPt.X)*2;
                    int xNeu = ( StartPt.X - xMitte ) / zoom;
                    int yNeu = ( yMitte - StartPt.Y ) / zoom;

                    zoom = zoom * this.ClientSize.Width / MausRechteckBreite;
                    xMitte = (this.ClientSize.Width/2) - xNeu * zoom;
                    yMitte = (this.ClientSize.Height/2) + yNeu * zoom;
                    Invalidate();
                    }

                    private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
                    {
                    if(e.X> StartPt.X) MausRechteckBreite=(e.X- StartPt.X)*2;
                    else MausRechteckBreite=( StartPt.X-e.X)*2;
                    MausRechteckHoehe=MausRechteckBreite*this.ClientSi ze.Height/this.ClientSize.Width;

                    }
                    /pre>

                    MausMove hatte ich weggelassen, weil man ja die Höhe und Breite des Mausrechteckes auch nach dem loslassen der Maus berrechen kann. Sind sonst noch irgendwelche Fehler drin ?

                    Danke
                    Bod

                    Comment


                    • #25
                      <html>

                      <head>
                      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
                      <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
                      <meta name="ProgId" content="FrontPage.Editor.Document">
                      <title>Neue Seite 2</title>
                      </head>

                      <body>

                      <p><i>MausMove hatte ich weggelassen, weil man ja die Höhe und Breite des
                      Mausrechteckes auch nach dem loslassen der Maus berrechen kann. </i>
                      <p>Kommentar: Dann kann man aber während des Maus-Ziehens nichts sehen. Vorausgesetzt natürlich, daß das Rechteck während des MouseMove auch gezeichnet wird. Siehe mein MouseMove und Paint aus #13.</p>
                      <p><i>Sind sonst noch irgendwelche Fehler drin ?</i></p>
                      <p>Gegenfrage: Funktioniert denn jetzt alles? Wenn Ja: Nein, Wenn Nein: Ja. :-)</p>

                      </body>

                      </html&gt
                      Günther

                      Comment


                      • #26
                        Nein, funktioniert noch nicht. Durch setzen von yMitte=100 ist das erste Zeichnen der Linie falsch. Wenn es Dir recht ist, würde ich Dir gerne mal den Quellcode per Mail senden.

                        Gruss
                        Bod

                        Comment


                        • #27
                          Sende, ich kann aber erst morgen abend testen.

                          Gruß, Günthe
                          Günther

                          Comment

                          Working...
                          X