Rechteck zeichnen im Maltool, aber wie?



  • Eine sehr behelfsmäßige Lösung hab ich mit Canvas->DrawFocusRect beim Aufziehen realisiert. Mit Canvas->LineTo will nur beim entgültigen Zeichnen klappen.

    // Im OnMouseMove
        Image->Canvas->MoveTo(Origin.x, Origin.y);
        ERect.Left = Origin.x;
        ERect.Top = Origin.y;
        ERect.Right = MovePt.x;
        ERect.Bottom = MovePt.y;
        FRect.Left = Origin.x;
        FRect.Top = Origin.y;
        FRect.Right = X;
        FRect.Bottom = Y;
        Image->Canvas->DrawFocusRect(ERect); 
        Image->Canvas->DrawFocusRect(FRect);
    
        // Im OnMouseUp
        Image->Canvas->MoveTo(Origin.x, Origin.y);
        Image->Canvas->LineTo(Origin.x, MovePt.y);
        Image->Canvas->LineTo(X, Y);
        Image->Canvas->LineTo(MovePt.x, Origin.y);
        Image->Canvas->LineTo(Origin.x, Origin.y);
    

    Kann mir jemand einen Tip geben, wie ich für's OnMouseMove eine richtige Routine schreiben kann?



  • TCanvas::Polyline



  • TCanvas::Polyline sieht nach 'ner harten Nuß aus. Ich bräuchte ein offenes Punkte-Array. Bewegt sich die Maus vom Startpunkt weg, erhöht sich die Zahl der Einträge, beim Annähern an den Startpunkt verringert sie sich wieder. Außerdem gelant die Maus niemals auf die Punkte, die für Polyline gebraucht werden.

    Der vielleicht einfachere Weg schien TCanvas::LineTo zu sein. Ich bin daran gescheitert, daß ich die gebildeten Zwischenstufen im Xor-Mode nicht löschen konnte. Hab keine Vorstellung, wie ich das Prob in den Griff bekommen könnte.



  • Original erstellt von <Omega-X>:
    **TCanvas::Polyline sieht nach 'ner harten Nuß aus. Ich bräuchte ein offenes Punkte-Array. Bewegt sich die Maus vom Startpunkt weg, erhöht sich die Zahl der Einträge, beim Annähern an den Startpunkt verringert sie sich wieder. Außerdem gelant die Maus niemals auf die Punkte, die für Polyline gebraucht werden.
    **

    *lol* Was du immer für nen Müll schreibst... 😃



  • Und du erst! 😃 😃 😃



  • Für ein Rechteck brauchst du genau fünf Punkte, ganz egal, wie gross das Rechteck ist. Es geht hier nur um die Eckpunkte, was dir beim Nachvollziehen des Beipieles aus der Hilfe eigentlich hätte auffallen sollen.



  • @WebFritzi, den Kommentar zu deinem hilfreichen Post hab ich nicht geschrieben.

    An den @Schmierfink: Ich find es absolut nicht gut, den Namen eines anderen Users zu mißbrauchen. Sowas schafft böses Blut in einem Arbeitsforum. Und hier ist ein Arbeitsforum. Kinderkram ist des Kindergartens.

    @Jansen, das ist mir grundsätzlich klar. Beim Aufziehen entstehen aber viele verschieden große Rechtecke. Die muß ich wieder löschen. Nur die Umrißlinie soll ja bleiben. Hier stellt sich für mich das Hauptproblem.

    Ich versuch's natürlich weiter. Aber wenn jemand die Lösung schon kennt, ich wär ein dankbarer Abnehmer. :p



  • Die "alten" Linien musst du halt wie gewohnt per XOR überschreiben. Ist doch prinzipiell dasselbe wie bei deinem Kreis per TCanvas::Arc.



  • [OFFTOPIC]
    Hallo Omega-X,
    registrier dich mal. 🙂
    Dann passiert sowas nicht mehr. 🙂
    [/OFFTOPIC]



  • Uff, ich bring's nicht zusammen.

    TPoint Origin,MovePt;
        Origin = Point(X,Y); // Startpunkt der Maus
        MovePt = Point(X,Y); // Bewegungspunkt
    
            // Im OnMouseMove
        POINT points[4];
        points[0].x = Origin.x; // Start
        points[0].y = Origin.y;
        points[1].x = Origin.x; // nach unten oder oben
        points[1].y = MovePt.y;
        points[2].x = MovePt.x; // nach links oder rechts
        points[2].y = MovePt.y;
        points[2].x = MovePt.x; // nach unten oder oben
        points[2].y = Origin.y;
        points[3].x = Origin.x; // zum Ausgangspunkt zurück
        points[3].y = Origin.y;
        Image->Canvas->Polyline(points,4);
    

    Das ist bereits falsch. In einer diagonalen Hälfte des Bildes bekomm ich Diagonalschraffur, vom Startpunkt weg führt eine (unendlich) lange Linie nach unten.... @WebFritzi, ich muß dir zustimmen. Selbst dein Ansporn kann keine geistreicheren gedanken wecken. 🙄



  • Ahem...

    POINT points[5];   // Jansen hat dir gerade vorhin erzählt, dass du 5 Punkte brauchst!
    points[0]   = Origin; // Start
    points[1].x = Origin.x; // nach unten oder oben
    points[1].y = MovePt.y;
    points[2]   = MovePt; // nach links oder rechts
    points[3].x = MovePt.x; // nach unten oder oben
    points[3].y = Origin.y;
    points[4]   = Origin; // zum Ausgangspunkt zurück
    Image->Canvas->Polyline(points,4);
    


  • hallo,

    in deiner frage heißt es: rechteck zeichnen.

    was hat ein rechteck mit polyline zu tun, steh ich auf der leitung, hab ich was verpasst, also ich zeichne rechtecke mit TCanvas::Rectangle und nicht mit polyline, wozu auch?
    und zwar verwende ich dazu je nach dem was ich brauche auf jeden fall mousedown um das ding zu initialisieren, dann natürlich mousemove um den fortschritt beim ziehn mit der maus anzuzeigen, und evtl. noch mouseup, je nachdem...

    mfg
    murph



  • @<murph>: Schau mal genauer in der Hilfe nach, was TCanvas::Rectangle() macht. Das geht nur, wenn TCanvas::Brush::Style auf bsClear steht.



  • Uff, ich hatte beim Aufbau das Prinzip verletzt. Der erste Weg erfolgt mit dem MovePt, der zweite Weg zum Xor-Löschen arbeitet dann mit (X,Y). Es klappt mit Canvas->LineTo blitzsauber.

    Image->Canvas->MoveTo(Origin.x, Origin.y);
        Image->Canvas->LineTo(Origin.x, MovePt.y);
        Image->Canvas->LineTo(MovePt.x, MovePt.y);
        Image->Canvas->LineTo(MovePt.x, Origin.y);
        Image->Canvas->LineTo(Origin.x, Origin.y);
        Image->Canvas->LineTo(Origin.x, Y);
        Image->Canvas->LineTo(X, Y);
        Image->Canvas->LineTo(X, Origin.y);
        Image->Canvas->LineTo(Origin.x, Origin.y);
    

    Nur die Ecken sind um die Canvas->Pen->Width ausgespart. Da muß ich expirimentieren. Denn grundsätzlich kann das Rechteck in alle 4 Richtungen aufgezogen bzw. beim Aufziehen auch korrigiert werden.

    Mit Polyline hat der gleiche Aufbau jetzt nicht geklapt. Kann aber ein Übertragungsfehler Schuld gewesen sein.



  • Tja, meinen Post hattest du dir nicht angeschaut, oder?



  • *Ich_halt's_im_Kopf_nicht_aus*, natürlich! Im Xor-Mode wird bei dem Brush-Style bsClear wieder das Original, wenn ich den Weg doppelt geh. Will ich was anderes? Ich will genau das. Und es funzt sowas von perfekt... Super Dank an Euch. Das löst auch das Ellipse-Problem. 🕶



  • Ahem, und wenn du noch einen Post von mir weiter oben schaust, dann siehst du auch die Lösung per PolyLine().



  • @WebFritzi, im Nachhinein bin ich sogar froh, daß ich dein Post noch nicht gesehen hatte. Der Dialog zwischen @murph und dir half. die Aufgabe perfekt zu lösen. 🕶 😉



  • Dadurch, dass du jetzt parallel mit mir gepostet hast, wirst du wiederum meinen Post übersehen. Deswegen nochmal: Schau einen Post über dem Dialog mit murph. Da hast du die Lösung für dein PolyLine.



  • @Omega-X-Fake, der Ichmenschlein ist registriert. Irgendwas mach ich falsch, mir gelingt das Login nicht. Werd immer im Kreis geführt. 🙄

    @WebFritzi, oh ja, deine Lösung hatte ich gesehen. Da steckt noch mehr drin, als nur der korrekte Code. Auch die Syntax ist interessant. Hab die seite für die Schnipselsammlung gespeichert. - Dann wollte der Code optimiert werden, damit ich wieder den Überblick hab. Jetzt hab ich's getestet. Klappt UFB. War auch nicht anders zu erwarten, wenn Profis Tips geben. Dank auch noch mal an @Jansen.



  • hallo,

    hi fritz, zu:
    "Schau mal genauer in der Hilfe nach, was TCanvas::Rectangle() macht. Das geht nur, wenn TCanvas::Brush::Style auf bsClear steht."

    ...und, wo ist das problem?

    murph


Anmelden zum Antworten