Своя GUI либа - проект.
От: Kolesiki  
Дата: 17.07.16 02:12
Оценка: 4 (1) :)
Мужики, есть старая, но по-прежнему интересная идея написать "свой GUI" для Винды. Причём это всё на D и для D.
Хочу изложить примерную схему для оценки (может и идею подкинете, как проще).

Основная идея — взять от Венды только примитивный элемент Window, а сами контролы полностью рисовать и обрабатывать самим (т.е. мы НЕ пользуемся стандартными Win32 BUTTON, COMBOBOX и т.п.)
Как и положено ООП либе, у нас будет базовый класс Widget, в котором будет находиться вся служебная фигня, нужная венде.
В Widget будет так же лежать своя (перегружабельная) WindowProc для обработки виндовых сообщений.
Как и положено, мы будем RegisterClass для всех наших виджетов и затем их CreateWindow.

И вот тут возникает засада, известная всем кульхацкерам: для RegisterClass нужен адрес обработчика сообщений (WindowProc), который в нашей либе... инстанс метод!
Шахматисты из Borland (да и в MFC тот же хак) решили эту задачу каким-то хитрым ассемблером, чтобы винда сама вызывала нужный метод нужного класса через манипуляцию стеком. Увы, в D я не знаю кишок и не смогу нахакать такой вызов.

Но почесать левое ухо правой рукой всё же можно: завести одну глобальную функцию WindowProc (вне всех классов) и зарегать её для всех виджетов. А уже ей параметром придёт хэндл hWnd любого нашего окна. А далее из глобального же Dictionary мы по hWnd достаём объект Widget, у которого и вызовем инстансную WindowProc.
Кратко: RegisterClass("любой виджет", ГлобальнаяWindowProc). ГлобальнаяWindowProc принимает ВСЕ сообщения приложения, а далее диспетчеризует по объектам.
Тут сложность в том, что придётся внимательно следить, чтобы этот Dictionary всегда был актуален — вовремя добавлять/убирать оттуда хэндлы, да ещё всё это в многопоточной среде.

А ещё маленький подвопрос: после GetMessage обязательно делать DispatchMessage или я сам могу раскидать структуру MSG по нужным объектам?

В общем, идея не новая, но не хочется наступать на пройденные грабли — может кто подкинет совет.

PS
Никакие Qt/GTk не хочу. DLangUI — тем более.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.