Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизРисование на панели Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c