Вторник, Май 26, 2020

Progress Timer MFC

#include <afxwin.h>// Ядро MFC и стандартные компоненты
#include <afxcmn.h>// Общие управляющте элементы MFC
#include"resource.h"
// Объявление класса
class MainThread : public CWinApp
{
    // Методы
public:
    // Инициализация приложения перед запуском
    virtual BOOL InitInstance( void );
};
// Объявление класса
class FrameWnd : public CFrameWnd
{
    // Методы
protected:
    // Прототипы функций, обрабатывающих сообщения
    // Обработка команды Файл | Выход
    afx_msg void OnMenuFileExit( void );
    // Обработка команды Индикатор прогресса и таймер | Диалог
    afx_msg void OnMenuProgressTimer( void );
    // Объявление таблицы сообщений
    DECLARE_MESSAGE_MAP( );
};
// Объявление класса
class Dialog : public CDialog
{
    // Данные
private:
    // Указатель на индикатор прогресса
    CProgressCtrl   *m_pProgressCtrl;
    // Возвращаемое значение для SetTimer
    UINT_PTR        m_nTimer;
    // Счетчик запусков таймера
    unsigned int    m_nCount;
    // Максимальное число запусков таймера
    enum { nMaxCount = 100 };
public:
    // Конструктор - передает идентификатор диалога в базовый класс
    Dialog( CWnd *pParent = 0 );
protected:
    // Обработчик таймера
    afx_msg void OnTimer( UINT nIDEvent );
    // Обработчик кнопки "Запуск индикатора"
    afx_msg void OnStart( void );
    // Объявление таблицы сообщений
    DECLARE_MESSAGE_MAP( );
};
// Инициализация и запуск приложения
MainThread              m_MainThread;
// Переопределение виртуальной функции для инициализации приложения перед запуском
BOOL MainThread :: InitInstance( void )
{
    // Указатель на фрейм окна
    FrameWnd            *pFrame;
    // Размещение фрейма окна в динамической памяти с обработкой  ошибки
    pFrame = new FrameWnd;
    ASSERT_VALID( pFrame );         // Обработка ошибки размещения
    // Загрузка ресурсов, регистрация класса окна и создание окна
    BOOL                rc = pFrame->LoadFrame( IDR_MENU1 );
    if( !rc )
    {
        TRACE0( "\n Ошибка 1. Ошибочное завершение LoadFrame \n" );
        exit( 1 );
    }

    // Отображение окна
    pFrame->ShowWindow( SW_SHOW );
    // Обновление окна (генерирует WM_PAINT)
    pFrame->UpdateWindow( );
    // Созданный фрейм делаем главным окном приложения
    this->m_pMainWnd = pFrame;
    return TRUE;
}
// Определение таблицы сообщений
BEGIN_MESSAGE_MAP( FrameWnd, CFrameWnd )
    ON_COMMAND( ID_FILE_EXIT, OnMenuFileExit )
    ON_COMMAND( ID_PROGRESS_TIMER, OnMenuProgressTimer )
END_MESSAGE_MAP( )
// Обработка команды Файл | Выход
afx_msg void FrameWnd :: OnMenuFileExit( void )
{
    BOOL                rc = MessageBeep( -1 );
    if( !rc )
    {
        TRACE0( "\n Ошибка 2. Неверное завершение MessageBeep \n" );
        exit( 2 );
    }
    rc = DestroyWindow( );
    if( !rc )
    {
        TRACE0( "\n Ошибка 3. Окно не было разрушено \n" );
        exit( 3 );
    }

    return afx_msg void( );
}

// Обработка команды Индикатор прогресса и таймер | Диалог
afx_msg void FrameWnd :: OnMenuProgressTimer( void )
{
    // Создаем объект диалога - автоматически вызывается конструктор
    Dialog              Dlg( this );
    // Создается модальное диалоговое окно - оно будет
    //   автоматически закрыто после нажатия OK или Cancel
    Dlg.DoModal( );
    return afx_msg void( );
}
// Конструктор
Dialog :: Dialog( CWnd *pParent ): CDialog( IDD_DIALOG1, pParent )
    {
        m_nCount = 0;
    }
// Обработчик кнопки "Запуск индикатора"
afx_msg void Dialog :: OnStart( void )
{
    if( ( m_nCount > 0 ) && ( m_nCount < nMaxCount ) )
        return afx_msg void( );
    m_nCount = 0;
    // Запускаем таймер с интервалом 0.1 секунды
    m_nTimer = SetTimer( 0, 100, NULL );
    ASSERT( m_nTimer );
    return afx_msg void( );
}
// Обработчик таймера
afx_msg void Dialog :: OnTimer( UINT nIDEvent )
{
    if( m_nCount > nMaxCount )
    {
        // Индикатор прогресса работу закончил
        ASSERT( KillTimer( 0 ) );
        return afx_msg void( );
    }
    m_nCount++;
    // Обновляем состояние индикатора прогресса
    m_pProgressCtrl = static_cast< CProgressCtrl * >
                      ( GetDlgItem( IDC_PROGRESS ) );
    m_pProgressCtrl->SetPos( m_nCount*100/nMaxCount );
    return afx_msg void( );
}
// Определение таблицы сообщений
BEGIN_MESSAGE_MAP( Dialog, CDialog )
    ON_WM_TIMER( )
    ON_BN_CLICKED( IDC_START, OnStart )
END_MESSAGE_MAP( )



НАЗАД                                                                         ДАЛЬШЕ


Back to Top