Ergebnis 1 bis 6 von 6

Delphi: Zeichnen; kleines Projekt

  1. #1 Zitieren
    Ehrengarde Avatar von Trulek
    Registriert seit
    Jan 2003
    Beiträge
    2.477
    Hi

    Zurzeit wollen wir in der Schule ein Programm nach Wahl entwickeln, dass natürlich am Ende benotet wird. Ich hab mir ein kleines "Zeichenprogramm" überlegt, welches auf Knopfdruck die Figuren einfügt. Man kann dabei die Größe der Figur (Rechteck,Kreis etc.) und die gewünschte Position angeben. Viel weiter bin ich auch noch nicht, das nur mal zur Erklärung.

    Jetzt hab ich zwei kleine Probleme:
    1. Wenn ich ein Kreis auf mein Image zeichnen will benutze ich
    Code:
    image1.Canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
    Allerdings wird jedes mal wenn ich einen Kreis zeichne der alte ersetzt. Seltsamerweise ist das beim Rechteck nicht so? kann mir da vielleicht jemand helfen, dass der Kreis nicht verschwindet?

    2. Ich würde gerne die gezeichneten Figuren mit der Maus auf dem Bildschirm verschieben können, weiß aber nicht genau wie ich das anstellen soll, geht das überhaupt bei mit Canvas gezeichneten Sachen?

    Ich weiß, dass Programm wird sicher nicht der Hit werden, aber es soll ja der Übung dienen und mir ist nichts anderes eingefallen..
    Trulek ist offline

  2. #2 Zitieren
    Sword Master Avatar von Mog
    Registriert seit
    Sep 2005
    Beiträge
    781
    Ich kenne den Hintergrund nicht, aber vll musst du einfach nur eine neue Zeichenstruktur erstellen.

    Ich wuerde fuer solche Sachen ja SDL benuetzen. Das ist sehr gut ausdokumentiert und sehr leicht zu programmieren.
    Young friends and old whiskey are burning inside. Crash the glass down! Fingal will rise.
    Mog ist offline

  3. #3 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.818
    Zitat Zitat von Trulek
    Jetzt hab ich zwei kleine Probleme:
    1. Wenn ich ein Kreis auf mein Image zeichnen will benutze ich
    Code:
    image1.Canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
    Allerdings wird jedes mal wenn ich einen Kreis zeichne der alte ersetzt. Seltsamerweise ist das beim Rechteck nicht so? kann mir da vielleicht jemand helfen, dass der Kreis nicht verschwindet?

    2. Ich würde gerne die gezeichneten Figuren mit der Maus auf dem Bildschirm verschieben können, weiß aber nicht genau wie ich das anstellen soll, geht das überhaupt bei mit Canvas gezeichneten Sachen?
    Zu 1.: Ich kann jetzt schlecht sagen, woran das Verschwinden der Ellipse (bzw. des Kreises) liegt, aber wahrscheinlich muss man einfach im OnPaint-Ereignis der Image-Komponente den Kreis neu zeichnen.

    Zu 2.: Ja, das geht auch.
    Dazu solltest du dir mal die entsprechenden Ereignisroutinen für die Maus ansehen: OnMouseDown, OnMouseMove und OnMouseUp (so heißen sie, wenn ich mich recht erinnere).
    Das OnMouseDown-Ereignis wird jedesmal ausgelöst, wenn eine Maustaste gedrückt wird und man kann man damit ganz einfach herausbekommen, welche Maustaste (links oder rechts) gedrückt wurde. Die Ereignisroutine OnMouseUp ist im Prinzip fast das gleiche, nur mit dem Unterschied, dass diese Routine ausgeführt wird, sobald eine der Maustasten losgelassen wird.
    In OnMouseMove, welches ausgelöst wird, sobald die Maus bewegt wird, erhält man die Koordinaten (x und y) des Mauszeigers, und man muss dann nur noch entsprechend auf die Bewegung der Maus reagieren und die Objekte, welche verschoben werden sollen, an der neuen Stelle neu zeichnen.
    Thoronador ist offline

  4. #4 Zitieren
    Ehrengarde Avatar von Trulek
    Registriert seit
    Jan 2003
    Beiträge
    2.477
    1. Hab ich heute in der Schule gelöst. Ich Idiot hatte die Füllfarbe des Kreises nicht auf durchsichtig gestellt und wenn der Kreis dann größer ist...na dann
    Trotzdem danke

    2. Mit Onmouseup und onmousedown hab ich mich schon beschäftigt. Damit hab ich auch heute das Zeichnen einer Linie realisiert, von dem Punkt wo die Maustaste unten ist, bis sie wieder losgelassen wird. Allerdings kommt da das nächste Problem, da sich die Mausposition links oben in der Ecke orientiert.
    Code:
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    x1:= Mouse.CursorPos.X;
    y1:= Mouse.CursorPos.Y;
    end;
    
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    x2:= Mouse.CursorPos.X;
    y2:= Mouse.CursorPos.Y;
    image1.Canvas.MoveTo(x1,y1);
    image1.Canvas.LineTo(x2,y2);
    end;
    ScreenToClient funktioniert nicht, weil ich x und y einzeln habe, wegen dem Zeichnen der Linie.
    Also das Zeichnen funktioniert, nur halt nicht an gewünschter Stelle.
    Trulek ist offline Geändert von Trulek (11.05.2006 um 12:49 Uhr)

  5. #5 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.818
    Zitat Zitat von Trulek
    ...
    2. Mit Onmouseup und onmousedown hab ich mich schon beschäftigt. Damit hab ich auch heute das Zeichnen einer Linie realisiert, von dem Punkt wo die Maustaste unten ist, bis sie wieder losgelassen wird. Allerdings kommt da das nächste Problem, da sich die Mausposition links oben in der Ecke orientiert.
    Code:
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    x1:= Mouse.CursorPos.X;
    y1:= Mouse.CursorPos.Y;
    end;
    
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    x2:= Mouse.CursorPos.X;
    y2:= Mouse.CursorPos.Y;
    image1.Canvas.MoveTo(x1,y1);
    image1.Canvas.LineTo(x2,y2);
    end;
    ScreenToClient funktioniert nicht, weil ich x und y einzeln habe, wegen dem Zeichnen der Linie.
    Also das Zeichnen funktioniert, nur halt nicht an gewünschter Stelle.
    Es ist doch gar kein Problem, dass sich die Koordinaten an der linken oberen Ecke orientieren, im Gegenteil, es geht damit auch ohne Mouse.CursorPos zu verwenden:
    Code:
    //globale Variablen
    var zeichne: Boolean;
        x1, y1: Integer;
    
    ....
    
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     //prüfen, ob linke Maustaste gedrückt
     if (ssLeft in Shift) then begin
       x1:=x;
       y1:=y;
       zeichne:= true;
       Image1.Canvas.Pixels[x,y]:= clBlack;
     end; //if
    end;
    
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if (zeichne) then begin
       Image1.Canvas.MoveTo(x1, y1);
       Image1.Canvas.LineTo(x, y);
       zeichne:= False;
       showMessage('Linie fertig!');
     end; //if
    end;
    Wie du siehst, braucht man Mouse.Cursorpos nicht, sondern nimmt stattdessen die Werte der Parameter X und Y von OnMouseDown- bzw.OnMouseUp. Das gleiche gilt für den Fall, dass man ein Objekt verschieben möchte.
    Thoronador ist offline

  6. #6 Zitieren
    Ehrengarde Avatar von Trulek
    Registriert seit
    Jan 2003
    Beiträge
    2.477
    Danke erstmal, funktioniert soweit.
    Mal schauen ob ich das mit dem verschieben hinkriege.
    Trulek ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •