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
Vi.zip [117.82 КБ]
Скачиваний: 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.
Вложение:
AGauge.odc [91.77 КБ]
Скачиваний: 843
Вложение:
Controls.odc [29.96 КБ]
Скачиваний: 836


И, если позволите, общие замечания. Мне кажется, что Вы пытаетесь поверх ББ строить VCL :-) Здесь другая идеология, и из этого ничего хорошего не получится. Например, тягостно выглядят глубокие иерархии наследования, особенно реализации. Попробуйте избежать наследования реализации, использовать только композицию, в сочетании с определением своих типов сообщений. Например, Вы ввели Paint, Update и "прошили" в базовом ViControls.Control некую жёсткую схему поведения - и тут же выяснилось, что для того, чтобы реализовать вложенные отображения, её нужно переломать... Всегда стоит подумать, а для чего и в каком месте наследование? По умолчанию приемлемо расширение сообщений, расширение абстрактных интерфейсов, расширение конкретного финального типа от абстрактного интерфейса. Любое иное расширение требует обоснования. Например, какие такие общие черты планируются у элементов Vi, чтобы вводить для них базовый тип ViControl? Наличие дополнительных методов в интерфейсе? Их вроде бы нет. А если бы и были, то для отображений лучше было бы описать дополнительные сообщения, а не доп. процедуры. Какие-то общие примитивы поведения? Так может быть, лучше эти примитивы поведения реализовать обособленными типами и задействовать через композицию?

И ещё мелкое, но важное... Вы объявляется 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/