Привет всем,
имеется большое кроссплатформенное приложние, написанное при помощи бесплатной (опять-таки кроссплатформенной) графической библиотеки FLTK.
В библиотеке FLTK есть у класса Fl_Window (описывающего окно) метод show(). При вызове метода show на win32 библиотека создает окно при помощи CreateWindowEx, соответственно при вызове метода hide, окно (как GDI объект) уничтожается.
В приложении имеется окно. Я создаю окно-дитя данного окна в тестовой программе. Вызываю show, — окно-дитя отображается, отрисовывается и ловит сообщения без проблем.
Создаю окно-дитя (тот же класс) в реальном приложении. Метод show виснет. Как выяснилось после трейса, виснет вызов CreateWindowEx.
Подскажите, знатоки, из-за чего в принципе может виснуть CreateWindowEx? hWndParent, который туда передается, — реальный HWND окна-родителя. Больше идей у меня нет
спасибо.
Здравствуйте, Sergei I. Gorelkin, Вы писали:
SIG>Здравствуйте, Corvin, Вы писали:
SIG><skipped>
SIG>CreateWindowEx не только создает окно, но и посылает ему сообщения WM_NCCREATE, WM_CREATE (возможно, и не только их). Поэтому, если что-то напортачено в оконной процедуре, то может и повиснуть. В самой FLTK, конечно, вряд ли будут столь грубые глюки, но наверняка она вызывает какой-то пользовательский код для инициализации окна.
Добавлю.
CreateWindowEx производит еще некий обмен сообщением между создаваемым дочерним и его родительским окном. Операция может подвиснуть, если эти окна в разных потоках. Например, родительское окно живет в основном потоке. Далее запускается рабочий поток, который создает дочернее окно (пример — длительная операция в рабочем потоке с отображением прогресс-бара на главном фрейме). Если основной поток просто ждет завершения рабочего потока (без цикла сообщений), то операция создания дочернего окна зависнет — CreateWindowEx не сможет отправить сообщение в родительское окно. Нужно обеспечить (хотя бы кратковременный) цикл сообщений в основном потоке.