Przesuwanie Canvas

0

Witam

Na formie mam komponent TImage o nazwie Image1. Chciałbym na nim rysować linie. Linie rysuję za pomocą Image1.Canvas.MoveTo i Image1.Canvas.LineTo. Tu wszystko jest jeszcze w porządku - udaje się to bez problemu.

Teraz chciałbym jednak dokonać przesunięcia wszystkich linii, które narysowałem np. o 5 do góry i tu zaczynają się schody. Próbuję korzystać z Image1.Top oraz z Image1.Canvas.MoveTo, ale jakoś mi się nie udaje osiągnąć rezultatu - nic się niestety nie przemiesza :/

Czy ktoś z Was wie jak to zrobić? Z góry dzięki za pomoc

0

Canvas.MoveTo(X, Y) - przemieszcza, przemieszcze, tylko nie to, co chcesz :) Przemieszcza pióro (czy jak tam to się nazywa) na punkt (X, Y) i wtedy np. wywołanie Canvas.LineTo(X1, Y1) narysuje linię od punktu (X, Y) do punktu (X1, Y1).

0

No dobrze - skoro nie tak, to jak? Bo mnie nic nie przychodzi do głowy :/

0

Może w taki sposób: jeśli np. o 4 piksele w górę to kopiujesz od 4 piksela w pionie i rysujesz w miejsce 1 (np. CopyRect() czy coś takiego). Może się zrozumiale wyraziłem :)

0
pitbull82 napisał(a)

Próbuję korzystać z Image1.Top oraz z Image1.Canvas.MoveTo, ale jakoś mi się nie udaje osiągnąć rezultatu - nic się niestety nie przemiesza

Pytanie zasadnicze: chcesz przesunąć kontrolke TImage czy tylko linie które narysowałeś w niej?

0

Zupełnie obojętne, bo TImage utworzyłem tylko, żeby narysować na nim linie...

Udało mi się znaleźć częściowe rozwiązanie - linie się już scrollują, ale kiedy wyjdą poza ekran i staram się żeby powróciły, to wracają już niektóre "rozmazane", zniekształcone itd.

Przesuwanie wszystkiego w Lewo wygląda u mnie tak:

 
Image1.Left:=Image1.Left-przesuniecie;

obszar1:=Rect(Image1.Left-przesuniecie,Image1.Top,Image1.Width-przesuniecie,Image1.Height);
obszar2:=Rect(Image1.Left,Image1.Top,Image1.Width,Image1.Height);
Image1.Canvas.CopyRect(obszar1,Image1.Canvas,obszar2);

Nie wiem jednak co jest nie tak, że powstaje ten problem z rozmazywaniem..

0

Ten pomysł z kopiowaniem jest jakiś dziwny :| no chyba, że czegoś nie skumałem :P.

0

No może i jest, ale częściowo działa, a nie znam żadnego innego. Może ktoś poświęci chwilę czasu i pomoże mi to rozwiązać? :)

// edit - siedze nad Delphi od 8 rano aż do teraz i jestem wykończony :(

0

Po prostu wszystkie linie od nowa narysuj tyle, że odpowiednio przesunięte.

0

Hmmm. To rozwiązanie raczej odpada, bo linie są rysowane dynamicznie na podstawie dynamicznie tworzonych Labeli i tak trzeba by było wszystko obliczać od nowa (labele przesuwam sobie odwołując się do tablicy Components za pomocą label.left - szkoda że nie ma takiej tabeli dla poszczególnych linii które się rysuje na Canvas :/ ).

W ostateczności może tak zrobię, ale na pewno nie będzie to wydajne rozwiązanie, dlatego wolałbym coś lepszego....

0
pitbull82 napisał(a)

Hmmm. To rozwiązanie raczej odpada, bo linie są rysowane dynamicznie na podstawie dynamicznie tworzonych Labeli i tak trzeba by było wszystko obliczać od nowa (labele przesuwam sobie odwołując się do tablicy Components za pomocą label.left [...]
to zmień np. na label.left-4 i już masz przesunięcie o 4 w lewo.

0

? Labele to ja przesuwać umiem. Nie wiem tylko jak z liniami na Canvas i o to cały czas się rozchodzi...

0

Hmmm. To rozwiązanie raczej odpada, bo linie są rysowane dynamicznie na podstawie dynamicznie tworzonych Labeli i tak trzeba by było wszystko obliczać od nowa

No i co z tego, że trzeba obliczać od nowa? Ty mylisz komponent/kontrolkę z rysunkiem (a dokładnie z liniami).

[...] labele przesuwam sobie odwołując się do tablicy Components za pomocą label.left

A jak myślisz co się dzieje jak przesuwasz kontrolkę? Też jest od nowa rysowana tyle, że w nowej pozycji.

[...] szkoda że nie ma takiej tabeli dla poszczególnych linii które się rysuje na Canvas

To ją zrób ;)

[...] ale na pewno nie będzie to wydajne rozwiązanie...

Wierz mi, bardziej złożone rzeczy są w ten sposób rysowane ;).

0
pitbull82 napisał(a)

? Labele to ja przesuwać umiem. Nie wiem tylko jak z liniami na Canvas i o to cały czas się rozchodzi...

Nie mówię o przesuwaniu labeli. Skoro w pętli bierzesz label.left i na tej podstawie rysujesz linie, to weź zamiast tego label.left+x i będziesz miał przesunięcie linii o x.

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