Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
#1

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

24.08.2009, 13:53. Просмотров 2828. Ответов 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); 
}
Как поступить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2009, 13:53     Как сделать, чтобы модальное окно закрылось по условию?
Посмотрите здесь:
C++ Как сделать, чтобы окно выполнения сразу не закрывалось?
C++ Как сделать, чтобы не закрывалось окно командной строки?
C++ Как сделать так, чтобы окно консоли не сразу закрывалось
C++ Как сделать, чтобы диалоговое окно не закрывалось при нажатии клавиши ENTER?
C++ Как сделать окно (окно домика) в пространстве, как на изображении?
C++ Где инициализируется модальное окно?
Как сделать отдельные записи в таблице по строкам, чтобы сделать запросы? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.08.2009, 14:30     Как сделать, чтобы модальное окно закрылось по условию? #2
Вы хотите закрыть окно еще не создав?Прямо в консткурторе?

Добавлено через 10 минут
Вам важдно только чтобы диалог закрылся или он обязательно должен вернуть IDOK?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.08.2009, 05:34     Как сделать, чтобы модальное окно закрылось по условию? #3
Если коротко, то в конструкторе CProgressSave не надо вызывать функции закрытия модального окна. Лучше сделайте так: или перегрузите функцию OnOk() и в ней вызывайте Ваши условия или создайте свою функцию, в которой проверяйте необходимые условия и в ней же вызывайте любую из перечисленных Вами функций зыакрытия модального окна.
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 05:43  [ТС]     Как сделать, чтобы модальное окно закрылось по условию? #4
Цитата Сообщение от valeriikozlov Посмотреть сообщение
или перегрузите функцию OnOk() и в ней вызывайте Ваши условия...
А это как? Простите, я начинающий программист. Можно кусок кода для примера?

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

А то что я написал выше вообще должно работать? Мож у меня компилятор тупит?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.08.2009, 07:22     Как сделать, чтобы модальное окно закрылось по условию? #5
Каким компилятором пользуетесь?
Обязательно ли окно должно быть модальным? Как я понял из последнего сообщения окно может быть и не модальным (для Вашей задачи окно как раз и должно быть немодальным).
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 07:45  [ТС]     Как сделать, чтобы модальное окно закрылось по условию? #6
Задача полностью:
Делаю прогу для прошивки Flash памяти прибора через СОМ порт.
Прошивка ведётся обычной командой WriteFile, файл отправляется целиком, побайтная отправка не поддерживается. Прерывание записи грозит понятно чем.
Хочу визуализировать процесс записи посредством прогрессбара.
Т.к. при работе WriteFile таймер окна не работает, делаю отдельное окно со своим таймером и прогрессбаром. (хотя не уверен, будет ли так работать).
Лучше модальное, чтоб небыло доступа к родительскому окну до завершения процесса.
По окончании оно закрывается. Всё.

WinXP SP3, MS Visual Studio 2008, C++, проект MFC dialog based.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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();
Код привожу без положенных проверок.
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 09:36  [ТС]     Как сделать, чтобы модальное окно закрылось по условию? #8
Не, не получается.
Вырисовывается пустое окно, без кнопок и прогрессбара.
Хотя закрывается само
Задержку увеличивал до 30 сек.
Не прорисовывается ничего.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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 минуты
А предыдущее окно (которое немодальное) чтобы показывало кнопки, прогрессбар нужно это окно делать отдельным классом, в том классе заводить на прогрессбар переменную, на кнопки функции реализации нажатия на кнопки (в общем еще много чего делать надо, я только показал как нужно показывать окно на какое либо время и что бы оно само закрывалось).
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 11:22  [ТС]     Как сделать, чтобы модальное окно закрылось по условию? #10
Цитата Сообщение от valeriikozlov Посмотреть сообщение
6. В нашем вновь созданном классе перегружаем функцию OnInitDialog(), функцию OnTimer(UINT nIDEvent) и функцию OnOK().

C OnTimer и OnOK разобрался, тут легко.
А вот как "перегружаем функцию OnInitDialog()" ?
Не найду. Автоматом не прописывается нигде.
Прописал вручную, видимо где-то накосячил. Стоп по переполнению стека при открытии.
BOOL СMyDialog::OnInitDialog()
{
СMyDialog::OnInitDialog();
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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; 
}
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 12:16  [ТС]     Как сделать, чтобы модальное окно закрылось по условию? #12
Ну наконец-то!
Всё работает. Основа есть, буду доделывать.
Огромное спасибо.
Удачи.
novi4ok
551 / 504 / 8
Регистрация: 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.
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
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.
Возможно. Но СОМ порт работает жутко медленно, не думаю, что может повлиять. Но всё равно спасибо, буду иметь ввиду.
-=ЮрА=-
Заблокирован
Автор 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() ;
}
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
26.08.2009, 14:38     Как сделать, чтобы модальное окно закрылось по условию? #16
Как вариант, грохнуть из другого потока.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2009, 17:49     Как сделать, чтобы модальное окно закрылось по условию?
Еще ссылки по теме:
C++ Как сделать такое окно
C++ Как сделать виндоусовское окно?
Как сделать запись данных из файла в массив по условию для программы тестирования? C++
C++ как сделать консольное окно поверх всех окон
C++ Файлы. Как сделать так, что бы не только последний ответ выводил, а все которые удовлетворяют условию?

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
26.08.2009, 17:49     Как сделать, чтобы модальное окно закрылось по условию? #17
Вот проект прогрес окошка. Работает так: в основном окне нажимаем ОК - появляется окошко прогресса, дальше всё видно воочию...
Вложения
Тип файла: rar test_140.rar (11.3 Кб, 21 просмотров)
Тип файла: rar test_140.exe.rar (4.2 Кб, 15 просмотров)
Yandex
Объявления
26.08.2009, 17:49     Как сделать, чтобы модальное окно закрылось по условию?
Ответ Создать тему
Опции темы

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