Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7

Виндовые диалоги ведут себя неадекватно

24.03.2018, 11:14. Показов 891. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я программирую на ассемблере, но суть вопроса не в языке, а в самой винде.
Обнаружил такую странность виндовых диалогов типа меседжбокс и открытия/сохранения файлов (наверно и другие ведут себя так же): если во время диалога закрывается любое окно приложения, вместе с ним закрывается и диалог. Смысла такого поведения я не понимаю.

Я сделал самодельное контекстное меню - окошко WS_POPUP, в нём рисую пункты меню, контролирую координаты, события мыши и т.д. При выборе какого-то пункта, окошко закрывается. Если из моего меню вызывается диалог открытия файлов - он даже не успевает отрисоваться, CommDlgExtendedError выдаёт 65535 - диалог отменён пользователем. Если не закрывать окно меню - диалог работает нормально, но это некрасиво - меню, по выбору пункта должно исчезать.

Может кто знает как сделать так чтобы диалог не закрывался когда закрываются другие окна?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2018, 11:14
Ответы с готовыми решениями:

Програма неадекватно себя ведет
Доброго время суток , помогите пожалуйста с кодом... Тут такое дело - програма запрашивает длинну и высоту стены( ширина 2 едигицы ) ...

Циклы ведут себя как-то странно
#include <iostream> using namespace std; int main() { float A={1,2,3,4,5,6,7,8,9,10}; float MAX=0; int I; int sum=0; ...

Inet_ntoa() и cout странно ведут себя вместе
Привет, господа и дамы. Возникла очень не понятная для такого смертного обывателя, как я, ситуация. Есть кусочек кода, который сравнивает...

8
Эксперт CЭксперт С++
 Аватар для liv
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
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
24.03.2018, 15:06
Цитата Сообщение от selger Посмотреть сообщение
никакой логикой это не объяснить
Был бы код, можно и объяснить
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 7
24.03.2018, 18:38  [ТС]
Сделал дочернее окно со своим собственным классом и процедурой обработки сообщений. Всё равно, если оно закрывается во время виндового диалога, диалог закрывается вместе с ним. А ведь диалогу было указано что он связан с главным окном.

Что ещё может быть? Была мысль что винда помнит из обработки сообщения какого окна
был вызван диалог, и, если это окно закрывается, считает что диалог был прерван пользователем. Но, я и это проверил. Запустил диалог через сообщение главному окну. Тоесть диалог запустился в процессе главного окна, однако, по закрытию дочернего он всё равно закрылся.

Добавлено через 2 часа 1 минуту
Проблема решена. Диалог вызываю через задержку после закрытия окна меню. Достаточно всего 1 мс - лишь бы успели отработать DestroyWindow и PostQuitMessage.

Вобщем, как я и говорил в самом начале - винда закрывает диалог/месседжбокс если во время диалога закрывается ЛЮБОЕ окно в приложении. Это ФАКТ, подтверждённый экспериментально.

Ну, а кому интересно на мой код глянуть - пожалуйста. Вот так выглядит моё экспериментальное меню:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
МЕНЮ Меню_панели_инструментов ;указанный лэйбл будет назначен где-то в инициируемой секции данных и под ним будет список указателей на данные элементов меню, которые сформируются макросами ПУНКТ_МЕНЮ
;Макросу ПУНКТ_МЕНЮ указывается текст на строке меню, а за макросом должен быть код, выполняемый по выбору данного пункта (ret не нужно)
 
ПУНКТ_МЕНЮ 'Пункт меню 1'
  call Тестовое_окно
  ;ret стоит в начале макроса ПУНКТ_МЕНЮ
ПУНКТ_МЕНЮ 'Пункт меню 2'
  call Закрыть_форму ;закрывается текущее окно (сообщение которому обрабатывается)
  ВЫПОЛНИТЬ_ЧЕРЕЗ_ЗАДЕРЖКУ 10 ;нижеследующий код выполнится через заданное число миллисекунд по сообщению WM_TIMER главному окну
  call Диалог_сохранения_файла
  ;ЗАПУСТИТЬ_ЧЕРЕЗ_СООБЩЕНИЕ Диалог_сохранения_файла
ПУНКТ_МЕНЮ 'Пункт меню 3'
  call Закрыть_форму
  ВЫПОЛНИТЬ_ЧЕРЕЗ_ЗАДЕРЖКУ 10
  СООБЩИТЬ 'выбран четвёртый пункт меню' ;месседжбокс с кнопкой Да
ПУНКТ_МЕНЮ 'Пункт меню 4'
  call Закрыть_форму
  ВЫПОЛНИТЬ_ЧЕРЕЗ_ЗАДЕРЖКУ 10
  ПОДТВЕРДИТЬ 'выбран третий пункт меню' ;месседжбокс с кнопками Да и Отмена
МЕНЮ_END
Только от асма (FASM) тут ничего кроме call нету.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.03.2018, 22:31
Помогаю со студенческими работами здесь

Динамически созданные компоненты ведут себя так, будто их высота больше, чем есть
Всем доброго здравия :) Проблемка из области "истина где-то рядом"... Динамически создаю компоненты VLC TImage и TLabel,...

Неадекватно ведут себя shell скрипты
Имеется такой скрипт: #!/bin/sh # Вписать сюда адрес электронной почты EMAIL=example@gmail.com echo "Адрес электронной...

Ярлыки ведут себя неадекватно на рабочем столе
Подскажите пожалуйста,что это за глюк такой странный?стоит win7 x32 sp1 разрешение экрана было 1024х768,месяц назад ярлыки на рабочем столе...

Телефон ведет себя неадекватно
Всем доброго времени суток! Столкнулся со следующей проблемой: сначала в телефоне перестала работать камера, она просто не открывалась,...

DNS ведет себя неадекватно
Есть два домена, настроены доверительные отношения. Один из четырех КД первого домена стоит в отделении конторы и вынесен в отдельный сайт....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru