Использую GTK 14.4 .0, Qt-4.8.7 и MinGW-4.9.2-i686 При использовании функций типа mapBuildMtw или LoadSxfToMap последним параметром указывается идентификатор окна для отсылки сообщений прогресса обработки: (..., (HWND)winId()) Далее в диалоге реализую обработчик winEvent(MSG*, long), в котором проверяю MSG->message == 0x0585 и получаю процент выполнения из MSG->wParam
Вроде все прекрасно. Но при использовании Qt-5.14 и MinGW-7.3.0 такая схема не работает - обработчик winEvent ни разу не вызывается. Причем и для x86 и для x64 версий.
Подскажите, как при использовании Qt5 обрабатывать события прогресса обработки или в чем может быть проблема?
mapBuildMtw передает процент выполнения с помощью сообщения 0x0581, см. описание:
Скрытый текст
Цитата
// Построение матрицы по векторной карте на заданный участок района работ // При ошибке возвращает ноль // hMap - исходная карта для построения матрицы // mtrname - полное имя создаваемой матрицы // filtername - полное имя фильтра объектов // Вместе с картой может располагаться фильтр объектов - // текстовый файл MTRCREA.IMH, содержащий перечень кодов // объектов, используемых при построении матрицы (см. MAPAPI.DOC) // Если filtername равно нулю - фильтр объектов не используется // mtrparm - параметры создаваемой матрицы, // handle - идентификатор окна диалога, которому посылаются // сообщения о ходе процесса : // 0x0581 - сообщение о проценте выполненных работ (в WPARAM), // если процесс должен быть принудительно завершен, в ответ // должно вернуться значение 0x0581. // Если handle равно нулю - сообщения не посылаются. // Параметр LPARAM (не равный 0) сообщения о ходе процесса содержит номер // этапа построения матрицы : // 1 - Заполнение матрицы абсолютными высотами объектов // 2 - Обработка объектов гидрографии с постоянной высотой // 3 - Обработка объектов гидрографии с переменной высотой // 4 - Обработка точечных объектов с абсолютной высотой // 5 - Определение минимальной и максимальной высоты // 6 - Вычисление незаполненных элементов матрицы // 9 - Заполнение матрицы относительными высотами объектов // 10 - Создание матрицы выполнено // 11 - Создание матрицы не выполнено // 13 - Обработка пустых замкнутых горизонталей // 14 - Вычисление элементов матрицы по сетке высотных точек // 15 - Построение сетки треугольников по высотным точкам // 16 - Сжатие матрицы // 17 - Вычисление высот по трехмерной метрике площадных объектов
_MAPIMP long int _MAPAPI mapBuildMtw(HMAP hMap, const char *mtrname, const char *filtername, BUILDMTW *mtrparm, HWND handle); _MAPIMP long int _MAPAPI mapBuildMtwUn(HMAP hMap, const WCHAR *mtrname, const WCHAR *txtname, BUILDMTW *mtrparm, HWND handle);
При загрузке из SXF отсылаются следующие сообщения:
Цитата
#define WM_INFOLIST 0x584 // Информация о листе #define WM_OBJECT 0x585 // Смена объекта (wparam = % выполнения, lparam = число обработанных элементов) #define WM_ERROR 0x587 // Информация об ошибках для записи в журнал #define WM_ERRORSXF WM_ERROR // Информация об ошибках обработки SXF
Если на одной и той же версии ГИС-ядра в Qt4 всё работает, а в Qt5 - нет, напрашивается вывод, что проблема снаружи. Если обработчик не заходит в winEvent совсем (ни с каким кодом сообщения), значит, сообщения либо не отправляются, либо отправляются не тому HWND.
Как запрашивается и передается HWND? winEvent - это метод класса или отдельная оконная функция?