Автор Тема: Существуют ли книги по реализации GUI  (Прочитано 7610 раз)

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Существуют ли книги по реализации GUI
« : Декабрь 24, 2012, 11:00:49 pm »
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.

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

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

Как я сделал.

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

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #1 : Декабрь 24, 2012, 11:12:48 pm »
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.

А старый добрый способ "изучить существующее и сделать свое (без фатального недостаткa)" не подходит?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #2 : Декабрь 25, 2012, 08:36:41 am »
Не как пользоваться библиотеками winapi, qt, gtk, а именно как их сделать.
Я правильно понимаю, что из GUI интересует не все, а обработка событий? То есть скажем реализация рисования не интересует.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #3 : Декабрь 25, 2012, 01:12:04 pm »
2Jordan:
Думаю, что вам будет интересно почитать Джеффри Рихтера "Создание эффективных WIN32-приложений" (если ещё не читали). Главы 26 (Оконные сообщения) и 27 (Модель аппаратного ввода...).

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #4 : Декабрь 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


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

Прикрепил файл в ней откомпилированная программа и исходники.

valexey_u

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

А ООП в гуйне пугаться не надо - это лишь терминология. Программируется это все на чем угодно.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #6 : Декабрь 26, 2012, 05:40:57 pm »
Да, я бы наверно посоветовал еще посмотреть "Проект Оберон" Вирта - там как-никак описывается построение целой ОС, причем с графическим интерфейсом.

http://www.ozon.ru/context/detail/id/8218517/
Y = λf.(λx.f (x x)) (λx.f (x x))

Рыжий

  • Newbie
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #7 : Декабрь 26, 2012, 10:09:51 pm »
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D
« Последнее редактирование: Декабрь 26, 2012, 10:12:08 pm от Рыжий »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #8 : Декабрь 26, 2012, 10:30:38 pm »
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D
Да ладно. Это ж FreeBasic - по сути это Си с бейсикоподобным синтаксисом. По моему, там все возможно.
Y = λf.(λx.f (x x)) (λx.f (x x))

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #9 : Декабрь 28, 2012, 08:09:04 am »
Чтобы думать о GUI нужно вспомнить о том, что плоскость - это множество точек ограниченных краем поверхности экрана. Вы хотите на FreeDos c помощью бейсика GUI заделать?  :D

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

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

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

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

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

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

Благодарен за ответы.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #10 : Декабрь 28, 2012, 08:46:57 am »
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #11 : Декабрь 28, 2012, 09:51:18 am »
Нет freedos 16 битный, конкретно на него ориентироваться не буду. Моя цель создать простой GUI. Быстрый и требовал мало ресурсов. Мне очень нравиться визуальный стиль windows 3.1, хочу сделать, что то похожее.
На sf.net есть готовая реализация на турбопаскале, вот названия библиотеки не помню, лет 5 назад скачивал - мне понравилось
Graphics Vision?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Существуют ли книги по реализации GUI
« Ответ #12 : Декабрь 28, 2012, 01:47:38 pm »
2Geniepro,
не оно. Помню только что там цельный десктоп наваяли с приложениями (простенькие, конечно, больше демо). даже под виндой запускалась демка

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Существуют ли книги по реализации GUI
« Ответ #13 : Февраль 03, 2013, 08:21:05 pm »

Oleg N. Cher

  • Full Member
  • ***
  • Сообщений: 152
    • Просмотр профиля
    • Оберон-клуб «VEDAsoft»
Re: Существуют ли книги по реализации GUI
« Ответ #14 : Февраль 05, 2013, 10:02:08 am »
Jordan, посмотрите исходники библиотек KOL, ACL и Light VCL.

ACL, VCL и LVCL — это только GUI. KOL — библиотека универсальная. Там сделана попытка привести winapi и вообще взгляд на api в более упорядоченный вид. На KOL можно сделать вполне консольную прогу. В то же время KOL очень экономична. Если в VCL потянешь одну форму — тянется вся иерархия, будет форма на 300 кб. Из кода KOL берётся только то, что используется. Ленивое применение кода. Фишка KOL — маленький размер целевого EXE, но это на мой взгляд не главное. Она попросту удобнее и безопаснее winapi.

Книга о KOL
Порт KOL на Component Pascal

Не основанные на winapi.

http://tothpaul.free.fr/sources.php?lvcl

VisualOberon - A GUI library for the ooc compiler

(1999) Юрг Гуткнехт, Михаэль Франц. Oberon с гаджетами — простая компонентная инфраструктура

Да, книгу "Проект Оберон" Вирта тоже советую, мне её недавно подарили в бумаге, очень интересная. Хоть там GUI и текст-ориентированный, но обработка событий, реализованная в системе ETH Oberon, объясняется очень подробно. И может быть использована и для расширения поверх традиционными кнопками, полями ввода и т.п.