Einzelnen Beitrag anzeigen

Jarmen_Kell

Registriert seit: 17. Mär 2005
188 Beiträge
 
#3

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

  Alt 13. Apr 2005, 16:40
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
  Mit Zitat antworten Zitat