Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Рисование на панели   Найти похожие ветки 

 
ssmaxx   (2005-04-03 12:09) [0]

Добрый день. У меня такая проблемка: рисую на панели что-либо: PolyGon(DC,PointsKE41,4). Но при попытке программно подвинуть эту панель на форме (т.е. Panel.Left:=Panel.Left+20) изображение пропадает, остается только белый фон. Не подскажете, отчего это происходит? Заранее благодарен.


 
Piter ©   (2005-04-03 12:38) [1]

ssmaxx   (03.04.05 12:09)
Не подскажете, отчего это происходит?


вероятно, от того, что панель надо перерисовать после сдвига.
Обрабатывай сообщение WM_PAINT (у панели должно быть событие типа OnPaint)


 
Kind ©   (2005-04-03 12:43) [2]

Потому что Windows так устроен :)
Всегда всё надо перерисовывать. Тебе обязательно на Panel-и рисовать? Используй Image, с ним проще будет.


 
ssmaxx   (2005-04-03 12:49) [3]

На Image программа вобще игнорирует команды рисования (в смысле, команды API). А перерисовка занимает довольно длительное время (примерно 2 секунды). Именно поэтому я отказался от рисования через Canvas (так ререрисовка занимает примерно 6 секунд). Так без повторной перерисовки всего изображения не обойтись? Или можно нарисовать на чем-либо временном, а при перемещении панели быстро обновлять изображение?


 
Piter ©   (2005-04-03 13:44) [4]

ssmaxx   (03.04.05 12:49) [3]
Или можно нарисовать на чем-либо временном


наверное, можно. Ведь есть там функция копирования области изображения...
В общем, это уже технология - как сделать быстро.

Но по моему скромному опыту даже если перерисовывать и там не особо сложные рисунки - то ничего не тормозит...


 
Kind ©   (2005-04-03 14:14) [5]

На Image программа вобще игнорирует команды рисования (в смысле, команды API).

Не понял что-то ... Так разве не работает -
PolyGon(Image1.Canvas.Handle,PointsKE41,4)

А перерисовка занимает довольно длительное время (примерно 2 секунды).

А какого размера у тебя изображение?

Так без повторной перерисовки всего изображения не обойтись? Или можно нарисовать на чем-либо временном, а при перемещении панели быстро обновлять изображение?

Всё зависит от поставленной тобой задачей. Перехватывай сообщение о перерисовки Panel-и и рисуй там, как сказал Piter ©.
Хотя я не понимаю всё таки почему у тебя Panel рисуется быстрее чем Image?


 
ssmaxx   (2005-04-03 15:32) [6]


> Хотя я не понимаю всё таки почему у тебя 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) но это, мо-моему, одно и то же).


 
Piter ©   (2005-04-03 15:54) [7]

ssmaxx   (03.04.05 15:32) [6]
100000 замкнутых линий


хм, что-то ты не так делаешь. 100 тысяч линий - это уже перебор.


 
ssmaxx   (2005-04-03 16:05) [8]

У меня есть база данных элементов (по 4 2Dкоординаты точек на каждый). Это и есть замкнутые линии. Мне необходимо с заданным масштабом прорисовать их. Я делаю это так: на форму кидаю Panel1. На Panel1 кидаю Panel2. В программе по масштабу определяю размер будущего изображения, и делаю таким размер Panel2. Потом на ней рисую изображение (PolyGon(DC,PointsKE41,4) 100 тысяч раз). Если размер Panel2 больше размера Panel1, то появляются ScrollBar-ы, которые дают возможность передвигать Panel2 внутри Panel1 (это попытка сделать примерно то же, что и в Paint-е). Вот при этом передвижении и пропадает изображение. Если делать постоянную перерисовку изображения, то программа начинает "тормозить".


 
Kind ©   (2005-04-03 17:24) [9]

Почему-то не работает. То получается белый фон, то вообще ничего не происходит (только вместо Image1.Canvas.Handle стоит переменная DC, которая определена ранее как DC:=GetDC(Image1.Canvas.Handle) но это, мо-моему, одно и то же).

Вот по-этому и не работает! Image1.Canvas.Handle - это уже готовый DC, в который и нужно рисовать.

Я попробовал, и у меня вывод 100000 полигонов в Image происходит чуть-чуть быстрее чем на Panel.


 
У   (2005-04-03 23:31) [10]

Image перекрывает Canvas

Нужно использовать inherited Canvas (из наследника Image)
или, если извне, то

 type
   THackGraphicControl = class(TGraphicControl);

 THackGraphicControl(Image).Canvas


 
alpet ©   (2005-04-04 18:56) [11]

С такой задачей тебе в любом случае надо:
1. Создавать MemoryDC иначе говоря буффер
2. Готовится к медленному выполнению кода - 100тыс. не мало для GDI. Лучше поискать пути оптимизации...

+ Использовать функции GdiSetBatchLimit и GdiFlush


 
жаба недоросток   (2005-04-28 10:35) [12]

при создании рисунка, рисуй его в БитМапе, а на панель просто копируй его. при скролинге - просто смещай.
вторая панель в принципе не нужна. лучше скролбар свой кинь.



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
3-1115885131
КиТаЯц
2005-05-12 12:05
2005.06.29
Сложный SQL для статистики


4-1114651008
rolex
2005-04-28 05:16
2005.06.29
Как удалить файл занятый приложением???


1-1117521494
leonidus
2005-05-31 10:38
2005.06.29
Как избежать гонок в потоках


3-1115964188
MakNik
2005-05-13 10:03
2005.06.29
преобразовать таблицу в строку


1-1118293185
Wood
2005-06-09 08:59
2005.06.29
Иконка в Application.MessageBox