Графическое ядро OMEX

Дата: 14/10/05;  Автор: Kreoton; 


Введение

    Сегодня я расскажу вам, как написать собственный GUI на примере графического ядра OMEX. Прежде всего, хочу отметить, что для OMEX нужно, чтобы в операционной системе была страничная модель памяти, IPC, кроме того, OMEX использует функции управления виртуальной памятью. Графическое ядро OMEX выполняется в третьем кольце защиты, что увеличивает производительность GUI, сводя к минимуму переходы между кольцами (вывод графики также осуществляется из третьего кольца). OMEX абстрагирован от тонкостей работы с видео, в его задачи не входит вывод графики на экран, он использует функции драйвера видео (достаточно двух функций - Put_pixel и Get_pixel).

Окна

    Как создать окно, чтобы его можно было перетаскивать, изменять размеры, сворачивать, развертывать, чтобы это окно могло иметь форму? Всё очень просто! =) Для того, чтобы разделять графические объекы нужно, чтобы к каждому пикселю на экране был привязан ID окна. Нужно хранить данные окна (координаты окна, размер окна, атрибут окна (повер всех окон, окно не может брать фокус, не перемещаймое, нельзя менять размеры, наличее контрольных кнопок окна, их состояние), маска окна) в дескрипторе окна.
Процедура создания окна. для создания нового окна нужно передать следующие параметры: координаты окна, размеры окна, атрибуты окна, указатель на битовую маску окна (битовая маска нажна для определения формы окна). Нужно определить положение окна на экране, определить каждый пиксель окна на экране, в соответствие координатоми, размерами и битовой маской окна, также следует отметить, что нужно проверять, не открыто ли окно с атрибутом Top, но если у окна что создается тоже установлен атрибут Top, это не проверяется - окно будет поверх всех! В дескриптор окна нужно записать параметры этого окна. Определить остановить окно в фокус и послать сообщение LostFocus потоку окна, которое было в фокусе перед этим.

Кнопки

    В системе OMEX нет разницы между кнопками, флажками, OptionBox и другими элементами. Главное, что при наведении на кнопку программе посылается ссобщение Ctrl1, при нажатие Ctrl2, если на кнопку нажали, но курсор мыши был отведен за пределы кнопки будет шлём сообщение Ctrl0, но если в пределах этой кнопки нажать и отпустить кнопку мыши программе поступит сообщение Ctrl3. Сведения о кнопки хранятся в дескрипторе кнопки. Для процедуры Put_pixel можно задать спецальный параметр с помощью которого, можно рисовать, писать на кнопке, причем координаты кнопки в окне можно не запоминать (они приплюсовываются автоматически), надо запомнить только ID кнопки.

События

    Теперь мы приступим к самому интересному. Есть события от кнопок, но также есть и другие, не менее важные события, например Redraw. В каких случаях следует выполнять перерисовку:
1. При перетаскивании или изменении размеров окна.
2. После удаления или свертывания окна.
3. Если окно берёт фокус.
В 1, 2 случаях, отчищается матрица экрана (в которой прописано, какому окну пикселю пренадлежит пиксель) и запрос на перерисовку рассылается всем окнам (всё это нужно для удаления изображения старого окна!). Ещё есть события GetFocus/LostFocus, программа может их никак не использовать, но может использовать для индекации того, что окно в фокусе (или нет), например меняет цвет заголовка при GetFocus становится синим, а при LostFocus серым.

Новое графическое ядро - OMEX II

    Сейчас я мало, что могу рассказать про него, потому что я его до сих пор ещё разрабатываю. Могу дать лишь краткое описание. OMEX II предназначен для обеспечения графического интерфейса операционных систем реального времени, но его можно припаять и к примитивной ОС (при наличии виртуальной памяти). В OMEX II можно создать столько окон, на сколько хватит памяти. Благодаря новым технологиям OMEX II, система стала работать намного быстрее, например: за счет технологии fast redraw значительно улучшилось время перерисовки, так что теперь за счет этого, окна можно двигать вместе с курсором мыши, а благодаря технологии xdraw при перерисовке окно не мерцает. Можно будет создавать тени от окон и других графических объектов, включая курсор мыши. Улучшилось время доставки сообщений потоку окна, за счет приоритетного планирования (его осуществляет сам OMEX II) доставки сообщений, что обеспечивает работу GUI в реальном времени (то чего нет у других современных ОС), это значительно улучшает качество работы GUI. OMEX II отличие от OMEX экономит память, не резервируя при старте память для хранения различной информации об окне (действительно, это ведь создает лимит количества окон), а заносит эту информацию в приватную область программы. При этом для защиты системы от вредностных программ, сама программа не может читать и изменять эти данные на прямую, только через функции графического ядра (например "Get_WinParams", для получения координат, размера окна). OMEX II для Miraculix скомпилирован в формате PE DLL. Всё сводится к улучшению качества графики и производительности GUI.