Сообщество программистов Autodesk в СНГ
ADN Club => ObjectARX => Тема начата: Baton от 06-12-2018, 01:09:11
-
Здравствуйте всем!
Проблема такая. Необходимо сразу после открытия диалогового окна начать выводить лог работы программы в объект CAcUiListCtrl без каких-либо дополнительных действий пользователя. Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список. Прошу у сообщества помощи.
-
Окно модальное или нет?
-
Окно модальное или нет?
Окно модальное.
-
Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список.
а что не так с функцией окна OnInitDialog()? В ней для модальных окон как-раз описывается начальное "заполнение" диалога.
-
а что не так с функцией окна OnInitDialog()?
Функция окна OnInitDialog() готовит все элементы окна ДО открытия диалогового окна. Я ставил марки в начале функции OnInitDialog() и в конце. Так вот - открытие диалога происходит при выходе из функции OnInitDialog(). Мне же надо ПОСЛЕ открытия окна выводить свою информацию в процессе работы программы, чтобы пользователь мог видеть этот процесс.
-
Так вот - открытие диалога происходит при выходе из функции OnInitDialog().
И модальный диалог после этого ждёт от пользователя реакции и "выводить информацию" может только как реакцию на действия пользователя...
-
Александр Ривилис
Получается, что проблему не решить?
-
Александр Ривилис
Получается, что проблему не решить?
Если бы я понимал что это за окно... Например, текстовое окно AutoCAD, куда выводится информация - это немодальное окно.
Теоретически и в модальном окне можно организовать какое-нибудь событие. Например, по таймеру обновлять окно...
-
я сначала подумал, что должен произойти ряд действий, а потом появляется окно с логом. раз это не так, то:
1. мы договорились, что окно модальное.
2. лог работы программы в модальном окне возможен только если само выполнение каких-то действий (например, расчет или отрисовка) идет отдельным потоком (насколько я помню - в автодеске отказались от этого геморр... от этой возможности)
3. если под логом работы подразумевается, что напишется "пользователь нажал кнопку Ок в данном окне" или "пользователь передвинул мышку с координат ... в координаты ...", или "пользователь не проявляет активности уже 30 минут, замените пользователя :)", то это можно и через PreTranslateMessage() сделать.
Во всех остальных случаях нужно немодальное окно, которое будет тихохонько висеть в сторонке и не мешать пользователю клацать в автокаде. А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.
-
Александр Ривилис
Немодальное окно мне не нужно. Программа работает так: пользователь вводит в неком модальном диалоговом окне некие данные для последующего изменения объектов программы. При нажатии на ОК программа начинает изменять эти объекты. Я хочу после нажатия на кнопку ОК вывести следующее модальное диалоговое окно, которое будет показывать процесс изменения объектов. Процесс этот может быть не быстрым, так как программа имеет возможность параллельно изменять связанные объекты программы в других файлах, а открытие других файлов в фоновом режиме и работа в них занимает определенное время. Если не показывать процесс выполнения, окно просто зависает на неопределенное время, чего я хотел избежать.
-
Немодальное окно мне не нужно.
Судя по описанию именно такое окно и нужно. Или какой-то индикатор прогресса. Если запустить модальный диалог, то он и будет висеть и ждать действия пользователя. Работа AutoCAD в этом же потоке будет невозможна. А запускать работу с AutoCAD в другом потоке нельзя, так как его API "непотокобезопасное".
-
А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.
Программа обрабатывает мои объекты как в текущем чертеже, так и одновременно в других чертежах, на которые ссылаются мои объекты. Поэтому было бы полезно видеть пользователю, какой файл в данный момент открывается и какие объекты изменяются, успешно это делается или есть какие-то проблемы. Конечно это можно сделать как итог работы в самом конце, но показать процесс намного интереснее. Да и пользователь в процессе работы программы не будет тупо смотреть на зависший экран и не понимать что происходит.
-
Baton,
Если использовать модальное диалоговое окно, то оно должно быть не в основном потоке AutoCAD. Хотя смысла делать его модальным я не вижу никакого. Если окно нужно только для вывода информации, то прекрасно подойдёт немодальное окно.
Пример есть в ObjectARX SDK: samples\editor\mfcsamps\modeless
-
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)
-
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)
Есть еще вариант вместо таймера посылать диалогу WM_KILLIDLE: http://www.drdobbs.com/wmkickidle-for-updating-mfc-dialog-contr/184416462
Думаю, что даже если этот диалог будет в отдельном потоке, то это тоже можно делать. А в основном потоке будет работа с чертежами и отсылка WM_KILLIDLE диалогу, чтобы он обновлял себя.
-
Николай Горлов
Спасибо за наводку с таймером! С таймерами работал для других целей, так что разберусь. Попробую прикрутить к моей программе Ваше решение. По результатам отпишусь.
-
Николай Горлов
Все получилось. Программа работает, лог выводится. Спасибо за помощь!!! Не думаю, что сам бы догадался через таймер решить проблему.