Šta je novo?

DELPHI problem

  • Začetnik teme Začetnik teme SINTER
  • Datum pokretanja Datum pokretanja

SINTER

Čuven
Učlanjen(a)
02.06.2004
Poruke
765
Poena
630
u pitanju je domaci iz informatike,tako da ne verujem da ce iskusnijima biti problem.
naime,treba da napravim aplikaciju koja ce imati slicnu funkciju kao paint,odnosno cisto crtanje po canvasu.
e sada,naravno ne trazim da mi pravite ceo program,nego samo ne znam kako da programu predstavim tacane kordinate na koje je mis u trenutku klika usmeren.ne verujem da je to vise od jedne linije koda,tako da vama to sigurno nije problem.
valjda je neko shvatio ovo moje lupetanje...
hvala
 
Primer: hoćeš da napraviš da se linija crta tako što klikneš (za početnu tačku), povučeš do krajnje i otpustiš levi taster.
U tom slučaju, trebaju ti dve globalne promenljive, recimo

Kod:
var
  OldX, OldY: Integer;

Dalje, za OnMouseDown event slike po kojoj crtaš, napraviš sledeću proceduru:

Kod:
If Button = mbLeft then
begin
  OldX := X;
  OldY := Y;
end;

a za OnMouseUp staviš:

Kod:
If Button = mbLeft then
begin
  Image.Canvas.MoveTo(OldX, OldY);
  Image.Canvas.LineTo(X, Y);
end;

Alternativno možeš odmah da uradiš MoveTo pri MouseDown bez dodatnog pamćenja koordinata (mada tu može biti problem ako MouseDown nije urađen iznad slike), a možeš i da kombinuješ pa da dobiješ ono kao što je crtanje poligona u paintu, da se svakim klikom poveže trenutna tačka sa prethodnom.
 
Poslednja izmena:
samo ima jos jedan problem.meni valjda treba da omogucim i crtanje krivih.odnosno da se crta pri pokretu misa.
e sada tu bih koristio mousemove u kombinaciji sa onmousedown i onmouseup.
sve radi,samo sto pri brzem pokrentanju misa dobijam veliki razmak izmedju obojenih pixela.

evo kako sam ja uradio.

Kod:
var
  Form1: TForm1;
  p:integer;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
p:=1;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
p:=0;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if p=1 then
form1.Canvas.Pixels[x,y]:=clblack;
end;

end.

e sada,da li je uopste moguce napraviti nesto slicno onome u paintu,odnosno da se i pri najbrzem pokretanju misa svi pixeli oboju u zadatu boju,ili da samo ostavim ovako.
i da li imate neki bolji predlog od ovoga sto sam ja uradio.
 
Može lako, stvar je u tome što ne treba da crtaš tačku pri svakom pomeraju, nego da svaku novu koordinatu povežeš preko LineTo sa starom.

Znači ovako:

Kod:
var
  Form1: TForm1;
  FreeDraw: Boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Canvas.Create;
  FreeDraw := False;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FreeDraw := True;
  Image1.Canvas.MoveTo(X, Y);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  if FreeDraw then Image1.Canvas.LineTo(X, Y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FreeDraw := False;
end;

end.
 
Nazad
Vrh Dno