Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Необходимо при закрытии окна дождаться выполнения функции.Что делать?

6.2K
05 апреля 2004 года
ol777
8 / / 05.04.2004
Необходимо, что бы при нажатии на крест (выход из программы) программа подождала выполнение некоторой функции
461
05 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by ol777
Необходимо, что бы при нажатии на крест (выход из программы) программа подождала выполнение некоторой функции



В каком смысле "подождала выполнение"? Если функция должна выполниться перед выходом из программы, то в своем классе окна нужно перегруэить обработчик системных команд, чтобы он перехватывал сообщение о закрытии окна. Это может выглядеть примерно так:

Код:
class CMyWnd : public CWnd
{
// здесь описание вашего класса окна
...
// обработчик системных команд
afx_msg void OnSysCommand(UINT ID, LPARAM p);
...
}

// карта обрабатываемых сообщений
BEGIN_MESSAGE_MAP (CMyWnd, CWnd)
...
ON_WM_SYSCOMMAND()
...
END_MESSAGE_MAP ()

afx_msg void CMyWnd::OnSysCommand(UINT ID, LPARAM p)
{
 switch (ID)
 {
 ...
 case SC_CLOSE:
// здесь запускаете нужную функцию
 break;
 ...
 }
CWnd::OnSysCommand(ID, p); // стандартный обработчик
}

А если нужно дождаться завершения уже выполняемой функции (например, выполняемой в отдельном потоке), то просто в ее начале устанавливаете какую-нибудь переменную, а в конце сбрасываете. И в OnSysCommand проверяете - если стоит, то завершаете его досрочно, а если нет - выполняете стандартный CWnd::OnSysCommand.
319
05 апреля 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by ol777
Необходимо, что бы при нажатии на крест (выход из программы) программа подождала выполнение некоторой функции


функция в другом потоке выполняется или как?
в принципе для этих целей есть обработчик OnClose:

 
Код:
void CBASEDlg::OnClose()
{
    if (m_bStartMachine==FALSE){
        int i;
        i=MessageBox("Вы хотите завершить программу?",0,MB_YESNO|MB_ICONWARNING);
        if (i==IDYES){
            CDialog::OnOK();
        };
    };
}

в данном примере, нажатие на крест или Quit игнорируется если переменная m_bStartMachine равна TRUE.
6.2K
05 апреля 2004 года
ol777
8 / / 05.04.2004
Цитата:
Originally posted by gerard

В каком смысле "подождала выполнение"? Если функция должна выполниться перед выходом из программы, то в своем классе окна нужно перегруэить обработчик системных команд, чтобы он перехватывал сообщение о закрытии окна. Это может выглядеть примерно так:



А если мне надо проверить перeменную класса документа? Приложение SDI

461
06 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by ol777


А если мне надо проверить перeменную класса документа? Приложение SDI



Опять же что значит "проверить"? Был ли документ изменен? Тогда вызывайте соответствующий метод из CDocument (IsModified(), кажется).

6.2K
08 апреля 2004 года
ol777
8 / / 05.04.2004
Цитата:
Originally posted by gerard


Опять же что значит "проверить"? Был ли документ изменен? Тогда вызывайте соответствующий метод из CDocument (IsModified(), кажется).



Да, спасибо. SaveModified () помогло.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог