Как создать кнопку на openGL?

294
15 декабря 2016, 16:03

Интересует способ создания кнопки, например, как лучше это сделать.
Нужно, чтоб при наведении она меняла цвет, а при нажатии происходило какое-либо событие. Например, у нас есть нарисованный квадрат (glRect), и него нужно повесить событие наведение на объект и клик на объект.

Answer 1

@Александр Старцев, рекомендую для начала разобраться, как устроен конвейер OpenGL.

Видеокарта не знает ничего ни о каких кнопках и тем более событиях. И почти не знает о квадратах. OpenGL главным образом занимается тем, что скармливает видеокарте списки координат вершин и дополнительные сведения о том, как их нарисовать. Т.е. все, что вам в данном случае позволяет библиотека это почистить экран и нарисовать квадрат. Дальше сами.

Заведите себе класс или структуру, описывающие кнопку: координаты, габариты и состояние кнопки (нажата/не нажата). Создайте экземпляр, заполните все поля. В цикле отрисовки чистите экран и выводите кнопку на основе вышеописанных данных.

Перехватите событие нажатия кнопки мыши. Если речь о Windows - через сообщение WM_LBUTTONDOWN, например. Затем проверьте, попадает ли клик по вашей кнопке, сравнив координаты клика с координатами и размерами кнопки. Если - да измените состояние на "нажато". А по событию WM_LBUTTONUP аналогично проверьте и измените состояние на "не нажато". В это время обновлением внешнего вида будет усердно заниматься цикл отрисовки.

PS. Можете пойти скучным путем и взять готовую библиотеку, которая сделает все это за вас (есть варианты с рисованием интерфейса на Flash, например). Гуглить по ключевым словам "opengl ui framework".

Answer 2

Если это виндовс приложение, то мышь постоянно отправляет свои координаты и состояния кнопок как сообщения в очередь приложения. Думаю, вам не составит труда перехватить эти сообщения и наложить их на координаты вашего прямоугольника.

Answer 3

На C++ нужно делать так:

Создается абстрактный класс с обработчиком события, а от него наследованием создаются классы графических объектов. OpenGL передает сообщение тому обработчику, объект которого находится в текущих координатах мыши. Назначать передачу сообщений можно и по другим событиям. События лучше отправлять в формате винды, чтобы потом не морочиться с несовместимостью.

READ ALSO
Как получить символ utf8 из std::string?

Как получить символ utf8 из std::string?

Допустим есть std::stringКодировка utf8

176
Ключевое слово `auto`

Ключевое слово `auto`

Что значит ключевое слово auto в с++ и где оно применяется?

194
Не компилируется драйвер RT5572 на Raspberry PI

Не компилируется драйвер RT5572 на Raspberry PI

Не получается скомпилировать драйвер для WI-Fi usb: rt5572stako

292