![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование на панели
ssmaxx © (2005-04-03 12:09:00)Добрый день. У меня такая проблемка: рисую на панели что-либо: PolyGon(DC,PointsKE41,4). Но при попытке программно подвинуть эту панель на форме (т.е. Panel.Left:=Panel.Left+20) изображение пропадает, остается только белый фон. Не подскажете, отчего это происходит? Заранее благодарен.
жаба недоросток (2005-04-28 10:35:00) [1]при создании рисунка, рисуй его в БитМапе, а на панель просто копируй его. при скролинге - просто смещай.
вторая панель в принципе не нужна. лучше скролбар свой кинь.
alpet (2005-04-04 18:56:00) [2]С такой задачей тебе в любом случае надо:
1. Создавать MemoryDC иначе говоря буффер
2. Готовится к медленному выполнению кода - 100тыс. не мало для GDI. Лучше поискать пути оптимизации...
+ Использовать функции GdiSetBatchLimit и GdiFlush
У (2005-04-03 23:31:00) [3]Image перекрывает Canvas
Нужно использовать inherited Canvas (из наследника Image)
или, если извне, то
type
THackGraphicControl = class(TGraphicControl);
THackGraphicControl(Image).Canvas
Kind (2005-04-03 17:24:00) [4]Почему-то не работает. То получается белый фон, то вообще ничего не происходит (только вместо Image1.Canvas.Handle стоит переменная DC, которая определена ранее как DC:=GetDC(Image1.Canvas.Handle) но это, мо-моему, одно и то же).
Вот по-этому и не работает! Image1.Canvas.Handle - это уже готовый DC, в который и нужно рисовать.
Я попробовал, и у меня вывод 100000 полигонов в Image происходит чуть-чуть быстрее чем на Panel.
ssmaxx (2005-04-03 16:05:00) [5]У меня есть база данных элементов (по 4 2Dкоординаты точек на каждый). Это и есть замкнутые линии. Мне необходимо с заданным масштабом прорисовать их. Я делаю это так: на форму кидаю Panel1. На Panel1 кидаю Panel2. В программе по масштабу определяю размер будущего изображения, и делаю таким размер Panel2. Потом на ней рисую изображение (PolyGon(DC,PointsKE41,4) 100 тысяч раз). Если размер Panel2 больше размера Panel1, то появляются ScrollBar-ы, которые дают возможность передвигать Panel2 внутри Panel1 (это попытка сделать примерно то же, что и в Paint-е). Вот при этом передвижении и пропадает изображение. Если делать постоянную перерисовку изображения, то программа начинает "тормозить".
Piter (2005-04-03 15:54:00) [6]ssmaxx (03.04.05 15:32) [6]
100000 замкнутых линий
хм, что-то ты не так делаешь. 100 тысяч линий - это уже перебор.
ssmaxx (2005-04-03 15:32:00) [7]
> Хотя я не понимаю всё таки почему у тебя Panel рисуется
> быстрее чем Image?
Тестировал. 100000 замкнутых линий рисовал с помощью Image.Canvas.PolyLine и с помощью Polygon(Panel1.Handle,...). В первом случае 32 сек, во втором 2 сек.
> А какого размера у тебя изображение?
У меня не изображение, а огромный массив замкнутых линий, который иногда меняется, и его надо перерисовывать а изображение (в смысле размеры) зависит от выставленного масштаба, но оно маленькое.
> Не понял что-то ... Так разве не работает -
> PolyGon(Image1.Canvas.Handle,PointsKE41,4)
Почему-то не работает. То получается белый фон, то вообще ничего не происходит (только вместо Image1.Canvas.Handle стоит переменная DC, которая определена ранее как DC:=GetDC(Image1.Canvas.Handle) но это, мо-моему, одно и то же).
Kind (2005-04-03 14:14:00) [8]На Image программа вобще игнорирует команды рисования (в смысле, команды API).
Не понял что-то ... Так разве не работает -
PolyGon(Image1.Canvas.Handle,PointsKE41,4)
А перерисовка занимает довольно длительное время (примерно 2 секунды).
А какого размера у тебя изображение?
Так без повторной перерисовки всего изображения не обойтись? Или можно нарисовать на чем-либо временном, а при перемещении панели быстро обновлять изображение?
Всё зависит от поставленной тобой задачей. Перехватывай сообщение о перерисовки Panel-и и рисуй там, как сказал Piter ©.
Хотя я не понимаю всё таки почему у тебя Panel рисуется быстрее чем Image?
Piter (2005-04-03 13:44:00) [9]ssmaxx (03.04.05 12:49) [3]
Или можно нарисовать на чем-либо временном
наверное, можно. Ведь есть там функция копирования области изображения...
В общем, это уже технология - как сделать быстро.
Но по моему скромному опыту даже если перерисовывать и там не особо сложные рисунки - то ничего не тормозит...
ssmaxx (2005-04-03 12:49:00) [10]На Image программа вобще игнорирует команды рисования (в смысле, команды API). А перерисовка занимает довольно длительное время (примерно 2 секунды). Именно поэтому я отказался от рисования через Canvas (так ререрисовка занимает примерно 6 секунд). Так без повторной перерисовки всего изображения не обойтись? Или можно нарисовать на чем-либо временном, а при перемещении панели быстро обновлять изображение?
Kind (2005-04-03 12:43:00) [11]Потому что Windows так устроен :)
Всегда всё надо перерисовывать. Тебе обязательно на Panel-и рисовать? Используй Image, с ним проще будет.
Piter (2005-04-03 12:38:00) [12]ssmaxx (03.04.05 12:09)
Не подскажете, отчего это происходит?
вероятно, от того, что панель надо перерисовать после сдвига.
Обрабатывай сообщение WM_PAINT (у панели должно быть событие типа OnPaint)