Oberon space

General Category => Общий раздел => Тема начата: Jordan от Декабрь 24, 2012, 11:00:49 pm

Название: Существуют ли книги по реализации GUI
Отправлено: Jordan от Декабрь 24, 2012, 11:00:49 pm
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.

Как реализовать окно из прямоугольников. Как создавать события для окон кнопок и т.д

С помощью библиотеки sdl, я пробывал сделать gui. Дальше кнопок не пошло. Я скачивал разные исходники библиотек, но они все на ооп.

Как я сделал.

В главном цикле, опрашивается мышь.
Если мышь переместилась, проверить созданные кнопки. Происходит перебор массива кнопок  с их координатами, если курсор на кнопке вывести картинку.

Всё это медленно и грузит процессор. Поэтому хотелось бы почитать книги об этом. Основы, от рисования точки, до окон, кнопок и т.д
Название: Re: Существуют ли книги по реализации GUI
Отправлено: vlad от Декабрь 24, 2012, 11:12:48 pm
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.

А старый добрый способ "изучить существующее и сделать свое (без фатального недостаткa)" не подходит?
Название: Re: Существуют ли книги по реализации GUI
Отправлено: valexey_u от Декабрь 25, 2012, 08:36:41 am
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
Я правильно понимаю, что из GUI интересует не все, а обработка событий? То есть скажем реализация рисования не интересует.
Название: Re: Существуют ли книги по реализации GUI
Отправлено: igor от Декабрь 25, 2012, 01:12:04 pm
2Jordan:
Думаю, что вам будет интересно почитать Джеффри Рихтера "Создание эффективных WIN32-приложений" (если ещё не читали). Главы 26 (Оконные сообщения) и 27 (Модель аппаратного ввода...).
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Jordan от Декабрь 25, 2012, 04:48:53 pm
Не как пользоваться библиотеками 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


Меня интересует как же это всё взаимодействует.

Прикрепил файл в ней откомпилированная программа и исходники.
Название: Re: Существуют ли книги по реализации GUI
Отправлено: valexey_u от Декабрь 25, 2012, 05:42:05 pm
Интересует всё. С отрисовкой всё понятно. А вот с событиями, нет. За основу я взял sdl, кроссплатформенно и уже имеются нужные примитивы.
Тогда советую почитать ПОРТЯНКИН И. "Swing: Эффектные пользовательские интерфейсы" - там вначале, первые несколько глав, идет подробное описание потрохов Swing'a, то есть общей архитектуры. Как что отрисовывается (не сами алгоритмы рисования, а порядок отрисовки компонент), почему. Как ходят события, как обрабатывается клавиатура и так далее.

А ООП в гуйне пугаться не надо - это лишь терминология. Программируется это все на чем угодно.
Название: Re: Существуют ли книги по реализации GUI
Отправлено: valexey_u от Декабрь 26, 2012, 05:40:57 pm
Да, я бы наверно посоветовал еще посмотреть "Проект Оберон" Вирта - там как-никак описывается построение целой ОС, причем с графическим интерфейсом.

http://www.ozon.ru/context/detail/id/8218517/
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Рыжий от Декабрь 26, 2012, 10:09:51 pm
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D
Название: Re: Существуют ли книги по реализации GUI
Отправлено: valexey_u от Декабрь 26, 2012, 10:30:38 pm
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D
Да ладно. Это ж FreeBasic - по сути это Си с бейсикоподобным синтаксисом. По моему, там все возможно.
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Jordan от Декабрь 28, 2012, 08:09:04 am
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D

Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.

Интересует всё. С отрисовкой всё понятно. А вот с событиями, нет. За основу я взял sdl, кроссплатформенно и уже имеются нужные примитивы.
Тогда советую почитать ПОРТЯНКИН И. "Swing: Эффектные пользовательские интерфейсы" - там вначале, первые несколько глав, идет подробное описание потрохов Swing'a, то есть общей архитектуры. Как что отрисовывается (не сами алгоритмы рисования, а порядок отрисовки компонент), почему. Как ходят события, как обрабатывается клавиатура и так далее.

А ООП в гуйне пугаться не надо - это лишь терминология. Программируется это все на чем угодно.

Многие вещи проясняются. Спасибо.

Если кому интересно.

Перешёл на паскаль. Разбил задачу на модули. Вместо статического массива использую, динамический список. Потихоньку работа спориться.

Благодарен за ответы.
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Kemet от Декабрь 28, 2012, 08:46:57 am
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Geniepro от Декабрь 28, 2012, 09:51:18 am
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось
Graphics Vision?
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Kemet от Декабрь 28, 2012, 01:47:38 pm
2Geniepro,
не оно. Помню только что там цельный десктоп наваяли с приложениями (простенькие, конечно, больше демо). даже под виндой запускалась демка
Название: Re: Существуют ли книги по реализации GUI
Отправлено: ilovb от Февраль 03, 2013, 08:21:05 pm
Гуйня на SDL (http://www.libsdl.org/libraries.php?order=name&category=-1&completed=0&os=-1&match_name=gui&perpage=50)
Название: Re: Существуют ли книги по реализации GUI
Отправлено: Oleg N. Cher от Февраль 05, 2013, 10:02:08 am
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, объясняется очень подробно. И может быть использована и для расширения поверх традиционными кнопками, полями ввода и т.п.