Хочу сделать свой GUI, но вначале хотелось бы узнать как это делается. Вот например в винде у нас куча всяких окошек, кнопок, менюшек и т.д. - как винда узнает над каким из них мышь? неужели при перемешении проверяется попадание курсора в каждый из объектов (то, что есть иерархия: окна, на них панели, на них кнопки - в счет не идет - допустим есть форма и 1000 кнопок на ней, как в сапере))))
Она наверняка записывает все хэндлы окон отображаемых в данный момент в какую нибудь хэш-таблицу или как там ее ну а далее, перебирает и смотрит, что есть координаты курсора, что есть координаты окон. P. S. вообще смотрите исходники Windows.
или Linux'a, что может оказаться доступней, или SOLAR'a которые есть на сайте, что может оказаться ловчее - ну что можно увидеть в исходниках винды? - кучу скобок и обращения к функциям из сишных библиотек - с познавательной точки зрения ценность таких исходников - 0.
Почтупает прерывание от мыши. С координатами. Дальше идет проверка на поподание коррдинаты мыши в окно. Далее код поподает в обработчик сообщений данного окна. Обработчик находиться в коде приложения. Далее в этом обработчике идет проверка на поподание в меню в обработчике меню идет проверка поподание на кнопку. В приложение проверяют поподание точки на контролл через процедуру pointinrect. А вот как внутри ОС самой проверяется проверка незнаю. Предпологаю что идет перебор окон и проверки поподаниие в регион окна. В КолибриОС проверка поподание точки в окно осуществляется так. Есть байтовая карта экрана. При отрисовки экрана на нее выводиться номер окна. И проверка поподание в окно осуществляется как взятие числа которое записанно в байтовой карте по координатам x,y. Тут у КолибреОС недоработка так как тем самым они ограничели себя в 256 программ. Моно было сделать больше взяв не по байту на пиксель а по два. Правда при таком подходе нужно много памяти хотя ее и так много.Зато работает быстрее нежели чем проверять поподание точки в регион ока. Правда при отрисовке окна тратиться время. Процедура setPixel у них так запрограмированна.