Registriert seit: 17. Mär 2005
188 Beiträge
|
Re: problem mit minipaint--->4ecke und kreise...
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
|