Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1117908515
Udaff
2005-06-04 22:08
2005.06.29
проблема с печатью


9-1110528883
Guest2005
2005-03-11 11:14
2005.06.29
Вывод изображения используя средства D3D


14-1117446788
Ajax
2005-05-30 13:53
2005.06.29
Покупка цифровой мыльницы в Питере


10-1095068388
jiuraoihiophk
2004-09-13 13:39
2005.06.29
Уничтожение OLE обьекта


14-1117565007
NightStranger
2005-05-31 22:43
2005.06.29
С чего все начинали





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский