Как лучше рисовать на форме?
От: ZayatsZ Россия  
Дата: 05.05.05 02:48
Оценка:
Собственно, сабж. Прямо на её канвасе? Или бросить на неё TPanel и рисовать на нём? Или лучше бросить на форму TImage? Поделитесь опытом, кто такое делал. Какие плюсы и минусы в каждом из вариантов?
... << RSDN@Home 1.1.4 beta 6a rev. 443>>
Re: Как лучше рисовать на форме?
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 05:33
Оценка:
Здравствуйте, ZayatsZ, Вы писали:

ZZ>Прямо на её канвасе?


Самый скоростной вариант, но придется запихнуть прорисовку в OnPaint.

ZZ>Или бросить на неё TPanel и рисовать на нём?


На панели рисовать не совсем просто, т.к. у нее нет public-свойства Canvas

ZZ>Или лучше бросить на форму TImage?


В большинстве случаев так и делают, в зависимости от того, что ты понимаешь под словом "рисовать".
Но это самый тормозной способ. Лучше использовать TPaintBox.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[2]: Как лучше рисовать на форме?
От: ZayatsZ Россия  
Дата: 05.05.05 05:55
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, ZayatsZ, Вы писали:


ZZ>>Прямо на её канвасе?

K>Самый скоростной вариант, но придется запихнуть прорисовку в OnPaint.

ZZ>>Или бросить на неё TPanel и рисовать на нём?

K>На панели рисовать не совсем просто, т.к. у нее нет public-свойства Canvas
действительно, упустил

ZZ>>Или лучше бросить на форму TImage?

K>В большинстве случаев так и делают, в зависимости от того, что ты понимаешь под словом "рисовать".
отрисовывать тайловое игровое поле

K>Но это самый тормозной способ. Лучше использовать TPaintBox.

так чем это отличается от отрисовки прямо на форме? Отрисовку ведь тоже надо в OnPaint запихивать!
... << RSDN@Home 1.1.4 beta 6a rev. 443>>
Re: Как лучше рисовать на форме?
От: Rusland  
Дата: 05.05.05 06:08
Оценка:
Здравствуйте, ZayatsZ, Вы писали:

ZZ>Собственно, сабж. Прямо на её канвасе? Или бросить на неё TPanel и рисовать на нём? Или лучше бросить на форму TImage? Поделитесь опытом, кто такое делал. Какие плюсы и минусы в каждом из вариантов?


Лучше постараться избежать использование TImage, очень уж он тормозной. Я обычно рисую прямо на канве формы
Re[3]: Как лучше рисовать на форме?
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 06:10
Оценка:
Здравствуйте, ZayatsZ, Вы писали:

K>>в зависимости от того, что ты понимаешь под словом "рисовать".

ZZ>отрисовывать тайловое игровое поле

А на поле небось спрайты
Лучше возьми специально заточенную для этого библиотеку, используй DirectDraw или GL. Библиотек таких море.

K>>Но это самый тормозной способ. Лучше использовать TPaintBox.

ZZ>так чем это отличается от отрисовки прямо на форме? Отрисовку ведь тоже надо в OnPaint запихивать!

Не могу сказать Я PaintBox не пользовал уже несколько лет. На первый взгляд ничем не отличается.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[4]: Как лучше рисовать на форме?
От: ZayatsZ Россия  
Дата: 05.05.05 06:20
Оценка:
Здравствуйте, kavlad, Вы писали:

K>А на поле небось спрайты

K>Лучше возьми специально заточенную для этого библиотеку, используй DirectDraw или GL. Библиотек таких море.
графика не настолько сложная, чтобы использовать "тяжеловесов". Спрайты — да, но простенькие.

K>Не могу сказать Я PaintBox не пользовал уже несколько лет. На первый взгляд ничем не отличается.

Спасибо! Значит PaintBox к терапевту
... << RSDN@Home 1.1.4 beta 6a rev. 443>>
Re[2]: Как лучше рисовать на форме?
От: ZayatsZ Россия  
Дата: 05.05.05 06:20
Оценка:
Здравствуйте, Rusland, Вы писали:

R>Лучше постараться избежать использование TImage, очень уж он тормозной. Я обычно рисую прямо на канве формы

Насчет TImage — это я уже понял, особенно когда начал в рантайме изменять размер формы

Всем спасибо, буду прямо на канвасе рисовать.
... << RSDN@Home 1.1.4 beta 6a rev. 443>>
Re[2]: Как лучше рисовать на форме?
От: FRAGman Россия  
Дата: 05.05.05 09:59
Оценка: +1
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, ZayatsZ, Вы писали:


ZZ>>Прямо на её канвасе?


K>Самый скоростной вариант, но придется запихнуть прорисовку в OnPaint.


Это далеко не самый скоростной вариант. Самый скоростной — это перехватывать сообщение WM_PAINT, в нем создавать compatibledc и compatiblebitmap, на них рисовать и потом на DC формы уже BitBlt.
Вот это уже будет скоростной вариант (и то наверняка не самый), конечно без использования сторонних компонент и вообще VCL контейнеров типа Timage и TpaintBox. Выглядеть это будет примерно так:

в декларации класса формы

private
    procedure OnCustomPaint(var Msg: TWMPaint); message WM_PAINT;


в обработчике события

procedure TForm1.OnCustomPaint(var Msg: TWMPaint);
var
  DC:HDC;
  BDC:HDC;
  bitm:HBITMAP;
  ps: PAINTSTRUCT;
begin
  DC := BeginPaint(Handle,ps);
  // создаем в памяти контекст и битмап
  BDC := CreateCompatibleDC(DC);
  bitm := CreateCompatibleBitmap(DC,Width,Height);
  SelectObject(BDC,bitm);

  //
  // тут собственно все рисуется, cоответственно на BDC, т.е. в памяти
  //

  // то что нарисовали кидаем на исходный DC
  Bitblt(DC,0,0,Width,Height,BDC,0,0,SRCCOPY);
  // чистим мусор и заканчиваем рисование
  DeleteObject(bitm);
  DeleteDC(BDC);
  EndPaint(Handle,ps);
  Msg.Result := 0;
end;


Еще при таком способе рисования можно анализировать и отрисовывать только изменившуюся часть окна (в структуре PS хранится RECT), что еще более существенно повысит скорость работы
---------------------------------------------------
May the source be with you, stranger ;)
Re[3]: Как лучше рисовать на форме?
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 10:19
Оценка:
Здравствуйте, FRAGman, Вы писали:

Собственно TForm так и работает между прочим — идет отрисовка в памяти ( и в OnPaint тоже ) при установке свойства DoubleBuffered в True.

FRA>Еще при таком способе рисования можно анализировать и отрисовывать только изменившуюся часть окна (в структуре PS хранится RECT), что еще более существенно повысит скорость работы


Вот этого дельфевая форма не делает
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[3]: Как лучше рисовать на форме?
От: softland Россия  
Дата: 05.05.05 10:28
Оценка:
Здравствуйте, ZayatsZ, Вы писали:

ZZ>Здравствуйте, Rusland, Вы писали:


R>>Лучше постараться избежать использование TImage, очень уж он тормозной. Я обычно рисую прямо на канве формы

ZZ>Насчет TImage — это я уже понял, особенно когда начал в рантайме изменять размер формы

ZZ>Всем спасибо, буду прямо на канвасе рисовать.

IMHO надо отнаследовать от TCustomControl свой класс и заточить его для своих нужд, можно посмотреть исходник TPaintBox.
Ведь потом скроллинг надо будет делать и т.д. всё делать в модуле формы не правильно .
ООП лучше использовать
Re[4]: Как лучше рисовать на форме?
От: FRAGman Россия  
Дата: 05.05.05 11:02
Оценка:
K>Собственно TForm так и работает между прочим — идет отрисовка в памяти ( и в OnPaint тоже ) при установке свойства DoubleBuffered в True.

Ну уж если на то пошло, то это делает не TForm, а любой наследник TWinControl, коим TForm как раз и является. И делает он это с генерацией WM_ERASEBKGND, что создает доп. мерцание и далеко не всегда нужно. При этом еще вызывается куча всяких проверок на включенность тем и т.п. Так что если нужна скорость, ИМХО лучше делать все самому...

K>Вот этого дельфевая форма не делает

Это точно! Вот поэтому я обычно делаю свой обработчик... Например для скинованных форм сложной структуры это очень актуально... Да и для анимации без промаргивания тоже...

Ну и вообще я чего-то последнее время на GDI+ подсел... Особливо после того как мне в одном проекте пришлось активно работать с прозрачностью и антиалайзингом
---------------------------------------------------
May the source be with you, stranger ;)
Re[2]: Как лучше рисовать на форме?
От: tinytjan  
Дата: 05.05.05 12:53
Оценка:
Здравствуйте, Rusland, Вы писали:

R>Здравствуйте, ZayatsZ, Вы писали:


ZZ>>Собственно, сабж. Прямо на её канвасе? Или бросить на неё TPanel и рисовать на нём? Или лучше бросить на форму TImage? Поделитесь опытом, кто такое делал. Какие плюсы и минусы в каждом из вариантов?


R>Лучше постараться избежать использование TImage, очень уж он тормозной. Я обычно рисую прямо на канве формы


Имхо, канва тормознее.
TImage рулит, тем более у нее есть поле Битмап, у которого есть процедура ScanLine.
У такого подхода есть свои недостатки, но их всегда можно обойти.
Тем более что у канвы еще с перерисовкой мучаться.
Re[5]: Как лучше рисовать на форме?
От: Jack128  
Дата: 06.05.05 14:14
Оценка: 1 (1)
Здравствуйте, ZayatsZ, Вы писали:

ZZ>Здравствуйте, kavlad, Вы писали:


K>>А на поле небось спрайты

K>>Лучше возьми специально заточенную для этого библиотеку, используй DirectDraw или GL. Библиотек таких море.
ZZ>графика не настолько сложная, чтобы использовать "тяжеловесов". Спрайты — да, но простенькие.

K>>Не могу сказать Я PaintBox не пользовал уже несколько лет. На первый взгляд ничем не отличается.

ZZ>Спасибо! Значит PaintBox к терапевту
PaintBox отличается от Form, что это другой контрол. Ты его можешь пемещать по форме, и от этого алгоритм рисования никак не измениться.
И потом, если ты захочишь например обрабатывать клики мыши на своем рисунке, то если ты используюшь канву формы напрямую, то те придется проверять попал ли юзер на рисунок или нет. То же самое для Drag&Drop'a и тд..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.