Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.08.2009, 13:53. Просмотров 2885. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2009, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать, чтобы модальное окно закрылось по условию? (C++):

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

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

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

Как сделать, чтобы диалоговое окно не закрывалось при нажатии клавиши ENTER? - C++
Как сделать, чтобы диалоговое окно не закрывалось при нажатии клавиши ENTER? (если можно то, код)

Как сделать окно (окно домика) в пространстве, как на изображении? - C++
Здравствуйте, как сделать окно в пространстве, как на изображении? сделал крышу и &quot;фундамент&quot;: for (int i = 0, x = 9; i &lt; 21;...

Где инициализируется модальное окно? - C++
такой еще вопрос я делаю дополнительное диалоговое окно (DoModal), и хочу перед открытием окна забить данными эдиты. В классе этого...

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

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

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

А то что я написал выше вообще должно работать? Мож у меня компилятор тупит?
0
valeriikozlov
Эксперт С++
4672 / 2498 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.08.2009, 07:22 #5
Каким компилятором пользуетесь?
Обязательно ли окно должно быть модальным? Как я понял из последнего сообщения окно может быть и не модальным (для Вашей задачи окно как раз и должно быть немодальным).
0
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.
0
valeriikozlov
Эксперт С++
4672 / 2498 / 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();
Код привожу без положенных проверок.
0
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 09:36  [ТС] #8
Не, не получается.
Вырисовывается пустое окно, без кнопок и прогрессбара.
Хотя закрывается само
Задержку увеличивал до 30 сек.
Не прорисовывается ничего.
0
valeriikozlov
Эксперт С++
4672 / 2498 / 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 минуты
А предыдущее окно (которое немодальное) чтобы показывало кнопки, прогрессбар нужно это окно делать отдельным классом, в том классе заводить на прогрессбар переменную, на кнопки функции реализации нажатия на кнопки (в общем еще много чего делать надо, я только показал как нужно показывать окно на какое либо время и что бы оно само закрывалось).
0
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();
0
valeriikozlov
Эксперт С++
4672 / 2498 / 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; 
}
0
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
25.08.2009, 12:16  [ТС] #12
Ну наконец-то!
Всё работает. Основа есть, буду доделывать.
Огромное спасибо.
Удачи.
0
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.
0
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.
Возможно. Но СОМ порт работает жутко медленно, не думаю, что может повлиять. Но всё равно спасибо, буду иметь ввиду.
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
26.08.2009, 09:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2009, 09:30
Привет! Вот еще темы с ответами:

Как сделать отдельные записи в таблице по строкам, чтобы сделать запросы? - C++
Вот моя программа.. она производит чтение, только символами... #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include...

Как сделать такое окно - C++
Всем доброго времени суток!У меня есть вопрос.Как можно сделать такое окно(смотртите прикрепление)? Есть достоверная информация,что это...

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

Как сделать запись данных из файла в массив по условию для программы тестирования? - C++
Здравствуйте, появилась идея создать свой &quot;тестер&quot;. В связи с этим появилось несколько вопросов, ну чтобы было понятнее опишу работу...


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

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

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