Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Программирование игр, графики и искусственного интеллекта > GUI, Listener и оповещение всех контролов |
Автор: ProfessorLoL 8.4.2013, 10:59 | ||
Всем привет. Есть некая библиотека, в которой осуществляется вся работа с окном и событиями. В этой библиотеки главным классом является класс CApplication. Он создает окно, получает события ввода и отсылает сообщения всем слушателям, которые подписались на их получения. Есть класс CAppListener. Именно наследники этого класса могут подписываться на получения сообщений от CApplication. Приведу немного кода, а затем задам собственно вопрос:
Вся система прекрасно работает. Все контролы созданные таким образом и включенные в иерархию получают события от клавиатуры и мыши. Но возникла необходимость оповестить все контролы о каком-то событии, которое произошло при обработке какого-то конкретного контрола. Допустим ткнули мышкой -> бежим по иерархии контролов и ищем того, кому предназначено сообщение -> обрабатываем сообщение в контроле и ВОТ ТУТ НАДО ПОСЛАТЬ КАКОЕ-ТО СООБЩЕНИЕ ВСЕМ КОНТРОЛАМ. Проблема в том, что отсылать сообщение может только объект класса CApplication. Но доступа в контроле мы к нему не имеем. Помогите. |
Автор: Bitter 8.4.2013, 12:23 |
Я так понял, всем контролам, которые подписаны на сообщения? Или вообще всем контролам в программе? Ну а получить ссылку на него? Он же наверное представлен в виде синглтона? |
Автор: ProfessorLoL 8.4.2013, 13:05 | ||||
По сути всем вообще котролам. Но, вообще, только объект класса CGUI подписан на сообщения. Именно он получает сообщения от CApplication. А все остальные контролы получают сообщения потому, что являются детьми GUI. Просто идя вниз по иерархии. Таким образом решается проблема "кому принять сообщение от клика мыши, если один элемент закрывает другой."
Таскать в каждом контроле ссылку на CApplication или на СGUI не хотелось бы.. хотя да, это решило бы проблему. Хотелось бы иметь какое-то красивое решение, которое позволило бы отправлять из любого контрола сообщение в CGUI обьект. |
Автор: ProfessorLoL 12.4.2013, 12:09 | ||||
Вот, может кому-то будет полезным, если наткнется на топик из поиска по похожей проблеме: В общем, ничего лучшего не придумал, чем таскать в каждом контроле, помимо ссылки на родителя ссылку на CGUI, который является как бы менеджером всей системы интерфейса. Например кнопку теперь можно создать так:
где window это окно в котором кнопка будет рисоваться в координатах 100,100 Ну и собственно проблема отправки сообщений всем контралам решилась. Для того что-бы отправить сообщение, скажем из обработчика кнопки, пишем в нем
и оно запустит рассылку заново всем контролам в программе с этого места, а потом вернется в эту точку. Если же надо послать сообщение только тем контролам, которые являются братьями данного, то тоже самое делается через родителя. Так например можно легко сбрасывать все RadioButton'ы. Щелкаем по одному, посылаем сообщение "UNCHECKED" всем остальным имеющим одного предка с данным, а текущий RadioButton делаем SetChecked(true); |