Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/23: Рейтинг темы: голосов - 23, средняя оценка - 4.70
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520

Как сделать, чтобы модальное окно закрылось по условию?

24.08.2009, 13:53. Показов 4896. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предполагается модальное диалоговое окно ProgressSave с прогресс баром и кнопкой ОК.
Надо чтобы по завершении прогресса окно само закрылось и передало управление основной программе. Прогресс ещё не создавал, это потом. Главное - отрепетировать закрывание окна.
В качестве эксперимента использую цикл for.
Такой код вызывает ошибку. вот эту: http://www.sharemania.ru/0200321
(окно уже открыто, код из него. Пробовал всё, что закомментировано)
C++
1
2
3
4
5
6
7
8
9
10
11
12
CProgressSave::CProgressSave(CWnd* pParent /*=NULL*/) 
: CDialog(CProgressSave::IDD, pParent) 
{ 
int i; 
for (i=0;i<10000000;i++); 
OnOK(); 
//CWnd::CloseWindow(); 
//ExitProcess; 
//Exit; 
//::exit; 
//EndDialog(IDOK); 
}
Как поступить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2009, 13:53
Ответы с готовыми решениями:

Как сделать, чтобы не закрывалось окно командной строки?
после исполнения оно закрывается. Не посмотреть результат(((

Как сделать, чтобы окно выполнения сразу не закрывалось?
помогите пожалуйста, после компиляции при выполнении окно очень быстро пропадает. как сделать что бы оно сразу не закрывалось?

MessageBox: Как сделать так, чтобы если окно модальное, при клике на родительское окно MessageBox мигал?
Здравия всем! Никак не найду нужный MB_*, как можно сделать так, чтобы если сделать MessageBox модальным, при клике по родительскому...

16
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.08.2009, 14:30
Вы хотите закрыть окно еще не создав?Прямо в консткурторе?

Добавлено через 10 минут
Вам важдно только чтобы диалог закрылся или он обязательно должен вернуть IDOK?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 05:34
Если коротко, то в конструкторе CProgressSave не надо вызывать функции закрытия модального окна. Лучше сделайте так: или перегрузите функцию OnOk() и в ней вызывайте Ваши условия или создайте свою функцию, в которой проверяйте необходимые условия и в ней же вызывайте любую из перечисленных Вами функций зыакрытия модального окна.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 05:43  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
или перегрузите функцию OnOk() и в ней вызывайте Ваши условия...
А это как? Простите, я начинающий программист. Можно кусок кода для примера?

2novi4ok: По большому счету, мне надо создать любое модальное окно, чтобы оно через 1 сек. само себя закрыло. Мне бы с механизмом разобраться. Дальше я сам. А что оно вернёт - ОК или нет - по барабану.

А то что я написал выше вообще должно работать? Мож у меня компилятор тупит?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 07:22
Каким компилятором пользуетесь?
Обязательно ли окно должно быть модальным? Как я понял из последнего сообщения окно может быть и не модальным (для Вашей задачи окно как раз и должно быть немодальным).
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 07:45  [ТС]
Задача полностью:
Делаю прогу для прошивки Flash памяти прибора через СОМ порт.
Прошивка ведётся обычной командой WriteFile, файл отправляется целиком, побайтная отправка не поддерживается. Прерывание записи грозит понятно чем.
Хочу визуализировать процесс записи посредством прогрессбара.
Т.к. при работе WriteFile таймер окна не работает, делаю отдельное окно со своим таймером и прогрессбаром. (хотя не уверен, будет ли так работать).
Лучше модальное, чтоб небыло доступа к родительскому окну до завершения процесса.
По окончании оно закрывается. Всё.

WinXP SP3, MS Visual Studio 2008, C++, проект MFC dialog based.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 08:22
Доступа к родительскому окну до завершения процесса из дочернего немодального окна в приведенном ниже примере нет.
Даю как вариант:
1. Создаем проект MFC dialog based.
2. В ресурсах на диалоговом окне создаем кнопку и функцию нажатия на нее.
3. Там же в ресурсах создаем новое диалоговое окно с идентификатором (IDD_DIALOG1).
4. В функции нажатия на кнопку пишем:
C++
1
2
3
4
5
6
CDialog* pDialog;
pDialog = new CDialog();
pDialog->Create(IDD_DIALOG1,this);
pDialog->ShowWindow(SW_SHOW);
Sleep(1000); // задержка на 1000 миллисекунд
pDialog->DestroyWindow();
Код привожу без положенных проверок.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 09:36  [ТС]
Не, не получается.
Вырисовывается пустое окно, без кнопок и прогрессбара.
Хотя закрывается само
Задержку увеличивал до 30 сек.
Не прорисовывается ничего.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 10:02
Как вариант привожу пример для модального окна:
1. Создаем проект MFC dialog based.
2. В ресурсах на диалоговом окне создаем кнопку и функцию нажатия на нее.
3. Там же в ресурсах создаем новое диалоговое окно.
4. В функции нажатия на кнопку пишем:
C++
1
2
CMyDialog Cmy;
Cmy.DoModal();
5. Через мастер ClassWizard создаем наш класс с именем CMyDialog на базе созданного нами в ресурсах диалогового окна.
6. В нашем вновь созданном классе перегружаем функцию OnInitDialog(), функцию OnTimer(UINT nIDEvent) и функцию OnOK().
7. В начале файла реализации класса нашего диалогового окна добавляем строку: #define ID_TIMER_1 200
8. В функции OnInitDialog() внутрение строки переписываем в таком виде:
C++
1
2
3
CDialog::OnInitDialog();
SetTimer(ID_TIMER_1,1000,NULL); // в этой строке 1000 миллисекунд - задержка модального окна на экране
return TRUE;
9. В функции OnTimer(UINT nIDEvent) внутренние строки переписываем в таком виде:
C++
1
2
OnOK();
CDialog::OnTimer(nIDEvent);
10. Чуть не забыл последнее: В файле реализации основого диалогового окна, там где у нас функция нажатия на кнопку в начале файла добавить строку: #include "MyDialog.h"

Модальное диалоговое окно закрывает само себя через 1000 миллисекунд.

Добавлено через 4 минуты
А предыдущее окно (которое немодальное) чтобы показывало кнопки, прогрессбар нужно это окно делать отдельным классом, в том классе заводить на прогрессбар переменную, на кнопки функции реализации нажатия на кнопки (в общем еще много чего делать надо, я только показал как нужно показывать окно на какое либо время и что бы оно само закрывалось).
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 11:22  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
6. В нашем вновь созданном классе перегружаем функцию OnInitDialog(), функцию OnTimer(UINT nIDEvent) и функцию OnOK().

C OnTimer и OnOK разобрался, тут легко.
А вот как "перегружаем функцию OnInitDialog()" ?
Не найду. Автоматом не прописывается нигде.
Прописал вручную, видимо где-то накосячил. Стоп по переполнению стека при открытии.
BOOL СMyDialog::OnInitDialog()
{
СMyDialog::OnInitDialog();
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 11:58
В заголовочном файле в разделе protected:
C++
1
virtual BOOL OnInitDialog();//объявляем функцию
В файле реализации:
C++
1
2
3
4
5
6
BOOL СMyDialog::OnInitDialog() 
{
    CDialog::OnInitDialog();
    SetTimer(ID_TIMER_1,1000,NULL);
    return TRUE; 
}
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 12:16  [ТС]
Ну наконец-то!
Всё работает. Основа есть, буду доделывать.
Огромное спасибо.
Удачи.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2009, 13:14
Цитата Сообщение от DrMcSheen Посмотреть сообщение
Прошивка ведётся обычной командой WriteFile, файл отправляется целиком, побайтная отправка не поддерживается. Прерывание записи грозит понятно чем.
...
Т.к. при работе WriteFile таймер окна не работает, делаю отдельное окно со своим таймером и прогрессбаром. (хотя не уверен, будет ли так работать).
Лучше модальное, чтоб небыло доступа к родительскому окну до завершения процесса.
По окончании оно закрывается. Всё.
ostorozhno, pohozhe, 4to v vashej zadumke vashe 2e okno, obrabatyvaja messages mozhet kak raz vyzvat' Прерывание записи. ved' vsjo bezhit v edinom thread.
0
 Аватар для DrMcSheen
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 13:41  [ТС]
Цитата Сообщение от novi4ok Посмотреть сообщение
ostorozhno, pohozhe, 4to v vashej zadumke vashe 2e okno, obrabatyvaja messages mozhet kak raz vyzvat' Прерывание записи. ved' vsjo bezhit v edinom thread.
Возможно. Но СОМ порт работает жутко медленно, не думаю, что может повлиять. Но всё равно спасибо, буду иметь ввиду.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.08.2009, 09:30
Нет ничего проще - добавляем обработчик события WM_SHOWWINDOW и в теле обработчика прописываем SetTimer - не в InitDialog !!!!А в теле обработчика OK перед строчкой
СMyDialog::OnOK() прописываем строчечку
KillTimer(1);Т.е. чтоб до разрушения окна таймер остановить
C++
1
2
3
4
5
void СMyDialog::OnOK() 
{
    KillTimer(1);
    СMyDialog::OnOK() ;
}
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
26.08.2009, 14:38
Как вариант, грохнуть из другого потока.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.08.2009, 17:49
Вот проект прогрес окошка. Работает так: в основном окне нажимаем ОК - появляется окошко прогресса, дальше всё видно воочию...
Вложения
Тип файла: rar test_140.rar (11.3 Кб, 21 просмотров)
Тип файла: rar test_140.exe.rar (4.2 Кб, 16 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2009, 17:49
Помогаю со студенческими работами здесь

Как сделать, чтобы видео с ютуба помещенное на сайт, не перекрывало модальное окно?
Дело такое - загрузил видео с ютуба на сайт - http://capitalperm.com через iframe как обычно, но потом заметил что модальное окно, которое...

Как перейти на второе окно, что бы первое окно закрылось (NetBeans)
Здравствуйте. Работаю с NetBeans. Например: запускаю программу, открывается окно, нажимаю кнопку на этом окне: запускается новое окно,...

Как сделать модальное окно
Необходимо реализовать простейшее модальное окно. Пример http://www.sotmarket.ru/product/huawei_mediapad.html# (кнопка «купить за один...

Как сделать,автоматическое модальное окно?)
&lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;/body&gt; &lt;/html&gt;

Блокирующее Модальное окно как сделать?
Есть окно Обыкновенный JFrame. Form1, Form2 На нем Form1 кнопка которая открывает Form2. Но при этом надо блокировать выполнение...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru