Oberon space
General Category => Общий раздел => Тема начата: Jordan от Декабрь 24, 2012, 11:00:49 pm
-
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
Как реализовать окно из прямоугольников. Как создавать события для окон кнопок и т.д
С помощью библиотеки sdl, я пробывал сделать gui. Дальше кнопок не пошло. Я скачивал разные исходники библиотек, но они все на ооп.
Как я сделал.
В главном цикле, опрашивается мышь.
Если мышь переместилась, проверить созданные кнопки. Происходит перебор массива кнопок с их координатами, если курсор на кнопке вывести картинку.
Всё это медленно и грузит процессор. Поэтому хотелось бы почитать книги об этом. Основы, от рисования точки, до окон, кнопок и т.д
-
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
А старый добрый способ "изучить существующее и сделать свое (без фатального недостаткa)" не подходит?
-
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
Я правильно понимаю, что из GUI интересует не все, а обработка событий? То есть скажем реализация рисования не интересует.
-
2Jordan:
Думаю, что вам будет интересно почитать Джеффри Рихтера "Создание эффективных WIN32-приложений" (если ещё не читали). Главы 26 (Оконные сообщения) и 27 (Модель аппаратного ввода...).
-
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
[/quote]2Jordan:
Думаю, что вам будет интересно почитать Джеффри Рихтера "Создание эффективных WIN32-приложений" (если ещё не читали). Главы 26 (Оконные сообщения) и 27 (Модель аппаратного ввода...).
Спасибо. Уже читаю.
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
Я правильно понимаю, что из GUI интересует не все, а обработка событий? То есть скажем реализация рисования не интересует.
Интересует всё. С отрисовкой всё понятно. А вот с событиями, нет. За основу я взял sdl, кроссплатформенно и уже имеются нужные примитивы.
С помощью sdl можно рисовать прямоугольник, отслеживать нажатие кнопок мыши и клавиатуры.
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
А старый добрый способ "изучить существующее и сделать свое (без фатального недостаткa)" не подходит?
Подходит.
Вот, что у меня получилось исходник на free basic. На си я не смог подключить sdl(всё время ошибки), На паскале тоже, были проблемы.(Уже решены). На free basic завилось из коробки. КП тоже, были проблемы.
''==============================================================================
'' Includes
''==============================================================================
#include once "SDL/SDL.bi"
#include once "SDL/SDL_TTF.bi"
''==============================================================================
'' Variables
''==============================================================================
''==============================================================================
'' Types
''==============================================================================
''==============================================================================
'' Code Begin
''==============================================================================
''==============================================================================
'' Code End
''==============================================================================
TYPE PSDL_Surface AS SDL_Surface ptr
TYPE PSDL_Rect AS SDL_Rect ptr
TYPE PSDL_Event AS SDL_Event ptr
ENUM BOOLEAN
FALSE = 0
TRUE = 1
END ENUM
TYPE TButton
DIM V AS BOOLEAN
DIM X AS INTEGER
DIM Y AS INTEGER
DIM W AS INTEGER
DIM H AS INTEGER
END TYPE
DIM SHARED TableButton(0 TO 256) AS TButton
SUB DrawRect(Surface AS PSDL_Surface, x AS INTEGER, y AS INTEGER, w AS INTEGER, h AS INTEGER, r AS INTEGER, g AS INTEGER, b AS INTEGER)
DIM Rect AS SDL_Rect
Rect.x = x
Rect.y = y
Rect.w = w
Rect.h = h
SDL_FillRect(Surface, @Rect, SDL_MapRGB(Surface->format, r, g, b))
END SUB
FUNCTION DrawButton(Surface AS PSDL_Surface, x AS INTEGER, y AS INTEGER, w AS INTEGER, h AS INTEGER) AS INTEGER
DIM I AS INTEGER
DIM Result AS BOOLEAN
Result = FALSE
I = 0
WHILE(I < UBound(TableButton)) AND (Result = FALSE)
IF (TableButton(I).v = FALSE) THEN
TableButton(I).v = TRUE
TableButton(I).x = x
TableButton(I).y = y
TableButton(I).w = w
TableButton(I).h = h
DrawRect(Surface, TableButton(I).x, TableButton(I).y, TableButton(I).w, TableButton(I).h, 192, 192, 192)
Result = TRUE
END IF
I = I + 1
WEND
DrawButton = I
END FUNCTION
SUB DrawText(Surface AS PSDL_Surface, S AS STRING, FontName AS STRING, FontSize AS INTEGER, x AS INTEGER, y AS INTEGER)
DIM Text AS PSDL_Surface
DIM Colour AS SDL_Color
DIM Rect AS SDL_Rect
DIM Font AS TTF_Font ptr
Colour.R = 255
Colour.G = 255
Colour.B = 0
Rect.x = x
Rect.y = y
Font = TTF_OpenFont(FontName, FontSize)
Text = TTF_RenderText_Blended(Font, S, Colour)
SDL_BlitSurface(Text, 0, Surface , @Rect)
SDL_FreeSurface(Text)
TTF_CloseFont(font)
END SUB
FUNCTION InRect(x AS INTEGER, y AS INTEGER, px AS INTEGER, py AS INTEGER, pw AS INTEGER, ph AS INTEGER) AS BOOLEAN
IF ((x > px) AND (y > py)) THEN
IF ((x < px + pw) AND (y < py + ph)) THEN
InRect = TRUE
END IF
ELSE
InRect = FALSE
END IF
END FUNCTION
DIM SHARED Win AS PSDL_Surface
DIM Event AS SDL_Event
DIM Quit AS BOOLEAN
DIM Box AS SDL_Rect
DIM X AS INTEGER
DIM Y AS INTEGER
DIM I AS INTEGER
DIM B AS INTEGER
SUB ButtonEvent(Events AS SDL_Event)
DIM x AS INTEGER
DIM y AS INTEGER
DIM i AS INTEGER
IF (Events.Type = SDL_MOUSEMOTION) THEN
x = Events.motion.x
y = Events.motion.y
FOR I = 0 TO UBound(TableButton)
IF (TableButton(i).v = TRUE) THEN
IF InRect(x, y, TableButton(i).x, TableButton(i).y, TableButton(i).w, TableButton(i).h) THEN
DrawRect(Win, TableButton(i).x, TableButton(i).y, TableButton(i).w, TableButton(i).h, 56, 255, 0)
ELSE
DrawRect(Win, TableButton(i).x, TableButton(i).y, TableButton(i).w, TableButton(i).h, 192, 192, 192)
END IF
END IF
NEXT
END IF
END SUB
SDL_Init(SDL_INIT_VIDEO)
Win = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE OR SDL_DOUBLEBUF)
TTF_Init
Quit = FALSE
B = DrawButton(Win, 200, 100, 120, 30)
DrawText(Win, "Hello!", "DejaVuSans.ttf", 14, 10, 10)
WHILE (Quit = FALSE)
WHILE (SDL_PollEvent(@Event))
IF (Event.Type = SDL_QUIT_) THEN
Quit = TRUE
END IF
ButtonEvent(Event)
WEND
SDL_Flip(Win)
SDL_Delay(20)
WEND
IF (Quit = TRUE) THEN
SDL_Quit
END IF
Меня интересует как же это всё взаимодействует.
Прикрепил файл в ней откомпилированная программа и исходники.
-
Интересует всё. С отрисовкой всё понятно. А вот с событиями, нет. За основу я взял sdl, кроссплатформенно и уже имеются нужные примитивы.
Тогда советую почитать ПОРТЯНКИН И. "Swing: Эффектные пользовательские интерфейсы" - там вначале, первые несколько глав, идет подробное описание потрохов Swing'a, то есть общей архитектуры. Как что отрисовывается (не сами алгоритмы рисования, а порядок отрисовки компонент), почему. Как ходят события, как обрабатывается клавиатура и так далее.
А ООП в гуйне пугаться не надо - это лишь терминология. Программируется это все на чем угодно.
-
Да, я бы наверно посоветовал еще посмотреть "Проект Оберон" Вирта - там как-никак описывается построение целой ОС, причем с графическим интерфейсом.
http://www.ozon.ru/context/detail/id/8218517/
-
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать? :D
-
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать? :D
Да ладно. Это ж FreeBasic - по сути это Си с бейсикоподобным синтаксисом. По моему, там все возможно.
-
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать? :D
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
Интересует всё. С отрисовкой всё понятно. А вот с событиями, нет. За основу я взял sdl, кроссплатформенно и уже имеются нужные примитивы.
Тогда советую почитать ПОРТЯНКИН И. "Swing: Эффектные пользовательские интерфейсы" - там вначале, первые несколько глав, идет подробное описание потрохов Swing'a, то есть общей архитектуры. Как что отрисовывается (не сами алгоритмы рисования, а порядок отрисовки компонент), почему. Как ходят события, как обрабатывается клавиатура и так далее.
А ООП в гуйне пугаться не надо - это лишь терминология. Программируется это все на чем угодно.
Многие вещи проясняются. Спасибо.
Если кому интересно.
Перешёл на паскаль. Разбил задачу на модули. Вместо статического массива использую, динамический список. Потихоньку работа спориться.
Благодарен за ответы.
-
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось
-
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось
Graphics Vision?
-
2Geniepro,
не оно. Помню только что там цельный десктоп наваяли с приложениями (простенькие, конечно, больше демо). даже под виндой запускалась демка
-
Гуйня на SDL (http://www.libsdl.org/libraries.php?order=name&category=-1&completed=0&os=-1&match_name=gui&perpage=50)
-
Jordan, посмотрите исходники библиотек KOL (http://kolmck.net), ACL (http://www.programmersforum.ru/showthread.php?t=36967) и Light VCL (http://www.bouchez.info/lvcl.html).
ACL, VCL и LVCL — это только GUI. KOL — библиотека универсальная. Там сделана попытка привести winapi и вообще взгляд на api в более упорядоченный вид. На KOL можно сделать вполне консольную прогу. В то же время KOL очень экономична. Если в VCL потянешь одну форму — тянется вся иерархия, будет форма на 300 кб. Из кода KOL берётся только то, что используется. Ленивое применение кода. Фишка KOL — маленький размер целевого EXE, но это на мой взгляд не главное. Она попросту удобнее и безопаснее winapi.
Книга о KOL (http://kolmck.net/docs/KOLBook300.pdf)
Порт KOL на Component Pascal (http://forum.oberoncore.ru/viewtopic.php?t=2829&p=51034)
Не основанные на winapi.
http://tothpaul.free.fr/sources.php?lvcl (http://tothpaul.free.fr/sources.php?lvcl)
VisualOberon - A GUI library for the ooc compiler (http://visualoberon.sourceforge.net)
(1999) Юрг Гуткнехт, Михаэль Франц. Oberon с гаджетами — простая компонентная инфраструктура (http://maxandreev.narod.ru/oberon/OberonWithGadgets_RUS.html)
Да, книгу "Проект Оберон" Вирта тоже советую, мне её недавно подарили в бумаге, очень интересная. Хоть там GUI и текст-ориентированный, но обработка событий, реализованная в системе ETH Oberon, объясняется очень подробно. И может быть использована и для расширения поверх традиционными кнопками, полями ввода и т.п.