Страница 1 из 1
Canvas(Line?)
Добавлено: 12 дек 2005, 21:12
eagle_ua
Привет всем!
Возникла вот проблема:
мне необходимо рисовать на форме линию(допустим соединить 2 объекта).
Пробовал , но если свернуть окно а потом его восстановить все нарисованые линии ичезают. Как этого избежать?
Код: Выделить всё
procedure Form1OnMouseDown()
Canvas.MoveTo(X,Y);
:
:
proceduer Form1OnMouseUp()
Canvas.LineTo(X,Y);
:
:?
Добавлено: 12 дек 2005, 22:16
OTELLO
Сунуть в onShow, onResize и onPaint вызов твоей процедуры рисования, и все=)
P.S. Тока вот насчет onPaint не уверен,проверь сам в каком случае он работает
P.S.S. Кстати ещё мона рисовать средствами OpenGL или DirectX, тама спецметоды есть для сохранения рисунков,но все равно даже и эти методы вызываются в тех обработчиках, о которых я писал выше...
Добавлено: 13 дек 2005, 04:58
Naeel Maqsudov
eagle_ua, линия также будет пропадать не только при сворачивании, а и при перекрывании Вашего окна чужим. Т.е. Вы рисуете линию только на клик мыши, а надо ее ДОПОЛНИТЕЛЬНО перерисовывать всякий раз, когда операционной системе захочется перерисовать ваше окно или его часть.
Итак на клик мыши надо не только нарисовать, но и запомнить координаты линии в каком-нибудь списке или массиве. А в OnPaint перерисовывать все линии из списка (массива). Причем достаточно только в OnPaint!
Дополнительно посмотрите функции WinAPI для работы с WMF (Windows Metafile). Есть функции редактирования метафайлов. Они позволяют редактировать WMF. А отображение и перерисовка WMF реализованы в Windows. Следовательно, достаточно будет только добавить новую линию на рисунок и забыть о ней.
Можно воспользоваться TPicture для создания векторного (будьте внимательны, там можно и растровые, но Вам нужны векторные) изображения. Многие функции WinAPI вызываются методами TPicture. Чего не хватает сделайте с помощью WinAPI.
Добавлено: 13 дек 2005, 11:26
Duncon
Код: Выделить всё
procedure DrawLine(APoint1, APoint2: TPoint; ACanvas: TCanvas);
var
Lpixel, LMaxAxisLength: integer;
LRatio: Real;
begin
LMaxAxisLength := Max(abs(APoint1.X - APoint2.X), abs(APoint1.Y - APoint2.Y));
for Lpixel := 0 to LMaxAxisLength do
begin
LRatio := Lpixel / LMaxAxisLength;
ACanvas.Pixels[APoint1.X + Round((APoint2.X - APoint1.X) * LRatio),
APoint1.Y + Round((APoint2.Y - APoint1.Y) * LRatio)] :=
ACanvas.Pen.Color;
end;
end;
[/color]
Добавлено: 17 дек 2005, 18:26
eagle_ua
Спасибо за советы, заработало(я для пробы сделал для одной линии). Но только вот рисую то я не одну линию. Я заношу координаты начала и конца всех линий в массивы, но в OnPaint что-то не выходит к ним обратиться. Помогите кто чем может. :?
Код: Выделить всё
var
masX,masY,masX1,masY1:array of Integer;
Form1: TForm1;
BegLine,EndLine:integer;
countX,countY,countX1,countY1:byte;
:
:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inc(countX,countY);
if (countX=0) and (countY=0) then
begin
SetLength(masX,100);
SetLength(masY,100);
end;
masX[countX]:=x;
masY[countY]:=y;
Canvas.MoveTo(masX[countX],masY[countY]);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inc(countX1,countY1);
if (countX1=0) and (countY1=0) then
begin
SetLength(masX1,100);
SetLength(masY1,100);
end;
masX1[countX1]:=x;
masY1[countY1]:=y;
Canvas.LineTo(masX1[countX1],masY1[countY1]);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
i:integer;
begin
for i:=1 to masY1[countY1] do
begin
Canvas.MoveTo(masX[countX],masY[countY]);
Canvas.LineTo(masX1[countX1],masY1[countY1]);
end;
end;
Добавлено: 18 дек 2005, 20:50
eagle_ua
Всё заработало, нодо было только в Form.Create() написать
Правда нахрена - фуй его знает!!!!!!
