|
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
|
|
Виндовые диалоги ведут себя неадекватно24.03.2018, 11:14. Показов 891. Ответов 8
Метки нет (Все метки)
Я программирую на ассемблере, но суть вопроса не в языке, а в самой винде.
Обнаружил такую странность виндовых диалогов типа меседжбокс и открытия/сохранения файлов (наверно и другие ведут себя так же): если во время диалога закрывается любое окно приложения, вместе с ним закрывается и диалог. Смысла такого поведения я не понимаю. Я сделал самодельное контекстное меню - окошко WS_POPUP, в нём рисую пункты меню, контролирую координаты, события мыши и т.д. При выборе какого-то пункта, окошко закрывается. Если из моего меню вызывается диалог открытия файлов - он даже не успевает отрисоваться, CommDlgExtendedError выдаёт 65535 - диалог отменён пользователем. Если не закрывать окно меню - диалог работает нормально, но это некрасиво - меню, по выбору пункта должно исчезать. Может кто знает как сделать так чтобы диалог не закрывался когда закрываются другие окна?
0
|
|
| 24.03.2018, 11:14 | |
|
Ответы с готовыми решениями:
8
Програма неадекватно себя ведет Циклы ведут себя как-то странно Inet_ntoa() и cout странно ведут себя вместе |
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 24.03.2018, 11:58 | |
|
selger, попробую предположить, Ваше окно POPUP является родителем для создаваемых окон, поэтому закрытие окна и приводит к закрытию всех дочерних, что в порядке вещей, кстати.
Как вариант, создайте еще одно окно, невидимое, которое будет родителем для всех Ваших окон. Тогда дочерние окна не будут зависеть друг от друга. В общем-то, было бы не лишним посмотреть код...
0
|
|
|
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
|
|
| 24.03.2018, 14:19 [ТС] | |
|
liv, код посмотреть - проблематично... он большой и сложный, я не пользуюсь виндовым GUI, беру от винды только пустое окно POPUP и весь графический интерфес организую сам.
Могу только на словах: главное окно создаю с hParent = 0, все остальные окна - с тем же классом что и главное (майнпроц одна на всех, сама разбирается кому сообщения и т.д.). При создании дочерних (самодельное контекстное меню), hParent = хендл_главного_окна (hWnd_main). При вызове GetOpenFileName, в OPENFILENAME.hwndOwner прописан hWnd_main. Тоесть родителем у диалога является главное окно. Главное окно, естественно никто не закрывает. В процессе обработки клика мыши по меню, перед вызовом GetOpenFileName, я дестрою окно меню, при этом диалог выбора файла закрывается не успев открыться. А если дестрою после выбора файла - всё нормально (но не красиво - окно меню остаётся на экране). Подозреваю, всё дело в том что у меня майнпроц одна и та же и у дочерних и у главного окна, и когда я закрываю дочернее (меню), виндовая функция диалога, по этому признаку, решает что я закрываю главное окно. Но это глюк винды, никакой логикой это не объяснить.
0
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 24.03.2018, 15:06 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
|
||||||
| 24.03.2018, 18:38 [ТС] | ||||||
|
Сделал дочернее окно со своим собственным классом и процедурой обработки сообщений. Всё равно, если оно закрывается во время виндового диалога, диалог закрывается вместе с ним. А ведь диалогу было указано что он связан с главным окном.
Что ещё может быть? Была мысль что винда помнит из обработки сообщения какого окна был вызван диалог, и, если это окно закрывается, считает что диалог был прерван пользователем. Но, я и это проверил. Запустил диалог через сообщение главному окну. Тоесть диалог запустился в процессе главного окна, однако, по закрытию дочернего он всё равно закрылся. Добавлено через 2 часа 1 минуту Проблема решена. Диалог вызываю через задержку после закрытия окна меню. Достаточно всего 1 мс - лишь бы успели отработать DestroyWindow и PostQuitMessage. Вобщем, как я и говорил в самом начале - винда закрывает диалог/месседжбокс если во время диалога закрывается ЛЮБОЕ окно в приложении. Это ФАКТ, подтверждённый экспериментально. Ну, а кому интересно на мой код глянуть - пожалуйста. Вот так выглядит моё экспериментальное меню:
0
|
||||||
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,104
|
|
| 24.03.2018, 18:50 | |
|
А PostQuitMessage разве не для завершения приложения (потока) вызывается?
When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system.
0
|
|
|
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
|
|
| 24.03.2018, 19:51 [ТС] | |
|
Ygg, наверно, при стандартном программировании - да - только для завершения приложения. А у меня свой движок GUI, и в нём создаются списки открытых окон и прочее, и очистить это можно только после WM_DESTROY. Во время обработки WM_DESTROY - не получается, приходится посылать ещё сообщение - и я это делаю через PostQuitMessage. Тем более что у меня одна процедура закрытия и для главного окна и для дочерних (потому что она сложная, двухэтапная, с подтверждениями, и городить её в нескольких экземплярах нехочется). На втором этапе закрытия, с PostQuitMessage я посылаю хендл закрываемого окна, а в цикле выборки, по WM_QUIT если в Msg.wParam пришёл хендл главного окна, то ExitProcess, если другой хендл (который уже не хендл, а просто идентификатор) - то освобождаю всё связанное с этим, уже бывшим окном.
0
|
|
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,104
|
|
| 24.03.2018, 21:42 | |
|
Мне кажется не совсем корректным использовать что-то не по назначению и предъявлять потом претензии к нежелательным последствиям. Можно попробовать WM_NCDESTROY, собственное сообщение или что-то ещё, но WM_QUIT уж больно специфичен.
0
|
|
|
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
|
|
| 24.03.2018, 22:31 [ТС] | |
|
Ygg, Вы правы!
А я зря наехал на наш незаменимый виндовс. Ничего он почём зря не закрывает. А по WM_QUIT - сам бог велел всё закрыть. Короче, передеалал я общую процедуру по WM_DESTROY, теперь она делает PostQuitMessage только для главного окна (а там без разговоров ExitProcess), а для остальных - через PostMessage запускается окончательный завершатель (который раньше, по моему недоразумению делался по WM_QUIT). Теперь никаких задержек времени не нужно. Вобщем, сам себе создал проблему (когда-то давно, но всё работало пока не понадобились диалоги запускать из самодельного меню), героически её решил с помощью изврата с задержкой времени, но, всё же, с Вашей помощью, вышел на путь истинный.
0
|
|
| 24.03.2018, 22:31 | |
|
Помогаю со студенческими работами здесь
9
Динамически созданные компоненты ведут себя так, будто их высота больше, чем есть
Ярлыки ведут себя неадекватно на рабочем столе Телефон ведет себя неадекватно DNS ведет себя неадекватно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|