Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Baton от 06-12-2018, 01:09:11

Название: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 01:09:11
Здравствуйте всем!
Проблема такая. Необходимо сразу после открытия диалогового окна начать выводить лог работы программы в объект CAcUiListCtrl без каких-либо дополнительных действий пользователя. Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список. Прошу у сообщества помощи.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 01:12:58
Окно модальное или нет?
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 09:19:40
Окно модальное или нет?
Окно модальное.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Николай Горлов от 06-12-2018, 09:24:38
Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список.
а что не так с функцией окна OnInitDialog()? В ней для модальных окон как-раз описывается начальное "заполнение" диалога.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 14:44:15
а что не так с функцией окна OnInitDialog()?
Функция окна OnInitDialog() готовит все элементы окна ДО открытия диалогового окна. Я ставил марки в начале функции OnInitDialog() и в конце. Так вот - открытие диалога происходит при выходе из функции  OnInitDialog(). Мне же надо ПОСЛЕ открытия окна выводить свою информацию в процессе работы программы, чтобы пользователь мог видеть этот процесс.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 14:46:39
Так вот - открытие диалога происходит при выходе из функции  OnInitDialog().
И модальный диалог после этого ждёт от пользователя реакции и "выводить информацию" может только как реакцию на действия пользователя...
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 14:52:09
Александр Ривилис
Получается, что проблему не решить?
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 14:55:06
Александр Ривилис
Получается, что проблему не решить?
Если бы я понимал что это за окно... Например, текстовое окно AutoCAD, куда выводится информация - это немодальное окно.
Теоретически и в модальном окне можно организовать какое-нибудь событие. Например, по таймеру обновлять окно...
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Николай Горлов от 06-12-2018, 15:06:22
я сначала подумал, что должен произойти ряд действий, а потом появляется окно с логом. раз это не так, то:
1. мы договорились, что окно модальное.
2. лог работы программы в модальном окне возможен только если само выполнение каких-то действий (например, расчет или отрисовка) идет отдельным потоком (насколько я помню - в автодеске отказались от этого геморр... от этой возможности)
3. если под логом работы подразумевается, что напишется "пользователь нажал кнопку Ок в данном окне" или "пользователь передвинул мышку с координат ... в координаты ...", или "пользователь не проявляет активности уже 30 минут, замените пользователя :)", то это можно и через PreTranslateMessage() сделать.

Во всех остальных случаях нужно немодальное окно, которое будет тихохонько висеть в сторонке и не мешать пользователю клацать в автокаде. А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 15:12:46
Александр Ривилис
Немодальное окно мне не нужно. Программа работает так: пользователь вводит в неком модальном диалоговом окне некие данные для последующего изменения объектов программы. При нажатии на ОК программа начинает изменять эти объекты. Я хочу после нажатия на кнопку ОК вывести следующее модальное диалоговое окно, которое будет показывать процесс изменения объектов. Процесс этот может быть не быстрым, так как программа имеет возможность параллельно изменять связанные объекты программы в других файлах, а открытие других файлов в фоновом режиме и работа в них занимает определенное время. Если не показывать процесс выполнения, окно просто зависает на неопределенное время, чего я хотел избежать.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 15:16:45
Немодальное окно мне не нужно.
Судя по описанию именно такое окно и нужно. Или какой-то индикатор прогресса. Если запустить модальный диалог, то он и будет висеть и ждать действия пользователя. Работа AutoCAD в этом же потоке будет невозможна. А запускать работу с AutoCAD в другом потоке нельзя, так как его API "непотокобезопасное".
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 15:18:25
А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.
Программа обрабатывает мои объекты как в текущем чертеже, так и одновременно в других чертежах, на которые ссылаются мои объекты. Поэтому было бы полезно видеть пользователю, какой файл в данный момент открывается и какие объекты изменяются, успешно это делается или есть какие-то проблемы. Конечно это можно сделать как итог работы в самом конце, но показать процесс намного интереснее. Да и пользователь в процессе работы программы не будет тупо смотреть на зависший экран и не понимать что  происходит.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 15:50:33
Baton,
Если использовать модальное диалоговое окно, то оно должно быть не в основном потоке AutoCAD. Хотя смысла делать его модальным я не вижу никакого. Если окно нужно только для вывода информации, то прекрасно подойдёт немодальное окно.
Пример есть в ObjectARX SDK: samples\editor\mfcsamps\modeless
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Николай Горлов от 06-12-2018, 18:26:05
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Александр Ривилис от 06-12-2018, 18:33:21
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)
Есть еще вариант вместо таймера посылать диалогу WM_KILLIDLE: http://www.drdobbs.com/wmkickidle-for-updating-mfc-dialog-contr/184416462
Думаю, что даже если этот диалог будет в отдельном потоке, то это тоже можно делать. А в основном потоке будет работа с чертежами и отсылка WM_KILLIDLE диалогу, чтобы он обновлял себя.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 06-12-2018, 21:20:44
Николай Горлов
Спасибо за наводку с таймером! С таймерами работал для других целей, так что разберусь. Попробую прикрутить к моей программе Ваше решение. По результатам отпишусь.
Название: Re: Как заставить диалоговое окно работать сразу после открытия.
Отправлено: Baton от 07-12-2018, 00:43:09
Николай Горлов
Все получилось. Программа работает, лог выводится. Спасибо за помощь!!! Не думаю, что сам бы догадался через таймер решить проблему.