Canvas(Line?)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

Привет всем!
Возникла вот проблема:
мне необходимо рисовать на форме линию(допустим соединить 2 объекта).
Пробовал , но если свернуть окно а потом его восстановить все нарисованые линии ичезают. Как этого избежать?

Код: Выделить всё

procedure Form1OnMouseDown()
Canvas.MoveTo(X,Y);
:
:
proceduer Form1OnMouseUp()
Canvas.LineTo(X,Y);
:
:?
Ы!
OTELLO
Сообщения: 59
Зарегистрирован: 11 дек 2004, 11:52
Откуда: Питеррр
Контактная информация:

Сунуть в onShow, onResize и onPaint вызов твоей процедуры рисования, и все=)

P.S. Тока вот насчет onPaint не уверен,проверь сам в каком случае он работает

P.S.S. Кстати ещё мона рисовать средствами OpenGL или DirectX, тама спецметоды есть для сохранения рисунков,но все равно даже и эти методы вызываются в тех обработчиках, о которых я писал выше...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

eagle_ua, линия также будет пропадать не только при сворачивании, а и при перекрывании Вашего окна чужим. Т.е. Вы рисуете линию только на клик мыши, а надо ее ДОПОЛНИТЕЛЬНО перерисовывать всякий раз, когда операционной системе захочется перерисовать ваше окно или его часть.
Итак на клик мыши надо не только нарисовать, но и запомнить координаты линии в каком-нибудь списке или массиве. А в OnPaint перерисовывать все линии из списка (массива). Причем достаточно только в OnPaint!

Дополнительно посмотрите функции WinAPI для работы с WMF (Windows Metafile). Есть функции редактирования метафайлов. Они позволяют редактировать WMF. А отображение и перерисовка WMF реализованы в Windows. Следовательно, достаточно будет только добавить новую линию на рисунок и забыть о ней.
Можно воспользоваться TPicture для создания векторного (будьте внимательны, там можно и растровые, но Вам нужны векторные) изображения. Многие функции WinAPI вызываются методами TPicture. Чего не хватает сделайте с помощью WinAPI.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Код: Выделить всё

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]
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

Спасибо за советы, заработало(я для пробы сделал для одной линии). Но только вот рисую то я не одну линию. Я заношу координаты начала и конца всех линий в массивы, но в 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;


Ы!
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

Всё заработало, нодо было только в Form.Create() написать

Код: Выделить всё

 AlphaBlend:=true;
Правда нахрена - фуй его знает!!!!!! :D
Ы!
Ответить