LINUX.ORG.RU

cairo/expose

 ,


0

1

Раз уж тут пошли вопросы по pygtk.

Правильно ли я понимаю, что при expose_event (и только в нем), надо весь вьюпорт перерисовывать заново? Как правильно дорисовывать что-либо после? Сейчас я добавляю в модель данные, и дергаю invalidate_rect, после чего все пересчитывается/перерисовывается. Но ето все выглядит тормозом. Можно ли как-то кешировать кусок изображения, с возможностью масштабирования, или как вообще с этим принято работать?

http://www.opennet.ru/docs/RUS/gtk_plus/gtk_plus-prog.html.gz#x2326_html

WIDGETNAME_draw() вызывается, когда вызвана функция gtk_widget_draw()для виджета или одного из предков. Это фактически вызов для отрисовки виджета на экране. Для контейнерных виджетов эта функция должна вызвать gtk_widget_draw() для всех дочерних вызовов.

WIDGETNAME_expose() является обработчиком событий виджета. Производит необходимые вызовы функций прорисовки для доступной части экрана. Для контейнерных виджетов, эта функция генерирует отображающие события для их дочерних виджетов неимеющих собственных окон. (Если они имеют собственные окна, то необходимые события генерирует X.)

И таки в gtk3 ЕМНИП другая модель отрисовки.

fat_angel ★★★★★
()

Оттуда же

Как вы наверное заметили последние две функции очень похожи - каждая отвечает за отрисовку виджета на экране. Большинство типов виджетов не беспокоят различия между двумя этими функциями. По умолчанию функция draw() в виджет классе просто генерирует событие для перерисовки площади. Однако, некоторые типы виджетов могут сохранить работу, различая две функции. Например, если виджет имеет многоуровневые окна X, то экспозиционное событие идентифицируют окно и может перерисовать только затронутое окно, которое не доступно для вызова draw().

fat_angel ★★★★★
()

Рисуй всё на GdkPixbuf в памяти как на промежуточный буфер, а в самой функции перерисовки виджета лишь копируй pixbuf на экран.

KivApple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.