Как заставить диалоговое окно работать сразу после открытия.

Автор Тема: Как заставить диалоговое окно работать сразу после открытия.  (Прочитано 7885 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Здравствуйте всем!
Проблема такая. Необходимо сразу после открытия диалогового окна начать выводить лог работы программы в объект CAcUiListCtrl без каких-либо дополнительных действий пользователя. Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список. Прошу у сообщества помощи.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Окно модальное или нет?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Не могу найти события окна, которое бы сигнализировало, что окно уже открыто, видно пользователю и можно начинать выводить данные в список.
а что не так с функцией окна OnInitDialog()? В ней для модальных окон как-раз описывается начальное "заполнение" диалога.

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
а что не так с функцией окна OnInitDialog()?
Функция окна OnInitDialog() готовит все элементы окна ДО открытия диалогового окна. Я ставил марки в начале функции OnInitDialog() и в конце. Так вот - открытие диалога происходит при выходе из функции  OnInitDialog(). Мне же надо ПОСЛЕ открытия окна выводить свою информацию в процессе работы программы, чтобы пользователь мог видеть этот процесс.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так вот - открытие диалога происходит при выходе из функции  OnInitDialog().
И модальный диалог после этого ждёт от пользователя реакции и "выводить информацию" может только как реакцию на действия пользователя...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Александр Ривилис
Получается, что проблему не решить?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис
Получается, что проблему не решить?
Если бы я понимал что это за окно... Например, текстовое окно AutoCAD, куда выводится информация - это немодальное окно.
Теоретически и в модальном окне можно организовать какое-нибудь событие. Например, по таймеру обновлять окно...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
я сначала подумал, что должен произойти ряд действий, а потом появляется окно с логом. раз это не так, то:
1. мы договорились, что окно модальное.
2. лог работы программы в модальном окне возможен только если само выполнение каких-то действий (например, расчет или отрисовка) идет отдельным потоком (насколько я помню - в автодеске отказались от этого геморр... от этой возможности)
3. если под логом работы подразумевается, что напишется "пользователь нажал кнопку Ок в данном окне" или "пользователь передвинул мышку с координат ... в координаты ...", или "пользователь не проявляет активности уже 30 минут, замените пользователя :)", то это можно и через PreTranslateMessage() сделать.

Во всех остальных случаях нужно немодальное окно, которое будет тихохонько висеть в сторонке и не мешать пользователю клацать в автокаде. А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Александр Ривилис
Немодальное окно мне не нужно. Программа работает так: пользователь вводит в неком модальном диалоговом окне некие данные для последующего изменения объектов программы. При нажатии на ОК программа начинает изменять эти объекты. Я хочу после нажатия на кнопку ОК вывести следующее модальное диалоговое окно, которое будет показывать процесс изменения объектов. Процесс этот может быть не быстрым, так как программа имеет возможность параллельно изменять связанные объекты программы в других файлах, а открытие других файлов в фоновом режиме и работа в них занимает определенное время. Если не показывать процесс выполнения, окно просто зависает на неопределенное время, чего я хотел избежать.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Немодальное окно мне не нужно.
Судя по описанию именно такое окно и нужно. Или какой-то индикатор прогресса. Если запустить модальный диалог, то он и будет висеть и ждать действия пользователя. Работа AutoCAD в этом же потоке будет невозможна. А запускать работу с AutoCAD в другом потоке нельзя, так как его API "непотокобезопасное".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
А вообще, было б неплохо понять, ЧТО будет выводиться в этом окне, чтоб посоветовать что-то дельное.
Программа обрабатывает мои объекты как в текущем чертеже, так и одновременно в других чертежах, на которые ссылаются мои объекты. Поэтому было бы полезно видеть пользователю, какой файл в данный момент открывается и какие объекты изменяются, успешно это делается или есть какие-то проблемы. Конечно это можно сделать как итог работы в самом конце, но показать процесс намного интереснее. Да и пользователь в процессе работы программы не будет тупо смотреть на зависший экран и не понимать что  происходит.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Baton,
Если использовать модальное диалоговое окно, то оно должно быть не в основном потоке AutoCAD. Хотя смысла делать его модальным я не вижу никакого. Если окно нужно только для вывода информации, то прекрасно подойдёт немодальное окно.
Пример есть в ObjectARX SDK: samples\editor\mfcsamps\modeless
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Baton 07-12-2018, 00:43:42

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
если я правильно понял задумку... но всю логику придется писать в классе окна отчета (или по крайней мере вызывать её оттуда)
Есть еще вариант вместо таймера посылать диалогу WM_KILLIDLE: http://www.drdobbs.com/wmkickidle-for-updating-mfc-dialog-contr/184416462
Думаю, что даже если этот диалог будет в отдельном потоке, то это тоже можно делать. А в основном потоке будет работа с чертежами и отсылка WM_KILLIDLE диалогу, чтобы он обновлял себя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение