OberonCore https://forum.oberoncore.ru/ |
|
Отрисовка без мерцания https://forum.oberoncore.ru/viewtopic.php?f=24&t=648 |
Страница 1 из 1 |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 10:54 ] |
Заголовок сообщения: | Отрисовка без мерцания |
Помогите плиз сделать отрисовку без мерцания стандартными средствами Blackbox Пусть, есть некий контрол. Например, манометр со стрелочкой. У клнтрола есть PROCEDURE (c: Control) Paint-(f: Views.Frame) Попробовал вот так: PROCEDURE Paint(c: Control; f: Views.Frame); VAR w, h, u: INTEGER; p: Ports.Port; BEGIN u := f.unit; c.context.GetSize(w, h); p := f.rider.Base(); p.OpenBuffer(f.gx DIV u, f.gy DIV u, (f.gx + w) DIV u, (f.gy + h) DIV u); c.Paint(f); p.CloseBuffer(); END Paint; Все отрисовывается без мерцания по Action (примерно раз в секунду). Но документ, содержащий Control отрисовывается некорректно. проблемы получаются и при прокрутке и просто когда документ свернуть и развернуть. Остальная часть документа рисуется частично. Как стандартным способом перенаправить отрисовку controla на Bitmap? А потом корректно отобразить |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 12:20 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
А зачем "самопальные" Paint? Я не до конца понимаю логику... Подозреваю, что по Action Вы вызываете свой Paint(c, f)? Этого делать нельзя. Хотя бы потому, что Вы не можете делать никаких предположений о кадре за пределами Restore и HandleCtrlMsg, куда он передаётся; он может меняться в любой момент. Обычно делается так: рисование описывается в yourControl.Restore, а из Action периодически вызывается Views.Update(yourControl, Views.keepFrames). Вы пробовали эту схему? Если да, то чем она не подошла? А для чего p.OpenBuffer? |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 12:32 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
В документации Ports: "Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях." А Вы используете внутри отображения - и "дерётесь" с корневым отображением... |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 12:45 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Илья Ермаков писал(а): А зачем "самопальные" Paint? Я не до конца понимаю логику... Подозреваю, что по Action Вы вызываете свой Paint(c, f)? Этого делать нельзя. Хотя бы потому, что Вы не можете делать никаких предположений о кадре за пределами Restore и HandleCtrlMsg, куда он передаётся; он может меняться в любой момент. Обычно делается так: рисование описывается в yourControl.Restore, а из Action периодически вызывается Views.Update(yourControl, Views.keepFrames). Вы пробовали эту схему? Если да, то чем она не подошла? А для чего p.OpenBuffer? Пардон, что не до конца объяснил. Paint как раз в Restore и вызывается: PROCEDURE (c: Control) Restore* (f: Views.Frame; l, t, r, b: INTEGER); BEGIN Paint(c, f) END Restore; В Action вызывается value := value + 1; Dialog.UpdateReal(value), где value связана с контролом. Почему p.OpenBuffer, потому что тогда вся последующая отрисовка(как я понял идет в Bitmap) p.CloseBuffer затем выводит на экран Bitmap. p.OpenBuffer и p.CloseBuffer - это я потом добавил. Было просто c.Paint(). Отрисовка контрола мерцает. |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 12:51 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Илья Ермаков писал(а): В документации Ports: "Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях." А Вы используете внутри отображения - и "дерётесь" с корневым отображением... Да, я собственно это уже понял. Но как тогда стандартными средствами Blackbox перенаправить вывод контрола в Bitmap, а затем вывести его? |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 13:08 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
А можно увидеть реализацию контрола полностью, чтоб "руками потрогать"? |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 13:21 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
А можно увидеть реализацию контрола полностью, чтоб "руками потрогать"? Вложение:
Комментарий к файлу: Вот собственно начальный проект Virtual Instruments ![]() Скачиваний: 466 Вот пожалуйста |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 15:02 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Скачал, а какой контрол проблемный и как его потестить? |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 15:09 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Илья Ермаков писал(а): Скачал, а какой контрол проблемный и как его потестить? Посмотрите GaugeDemo и AGauge |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 16:13 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Штирлиц писал(а): Илья Ермаков писал(а): Скачал, а какой контрол проблемный и как его потестить? Посмотрите GaugeDemo и AGauge CtlsxSliders - можно убрать или скачать с http://www.zinnamturm.eu |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 16:20 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Причина мерцания - контрол слишком много перерисовывает каждый раз. В ББ эта проблема решается не ручной буферизацией, а разбиением сложного отображения на несколько комбинируемых простых. Т.е. вводится отдельное отображение ArrowView, которое делается вложенным отображением для контрола. В Restore основного отображения выполняется Views.InstallFrame для ArrowView. А при Update выполняется не перерисовка всего контрола, а всего лишь запрос на обновление ArrowView: Views.Update(v.arrow, Views.keepFrames). Обеспечить буферизацию - уже дело самой среды. Дело программиста - разбить на мелкие отображения и внятно говорить, когда какое перерисовывать. Переделал Ваш код таким образом, контрол не мерцает. (ну, зазубренная стрелка "змеится" - это уже проблемы рисования линии). Я склепал весьма на скорую руку, к тому же пришлось проломить Вашу иерархию - переопределить Update на уровне AGauge, пометив его в ViControls как EXTENSIBLE. Вложение: Вложение: И, если позволите, общие замечания. Мне кажется, что Вы пытаетесь поверх ББ строить VCL ![]() И ещё мелкое, но важное... Вы объявляется TYPE SomeControl = ABSTRACT RECORD .. и объявляете read-only поля - это бессмысленно. Ведь схема "открытый абстрактный интерфейс" сделана для того, чтобы кто-то мог подменить реализацию. Так ведь реализация в другом модуле не сможет менять read-only поля своего базового типа! Абстрактный интерфейс должен содержать только абстрактные процедуры, а для стандартных свойств - абстрактные функции их получения (не обязательно, если есть Prop-сообщение для их получения, то можно и не описывать). Поля описываются как раз в конкретном типе-расширении. |
Автор: | Штирлиц [ Среда, 12 Сентябрь, 2007 16:51 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Илья, спасибо за помощь. Я не пытаюсь построить VCL. Просто есть идея собрать всякие Open Source "красивые" контрольчики под Blackbox. Собственно вся иерархия была введена из-за класса Border чтобы можно было декорировать любой контрол. Ну, и конечно, недостаточно документации + недопонимание идеологии Blackbox + инерция "старого" мышления. Теперь мне много чего прояснилось, реализуем все по-другому ![]() |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 17:03 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Успехов, спрашивайте, если какие вопросы/проблемы будут ![]() |
Автор: | Trurl [ Среда, 12 Сентябрь, 2007 17:05 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Илья Ермаков писал(а): Вы объявляется TYPE SomeControl = ABSTRACT RECORD .. и объявляете read-only поля - это бессмысленно. Ну, это слишком категорично. ![]() |
Автор: | Илья Ермаков [ Среда, 12 Сентябрь, 2007 17:06 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Ну да, но для конкретного кода, который обсуждали - так и есть ![]() |
Автор: | Борис Рюмшин [ Среда, 12 Сентябрь, 2007 17:09 ] |
Заголовок сообщения: | Re: Отрисовка без мерцания |
Trurl писал(а): Илья Ермаков писал(а): Вы объявляется TYPE SomeControl = ABSTRACT RECORD .. и объявляете read-only поля - это бессмысленно. Ну, это слишком категорично. ![]() Зато дисциплинирует... ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |