|
Заблокирован
|
||||||||||||||||||||||||||
Оконный менеджер. Как лучше хранить указатели на элементы менеджера?08.11.2014, 13:34. Показов 1886. Ответов 9
Метки нет (Все метки)
Привет! Делаю тут 3D движок
![]() В общем есть главный класс движка mgeSystem, так же есть класс окна mgeWindow, который не наследуется от класса mgeWindow. В общем в эти классы окна представляют функционал по работе с окнами Windows, их может быть много. Я создаю окно так сказать
Кликните здесь для просмотра всего текста
В общем, юзер может нажать мышкой на крестик закрытия окна, чтоб окно закрыть и окно должно будет закрыться (именно это окно, окон может быть много) В классе движка mgeSystem храниться std::set с указателями на окна для прорисовки и обработки сообщений:
Смотрите. Вот в коде игры ( в клиентском коде ), я создал окно поредствам new, добавил его в систему, всё тип топ, окно отображается и у меня на него есть указатель. Но вот если юзер нажимает допустим на крестик и хочет закрыть окно, то что я делаю... Я удаляю его из списка для обработки в главном классе движка, так же удаляю его по указателю, который храниться в это списке, но в таком случае указатель во внешнем коде, в клиентском, на это окно становится не валидным, ну то есть если я удаляю окно внутри движка, то указатель на него в клиентском коде соответственно становится "левым". Можно конечно в движке не удалять это окно, а просто удалять его из списка, НО: По скольку класс mgeWindow - это класс - оболочка над стандартным окном HWND ОС Windows, то после того, как юзер его закроет крестиком, я уничтожу само виндусовское окно DestroyWindow-вом, инкапсулированное в классе mgeWindow и вроде всё ок, но сам данный экземпляр класса mgeWindow по сути станет бесполезным, т.к. внутри него окно уже уничтожено. Как же быть... ? Как организовать удаление окна из системы? Может вообще не давать юзеру указателя на новое окно, создавая его в системном классе, ну как то так: system->CreateWindow, но как тогда юзер сможет работать с этим окном в клиентском коде?
0
|
||||||||||||||||||||||||||
| 08.11.2014, 13:34 | |
|
Ответы с готовыми решениями:
9
Оконный менеджер Зависает оконный менеджер Как лучше закодировать app.config connectionStrings? Или лучше не здесь хранить подключение к бд? |
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 08.11.2014, 14:00 | |
Сообщение было отмечено -THE_MASTER666- как решение
Решение
Пусть во внутренних структурах движка хранятся указатели shared_ptr на окна, а пользователю отдаются weak_ptr.
1
|
|
|
Заблокирован
|
||
| 08.11.2014, 14:05 [ТС] | ||
|
Как будут первые успехи по игре - кину ссылку на тред с ней и демкой
0
|
||
|
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
|
|
| 08.11.2014, 14:08 | |
|
Шаред птр могуч
0
|
|
| 08.11.2014, 14:10 [ТС] | |
|
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 08.11.2014, 14:12 | |
|
0
|
|
|
Заблокирован
|
||||||||||||
| 08.11.2014, 14:22 [ТС] | ||||||||||||
|
Навёл тут справки про weak_ptr, на самом деле это не какой - то сказочное средство, на что я понадеялся сначала ![]() Если посмотреть на стандартный пример:
if (auto spt = gw.lock()) ... Хмм, но ведь с таким же успехом, я мог бы в своём экземпляре класса mgeWindow так же проверять его "хорошесть" То есть в движке ничего не удалять, а выставлять в классы окна какой - то флаг - мол окно удалено, а перед использованием какой - то функции этого окна проверять:
0
|
||||||||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 08.11.2014, 14:27 | ||
|
2. В памяти остаются болтаться окна-"пустышки". Только ради флагов.
0
|
||
| 08.11.2014, 14:31 | |
|
0
|
|
|
Заблокирован
|
|||
| 08.11.2014, 14:38 [ТС] | |||
|
Нужно делать главный класс движка в модуле движка (DLL), а в клиентском коде от него наследоваться и всю работу с игрой делать в рамках этого саб класса, в котором можно будет переопределить некоторые защищённые функции, например windowsEvent(), в который бы прилетал указатель на окно, которое нужно удалить... Добавлено через 3 минуты Но для общего развития сообщу, что например, в том же 3DS Max есть в стандартной раскладке 4 окна проекций. То есть есть главное окно с GUI (кнопки и пр) + дополнительных отдельных 4 окна, которые просто напросто являются дочерними. А в других программах эти окна можно вообще хоть на втором мониторе открывать.
0
|
|||
| 08.11.2014, 14:38 | |
|
Помогаю со студенческими работами здесь
10
Установлены xfce4 и оконный менеджер blackbox Какой оконный менеджер меньше всего жрет ресурсов компьютера, FluxBox, OpenBox, BlackBox или IceWM? Как лучше хранить массив? Как лучше хранить товары в БД? Как лучше хранить данные Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|