Odświeżanie canvasa

0
var
  prostokat: TRect;
begin
  Canvas.Handle:=GetWindowDC(GetDesktopWindow);
  prostokat:=Rect(x,y,x+20,y+20); {x i y to współrzędne kursora myszy}
  Canvas.Brush.Color:=clLime;
  // TU MUSI BYĆ FUNKCJA USUWAJĄCA POPRZEDNI PROSTOKĄT
  Canvas.FrameRect(prostokat);
end;

Ta bardziej istotna część programu. Chodzi mi tak jak napisałem w komentarzu w programie o funkcje która będzie czyścić Canvas. (Czyścić nie zamalowywać na jakiś kolor). W takiej formie program zaznacza pozycje kursora poprawnie lecz pozostawia za sobą ciąg kwadratów.
Będę bardzo wdzięczny za pomoc :d

0
Canvas.Refresh;
0

Gdyby to było takie proste hehe

procedure TForm1.Timer1Timer(Sender: TObject);
var
  MousePos: TPoint;
  x,y:integer;
  prostokat: TRect;
begin
  GetCursorPos(MousePos);
  x:= MousePos.X ;
  y:= MousePos.Y ;

  Canvas.Handle:=GetWindowDC(GetDesktopWindow);
  prostokat:=Rect(x,y,x+20,y+20);
  Canvas.Brush.Color:=clLime;

  Canvas.FrameRect(prostokat);
end;

wrzucam cały kod z timera niestety canvas.refresh nie działa

0
var
  MousePos: TPoint;
  x,y:integer;
  prostokat: TRect;
begin
  GetCursorPos(MousePos);
  x:= MousePos.X;
  y:= MousePos.Y;

  Canvas.Handle := GetWindowDC(GetDesktopWindow);
  prostokat:=Rect(x,y,x+20,y+20);
  Canvas.Brush.Color:=clLime;
  Canvas.FrameRect(prostokat);

  invalidate;
end;

źródło: Misiekd

0

Niestety nie działa :/

0

tzn dziala tylko dla formy programu, na pulpicie i innych programach wciaz pozostaja slady

0

To może zadelaruj golbalną Bitmape, i włóż do niej screena pulpitu a potem z niej wczytuj przez

Canvas.Draw(0, 0, MojaBitmapa);
0

Nie moge na screenie tego zrobic niestety :/
Ogolnie dzialanie tego programu ma wygladac mniej wiecej tak ze program ma sledzic polozenie bialej bili na stole bilardowej (w gdze on-line ) i chcialem zrobic do tego obrys bili kwadratem, dlatego to wszystko musi byc dynamiczne wiec screen odpada :/
P.S. moze macie inne pomysly na zrobienie obrysu ?

naprawdę nikt nie ma pomysłu ?

0

Daj tryb xor białym kolorem, rysujesz kwadrat dwukrotnie i on znika.

0

można trochę jaśniej

0

google + xor :p

0

qwert wiem co to jest XOR ale nie czaje w jaki sposób to mam zastosować do malowania prostokąta

0

TPen.Mode

0
seba napisał(a)

tzn dziala tylko dla formy programu, na pulpicie i innych programach wciaz pozostaja slady

jest taka windowsowa funkcja InvalidateRect();

0

_13th_Dragon dzięki za wskazówki :D
Oto co udalo mi sie osiagnac

 procedure TForm1.Draw;
begin
  Canvas.Handle := GetWindowDC(GetDesktopWindow);
  with Canvas do begin
    Brush.Style := bsClear;
    Pen.Mode := pmNotXOR;
    Pen.Color := clLime;
    Rectangle(Pos.X, Pos.Y, Pos.X+20, Pos.Y+20);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  MousePos: TPoint;
begin
  GetCursorPos(MousePos);
  Draw;
  Pos := MousePos;
  Draw;
end;

I jeszcze jedno pytanie wszystko działa w porządku ale na ekranie pojawia się kwadrat o współrzędnej [0,0] który nie znika. Może ktoś wie która częśc kodu jest odpowiedzialna za to ?

0
  GetCursorPos(MousePos);
  Draw;
  Pos := MousePos;
  Draw;

Przy wykonywaniu pierwszego Draw() -> Pos jest równe 0,0
Przesuń Pos przed Draw()

  GetCursorPos(MousePos);
  Pos := MousePos;
  Draw;
  Draw;
0

to ze na poczatku jest rowne 00 wiem
i ze ta zmiana probowalem inne kombinacje tez sprawdzilem ale nie w tym rzecz

0

Właśnie o to chodzi, żeby tego pierwszego prostokąta nie rysować.

procedure TForm1.Draw;
begin
  if (Pos.x=0) and (Pos.y=0) then Exit;
...
0

ok dziala dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1