Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi problem mit minipaint--->4ecke und kreise... (https://www.delphipraxis.net/44092-problem-mit-minipaint-4ecke-und-kreise.html)

la.ma 13. Apr 2005 12:59


problem mit minipaint--->4ecke und kreise...
 
hallo,

also ich habe genau das selbe problem, wie hier beschrieben und zwar da punkt 1.

wie kriege ich das hin, dass der die rechteck,e die der in mousemove zeichnet, sofort wieder löscht? ich habe im buch was gelesen, dass man das mit canvas.pen.mode irgendwie was machen muss...

danke schon mal

Khabarakh 13. Apr 2005 14:58

Re: problem mit minipaint--->4ecke und kreise...
 
Du könntest mit den Penmodes Xor und NotXor arbeiten, allerdings ist das nur bei einfachen Zeichnungen möglich, IMHO aufwendig (immer zusätzlich die letzten Koordinaten usw. speichern) und führt zu Farbverfälschungen.
Steig besser auf Hier im Forum suchenOffScreenBitmaps um, die du vor dem Zeichnen wieder leerst, dann hast du erstens bessere Performance und zweitens eben dein Problem gelöst.

Jarmen_Kell 13. Apr 2005 15:40

Re: problem mit minipaint--->4ecke und kreise...
 
Wenn du's mit den PenModes machen willst, müsste das vom Prinzip her so aussehen:

Delphi-Quellcode:
#####
type
  Tmainform = class(TForm)
    PaintBox:TPaintbox;
    // mehr Kompos dürften hier nich wichtig sein

  private
  mausd:Boolean; // LMB gedrückt?!?
  doing:Integer; // auszuführende Aktion
  current,moused:Tpoint;
  pencolor,brushcolor:Tcolor;
  penstyle:TPenStyle;
  brushstyle:TBrushStyle;
  pensize:Integer;
  pstart,pnow,pdiff:TStatusPanel;
  procedure copyto2; // für undo-Funktion
  procedure imgpaint(mode:TPenmode;x,y:Integer);
  function Randompixels(const x: Integer): Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  mainform: Tmainform;
#####
procedure Tmainform.imgMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

  moused.x:=x;
  moused.y:=y;
  current.x:=x;
  current.y:=y;
  pstart.Text:=inttostr(x) + ', ' + inttostr(y);
  mausd:=true;
  {if doing=1
    then
      with PaintBox.Canvas do
        begin
          Pen.Style:=pssolid;
          Brush.Color:=pencolor;
          Brush.Style:=bssolid;
          Ellipse(round(x-pensize/16),round(y-pensize/16),round(x+pensize/16),round(y+pensize/16));
          resetpen_brush;
        end;
  if doing=6
  then
    begin
      with PaintBox.Canvas do
        begin
          Brush.Style:=bssolid;
          Pen.Color:=brushcolor;
          Pen.Width:=1;
          Rectangle(X-pensize,Y-pensize,X+pensize,Y+pensize);
          resetpen_brush;
        end;
    end;
  PaintBox.Canvas.MoveTo(x,y);} // Das waren jetzt spezielle Sachen in meinem Prog .. nich wichtig
end;

procedure Tmainform.imgpaint(mode:TPenMode;x,y:Integer);
begin
  PaintBox.canvas.Pen.Mode:=mode; // hier wird der PenMode eingestellt.
  case doing of
    2: begin PaintBox.Canvas.MoveTo(moused.X,moused.y); PaintBox.Canvas.LineTo(x,y); end;
    3: PaintBox.Canvas.Rectangle(moused.x,moused.y,x,y);
    4: PaintBox.Canvas.Ellipse(moused.x,moused.y,x,y);
    5: begin
         ledtentertext.Left:=x;
         ledtentertext.Top:=y;
         ledtentertext.Visible:=true;
       end;
    8: begin
         PaintBox.Canvas.Pen.Width:=1;
         PaintBox.Canvas.Pen.Style:=psdot;
         PaintBox.Canvas.Brush.Style:=bsclear;
         PaintBox.Canvas.Rectangle(moused.X,moused.Y,x,y);
         resetpen_brush;
       end;
  end;
end;

procedure Tmainform.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var
  Iairbrush:Integer;
begin
  pnow.Text:=inttostr(x) + ', ' + inttostr(y);
  if mausd
    then
      pdiff.Text:=inttostr(-(moused.x-x)) + ', ' + inttostr(-(moused.y-y)); // Ko-Od-Anzeige
  if (mausd) and (doing=1) // Frei Zeichnen (Stift in M$-Paint)
    then
      begin
        PaintBox.Canvas.MoveTo(current.x,current.y);
        PaintBox.Canvas.LineTo(x,y);

      end;
  if mausd then imgpaint(pmnotxor,current.X,current.Y); // Objekt an alter Pos zeichnen, um es zu entfernen
  current.x:=x; // neue Ko-Od zuweisung
  current.y:=y; // "
  if mausd then imgpaint(pmnotxor,current.x,current.y); // Obejkt an aktueller Pos neu malen
  img.Canvas.Pen.Mode:=pmcopy;
  if (mausd) and (doing=7)
    then
      for Iairbrush:=1 to 5 do
        img.canvas.Pixels[randompixels(x),randompixels(y)]:=pencolor;

end;

procedure Tmainform.imgMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (mausd) and (doing <> 8) then imgpaint(pmcopy,current.x,current.y); // "richtiges" Zeichnen
  mausd:=false;
end;
Ich hab einige unwichtige Sachen rausgenommen und Kommis eingefpgt, und hoff' ma, dass du durchsteigst.

PS: Farbverlust gibt habe ich noch nie bemerkt. Sieht nur etwas merkwürdig beim Zeichnen aus ^^
Hat allerdings den Vorteil, dass man besser sieht, wo man gerade langzeichnet

Khabarakh 13. Apr 2005 16:06

Re: problem mit minipaint--->4ecke und kreise...
 
Zitat:

Zitat von Jarmen_Kell
PS: Farbverlust gibt habe ich noch nie bemerkt. Sieht nur etwas merkwürdig beim Zeichnen aus ^^
Hat allerdings den Vorteil, dass man besser sieht, wo man gerade langzeichnet

Ich habe Farbverfälschung, nicht Farbverlust geschrieben :P .
Aber für Zeichenprogramme ist das wirklich nicht schlecht, ich habe nur an einfache Animationen gedacht.
Bitmaps sind trotzdem sauberer :mrgreen: .

la.ma 14. Apr 2005 14:54

Re: problem mit minipaint--->4ecke und kreise...
 
so, ich habs nu hinbekommen, leider arbeite ich ohne eine paintbox und auch nicht mit delphi 7..

so hier nochmal für die nachwelt:

Delphi-Quellcode:
procedure Tpaint.FormMouseDown (Sender: TObject; Button: TMouseButton;
                                Shift: TShiftState; X, Y: Integer);
 begin
     //Rechteck
     else if BitBtnrechteck.Enabled = False
     then begin

     Mausgedrueckt := True;
        xanfang := x;
        yanfang := y;
        xende := x;
        yende := y;



     end
end;
procedure Tpaint.FormMouseMove (Sender: TObject; Shift: TShiftState;
                                X, Y: Integer);
 begin
       //Rechteck
      if BitBtnrechteck.enabled = false
      then begin
      if MausGedrueckt = true
      then begin
      canvas.pen.mode := pmnotxor;
      canvas.rectangle (xanfang,yanfang,xende,yende);
       canvas.pen.style := psdot;
      canvas.rectangle (xanfang,yanfang,x,y);

      xende := x;
      yende := y;


      end
      end;

end;

procedure Tpaint.FormMouseUp (Sender: TObject; Button: TMouseButton;
                              Shift: TShiftState; X, Y: Integer);
 begin

      //Rechteck
      If Bitbtnrechteck.enabled = false
      then begin
            canvas.pen.mode := pmcopy;
      Canvas.Pen.Style := pssolid ;
      canvas.pen.mode := pmcopy;
      Canvas.Pen.Style := pssolid ;
      xende := x;
      yende := y;
      Canvas.Rectangle(xanfang, yanfang, x, y);

      end;
end;


so viel spaß noch und danke nochmal

Jarmen_Kell 14. Apr 2005 20:33

Re: problem mit minipaint--->4ecke und kreise...
 
@la.ma: Brauch dir doch nicht leid zu tun ;)

@Khabarakh: Jo stimmt schon. Ich bin auch gerade so mehr oder weniger dabei, mein Paint umzubauen und über BMPs laufen zu lassen.
Animationen sind da in der Tat eher weniger relevant ;)
Ich denke, dass es insgesamt ganz gut ist, wenn man so ungefähr anfängt, wie ich das schrieb. Ist ja doch recht simpel und verständlich. Wenn man dann mehr auf Persormance etc. achten, was neues ausprobieren oder soetwas will, kann man's ja noch ändern.
Nur Gott hat gleich perfekt angefangen :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz