Canvas linien wie MSPaint



  • Also ich habe ein seltsames Problem: Ich möchte mit Canvas linien zeichnen. Bei MouseDown speichert er sich die Startposition. Bei MouseMove zeichnet er von Start nach Aktuelle Position. Beim loslassen zeichnet er dass dann auf die "EndBitmap".
    Nur ist mir folgendes Aufgefallen:
    - ist start = endposition --> keine linie wird gezeichnet
    - die linie wird immer bis zu dem Punkt gezeichnet, wo die Maus ist, der Mauspunkt selbst ausgeschlossen

    Bei MSPaint ist das nicht so. Da gibts diese "fehler" nicht.
    Könnt ihr mir da helfen?

    EDIT: Also ich hab soweit herrausgefunden, dass die letzte(die aktuelle) Mauskoordinate irgendwie nicht mit einbezogen wird.



  • Mach doch einfach an ENDPOSITION noch nen Punkt!



  • Das geht aber nicht. Ich hab einen Rechteck rDrwOP in dem in Left und Top die Startposition und Right und Bottom die Endposition gespeichert wird. Wenn ich einfach am Ende einen Punkt mache, dann stimmen die restlichen berechnungen z.b. nicht. Z.B. Breite, Höhe, Länge, etc der Linie.
    Gibt es keine "bessere" Lösung?
    Naja, vielleicht eine riesen if-Abfrage :S.



  • Tut mir leid. Es klappt doch. Also ich hatt da nen kleinen Schusselfehler gemacht. Also das mit Endpixel setzen hab ich vorher ausprobiert, aber irgendwie hat da dann nix geklappt. Naja, vielen dank.



  • Mir fällt gerade auf: da gibt es noch einen Fehler/Problem dass ich garnicht gern hab:
    folgende Linie wird gezeichnet bei Breite 4, Höhe 2:
    ...x
    .xx
    x
    obwohl ich gerne folgende hätte:
    ..xx
    xx

    Wie ist dann dieses Problem zu lösen?



  • Hi,
    nur sone Vermutung: bringst du irgendwo Breite und Höhe durcheinander oder fängst du bei 0 an zu zählen und zählst dann z.B.: 0, 1, 2, 3, 4 ( = 5 ) bzw. 0, 1, 2 ( = 3 )?

    MfG

    Alexander Sulfrian



  • Habe mir auch mal so ein Program geprogt
    Hab hier noch den Quelletext gefunden:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    MDown=true;
    OldX=X;OoldY=Y;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    MDown=false;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Image1->Canvas->Pen->Color=FrontColor;
    Image1->Canvas->Brush->Color=FrontColor;
    if((Tool==1)&&(MDown))       // Tool = Das Werkzeug (Linien)
    {
    if(OldX==0)OldX=PX;if(OldY==0)OldY=PY;
    Image1->Canvas->Pen->Width=PWidth;
    Image1->Canvas->MoveTo(OldX,OldY);
    Image1->Canvas->LineTo(PX,PY);
    OldX=PX;OldY=PY;
    }
    }
    //---------------------------------------------------------------------------
    

    Ich hoffe ich habe dir geholfen!



  • Ei Leute. Tut mir echt leid. Trotzdem vielen Dank für eure Hilfe.
    Es klappt doch alles Perfekt!

    @FB: was war denn das genau für ein Programm, dass du mal geschrieben hast? Kann man es irgendwo runterladen?



  • Ich kanns dir ja mal mailen!



  • Ja wär super. salim@virtualuna.de


Anmelden zum Antworten