Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Закрыть окно через заданное время


Автор: АлексейМ 18.12.2005, 20:02
Народ, у мя такой вот вроде бы совсем несложный вопросик. Нужно через заданное в EditBox время закрывать диалоговое окно проги. Предполагаю, что можно это сделать с помощью цикла и функции SetTimer. Например, в поле вводим время в минутах. Тогда параметрами таймера могут быть SetTimer(1, 60000, NULL). Переменной цикла присваиваем значение из поля ввода. Одна минута - цикл повторяется один раз, две минуты - два и т.д. Только вот как сделать, чтобы окно закрывалось при окончании цикла?
Вот, у меня был вариант, но он по понятным причинам не работает. А другой чёт не допирает, как сделать...

Код

void CWindowDlg::OnStart() // Включаем таймер кнопочкой Старт
{
    // TODO: Add your control notification handler code here

    int tmr;               // таймер
    int cycletime;      // переменная цикла
    int time;             // заданное время:
    time = m_time;  // m_time - переменная поля типа int
    

    cycletime = 0;

    while(cycletime <= time)
    {
        tmr = SetTimer(1, 60000, NULL);
        cycletime++;
    } 
}

void CWindowDlg::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default

    CDialog::OnTimer(nIDEvent);
                    
                    OnCancel(); // закрываем окно
/* В этом-то вся проблема и заключается. OnTimer срабатывает каждый раз при прохождении цикла,
 поэтому окно закрывается через минуту. Как сделать, чтобы окно закрывалось по окончании цикла?
Какие ещё глюки вы здесь видите? Помогите исправить :))                                          */
}

Заранее благодарю. smile

Автор: Aleksandor 18.12.2005, 20:09
Ну например можно по окончании цикла послать окну сообщение, а в обработчике сообщения убить таймер и закрыть окно. Сообщение типа SendMessage(hDlg,WM_APP+1,0,0);
Обработчик
case WM_APP+1:

KillTimer(hDlg,1);
EndDialog(hDlg,TRUE);
return TRUE;

Автор: АлексейМ 18.12.2005, 22:57
Aleksandor, будь добр, укажи, куды в моём коде всё это дело вставлять. Спасиба!

Автор: SergeCpp 19.12.2005, 11:46
А зачем цикл-то ?

Ставишь таймер сразу на сколько надо...

Ведь твой цикл — не задержка!

Он мгновенно выполняется!

Автор: АлексейМ 20.12.2005, 02:34
SergeCpp, вишь, в чём дело - мне надо, чтобы в моей проге ПОЛЬЗОВАТЕЛЬ мог задавать время, через которое окно будет закрываться, открываться, выдавать какое-нить сообщение или производить любую другую операцию. Например, хочешь задать программке, чтобы через десять минут она включила те какой-нить музончик, а потом вдруг передумал, и захотел, чтобы она включила музон через полчаса. Если каким-то макаром реализовать то, что я хочу, то это сделать будет очень просто. А если предложенным тобой способом, то, чтобы изменить время, надо будет изменять исходник и перекомпилировать... Согласись, эт не очень удобно.
Цитата
Ведь твой цикл — не задержка!

Он мгновенно выполняется!

Вот в этом-то вся проблема...

Может, сделать какую-нить функцию, которая будет до определённого момента считать поступившие сигналы таймера? Опять же, не представляю, как это можно реализовать...
У кого есть идеи? давайте их сюды! smile

Автор: SergeCpp 20.12.2005, 07:58
Не понял...

tmr = SetTimer(1, 60000 * cycletime, NULL);

В чём тут сложности ?

==================================
Или уж делай static в таймерном обработчике

И её увеличивай (уменьшай)

Автор: АлексейМ 20.12.2005, 08:38
Спасибо большое!
Просто я ещё новичок, и не знал, что в таймере умножение можно ставить. smile
Ща попробую!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)