Разработка среды графического интерфейса в домашней ОС - PullRequest
3 голосов
/ 23 января 2012

Я сделал настольную операционную систему с ядром в c, который печатает "hello world". Я пытаюсь сделать графический интерфейс (пользовательский оконный менеджер, кнопки) для моей ОС в C, но у меня возникли проблемы. Я посмотрел один учебник:

http://www.osdever.net/tutorials/view/gui-development

Существуют ли учебные пособия по графическому интерфейсу для настольной операционной системы в C ?

p.s. нет Linux и нет DOS. только C стандарт.

Ответы [ 2 ]

5 голосов
/ 23 января 2012

Я бы порекомендовал внимательно изучить системы графического интерфейса, которые уже существуют и существовали в прошлом. Посмотрите на их API и попытайтесь выяснить, как они работают. Ответ Алекса дает хорошую общую отправную точку, но не все среды работают одинаково. Обязательно посмотрите на их архитектуру тоже. Они клиент / сервер или монолитны? Как приложения общаются с ними? Как только вы все это поняли, вы можете приступить к проектированию вашей системы. Выясните, где живет ваш оконный менеджер / сервер приложений / эквивалент сервера, постройте каналы связи и начните кодировать. Выясните, как все эти компоненты должны взаимодействовать с вашим ядром - это действительно важно.

В отличие от разработки ядра, где, если вы не очень радикальны, вы почти наверняка создаете нечто, похожее на Unix или немного на VMS, но с элементами minix и mach, смешанными для удобства, создание инфраструктуры GUI более сложный со многими различными вариациями, поэтому, вероятно, не так много хороших учебников.

Мое личное вдохновение - BeOS. Мне понравилось, как они это сделали, поэтому я скопировал это, хотя, как и во всем, вам нужно посмотреть на некоторые ошибки, которые они сделали, и постараться не копировать их. В BeOS было немало ошибок.

5 голосов
/ 23 января 2012

Я не думаю, что вам нужен специальный учебник здесь.Ядро самого основного графического интерфейса пользователя состоит из управления списком прямоугольных объектов, представляющих окна, кнопки, рисунки, текстовые поля и т. Д.

Каждый подобный прямоугольный объект имеет свои x- и y-координаты и размеры (ширинаи высота).Он также имеет координату az (глубины), которая сообщает, какие объекты находятся ниже него (их z меньше) и какие объекты находятся выше него (их z больше).

Каждый прямоугольный объект также имеет указатель на своего родителяи своим детям.Это позволяет легко составлять произвольно сложные окна меньшего и более простого прямоугольника.объекты.Например, когда вы захватываете окно и перемещаете его, используя эти указатели parent / children, вы можете перемещать все объекты.Или, если внешний объект получает событие, он может переслать его своим внутренним дочерним элементам для обработки и наоборот.

Когда дело доходит до рендеринга всех этих прямоугольных объектов, некоторые из которых могут быть частично или полностью скрытыдругие, самое главное, чтобы выяснить, какие из всех объектов видимы, невидимы и частично видимы, потому что вы не хотите делать много ненужной работы.Чтобы эффективно рисовать объекты, вы хотите нарисовать каждый пиксель не более одного раза (всегда или большую часть времени).В дополнение к необходимому коду для пересечения / разделения прямоугольника это также означает, что каждый объект знает, как эффективно нарисовать любую произвольную прямоугольную часть себя.Это наиболее тривиально для однотонных объектов.Для изображений это более или менее просто (если только вы не хотите иметь масштабирование изображения и уменьшение / преобразование цвета на месте).Для текстовых и векторных объектов это сложнее всего.

Вы можете даже составить объект указателя мыши из маленьких прямоугольных объектов и нарисовать и перерисовать его с помощью того же кода, что и для всех других объектов.Просто убедитесь, что координата z (глубина) указателя такова, что указатель всегда находится поверх всех других объектов.

Это общая идея.

...