61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
1

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

24.08.2009, 13:53. Показов 3687. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2009, 13:53
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

WinXP SP3, MS Visual Studio 2008, C++, проект MFC dialog based.
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 08:22 7
Доступа к родительскому окну до завершения процесса из дочернего немодального окна в приведенном ниже примере нет.
Даю как вариант:
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
61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 09:36  [ТС] 8
Не, не получается.
Вырисовывается пустое окно, без кнопок и прогрессбара.
Хотя закрывается само
Задержку увеличивал до 30 сек.
Не прорисовывается ничего.
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 10:02 9
Как вариант привожу пример для модального окна:
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
61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 11:22  [ТС] 10
Цитата Сообщение от valeriikozlov Посмотреть сообщение
6. В нашем вновь созданном классе перегружаем функцию OnInitDialog(), функцию OnTimer(UINT nIDEvent) и функцию OnOK().

C OnTimer и OnOK разобрался, тут легко.
А вот как "перегружаем функцию OnInitDialog()" ?
Не найду. Автоматом не прописывается нигде.
Прописал вручную, видимо где-то накосячил. Стоп по переполнению стека при открытии.
BOOL СMyDialog::OnInitDialog()
{
СMyDialog::OnInitDialog();
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
25.08.2009, 11:58 11
В заголовочном файле в разделе 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
61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 12:16  [ТС] 12
Ну наконец-то!
Всё работает. Основа есть, буду доделывать.
Огромное спасибо.
Удачи.
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2009, 13:14 13
Цитата Сообщение от 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
61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
25.08.2009, 13:41  [ТС] 14
Цитата Сообщение от novi4ok Посмотреть сообщение
ostorozhno, pohozhe, 4to v vashej zadumke vashe 2e okno, obrabatyvaja messages mozhet kak raz vyzvat' Прерывание записи. ved' vsjo bezhit v edinom thread.
Возможно. Но СОМ порт работает жутко медленно, не думаю, что может повлиять. Но всё равно спасибо, буду иметь ввиду.
0
Заблокирован
Автор FAQ
26.08.2009, 09:30 15
Нет ничего проще - добавляем обработчик события 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 16
Как вариант, грохнуть из другого потока.
0
Заблокирован
Автор FAQ
26.08.2009, 17:49 17
Вот проект прогрес окошка. Работает так: в основном окне нажимаем ОК - появляется окошко прогресса, дальше всё видно воочию...
Вложения
Тип файла: rar test_140.rar (11.3 Кб, 21 просмотров)
Тип файла: rar test_140.exe.rar (4.2 Кб, 16 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2009, 17:49

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

Как сделать модальное окно
Необходимо реализовать простейшее модальное окно. Пример...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.