OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 16 Июнь, 2025 15:43

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 10:54 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Помогите плиз сделать отрисовку без мерцания стандартными средствами 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?
А потом корректно отобразить


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 12:20 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А зачем "самопальные" Paint? Я не до конца понимаю логику... Подозреваю, что по Action Вы вызываете свой Paint(c, f)? Этого делать нельзя. Хотя бы потому, что Вы не можете делать никаких предположений о кадре за пределами Restore и HandleCtrlMsg, куда он передаётся; он может меняться в любой момент.

Обычно делается так: рисование описывается в yourControl.Restore, а из Action периодически вызывается Views.Update(yourControl, Views.keepFrames). Вы пробовали эту схему? Если да, то чем она не подошла?

А для чего p.OpenBuffer?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 12:32 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В документации Ports:
"Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях."
А Вы используете внутри отображения - и "дерётесь" с корневым отображением...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 12:45 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
А зачем "самопальные" 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(). Отрисовка контрола мерцает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 12:51 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
В документации Ports:
"Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях."
А Вы используете внутри отображения - и "дерётесь" с корневым отображением...


Да, я собственно это уже понял.
Но как тогда стандартными средствами Blackbox перенаправить вывод контрола в Bitmap,
а затем вывести его?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 13:08 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А можно увидеть реализацию контрола полностью, чтоб "руками потрогать"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 13:21 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
А можно увидеть реализацию контрола полностью, чтоб "руками потрогать"?
Вложение:
Комментарий к файлу: Вот собственно начальный проект Virtual Instruments
Vi.zip [117.82 КБ]
Скачиваний: 466


Вот пожалуйста


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 15:02 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Скачал, а какой контрол проблемный и как его потестить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 15:09 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
Скачал, а какой контрол проблемный и как его потестить?

Посмотрите GaugeDemo и AGauge


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 16:13 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Штирлиц писал(а):
Илья Ермаков писал(а):
Скачал, а какой контрол проблемный и как его потестить?

Посмотрите GaugeDemo и AGauge


CtlsxSliders - можно убрать или скачать с http://www.zinnamturm.eu


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 16:20 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Причина мерцания - контрол слишком много перерисовывает каждый раз.
В ББ эта проблема решается не ручной буферизацией, а разбиением сложного отображения на несколько комбинируемых простых. Т.е. вводится отдельное отображение 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-сообщение для их получения, то можно и не описывать). Поля описываются как раз в конкретном типе-расширении.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 16:51 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья, спасибо за помощь.
Я не пытаюсь построить VCL.
Просто есть идея собрать всякие Open Source
"красивые" контрольчики под Blackbox.
Собственно вся иерархия была введена из-за класса Border
чтобы можно было декорировать любой контрол.
Ну, и конечно, недостаточно документации + недопонимание идеологии Blackbox + инерция "старого" мышления.
Теперь мне много чего прояснилось, реализуем все по-другому :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 17:03 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Успехов, спрашивайте, если какие вопросы/проблемы будут :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 17:05 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1437
Илья Ермаков писал(а):
Вы объявляется TYPE SomeControl = ABSTRACT RECORD .. и объявляете read-only поля - это бессмысленно.

Ну, это слишком категорично. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 17:06 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну да, но для конкретного кода, который обсуждали - так и есть :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отрисовка без мерцания
СообщениеДобавлено: Среда, 12 Сентябрь, 2007 17:09 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
Trurl писал(а):
Илья Ермаков писал(а):
Вы объявляется TYPE SomeControl = ABSTRACT RECORD .. и объявляете read-only поля - это бессмысленно.

Ну, это слишком категорично. ;-)

Зато дисциплинирует... :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB