Пятница, Ноябрь 27, 2020

Не модальное диалоговое окно MFC

#include<afxwin.h>
#include "resource.h"
class CApp:public CWinApp
{
public:
    virtual BOOL InitInstance(void);
};
class CFrame:public CFrameWnd
{
 public:
     // Конструктор умолчания (инициализация текста
     //   однострочного редактора)
     CFrame( void );
private:
    // Для текста однострочного редактора
    CString e1;
protected:
    DECLARE_MESSAGE_MAP();
public:
    afx_msg void OnFileExit();
    afx_msg void OnDialogStart();
};
class Dialog : public CDialog
{
// Данные
private:
    // Указатель однострочного элемента редактирования
    CEdit *pEdit;
public:
    // Для текста элемента редактирования
    CString e1;
    // Методы
public:
    BOOL Create( void );
private:
    // Инициализация окна диалога (перегрузка виртуального метода)
    virtual BOOL OnInitDialog( void );
    // Получение информации из окна диалога (перегрузка виртуального метода)
    virtual void OnOK( void );
    // Получение данных из окна диалога (метод вызывается автоматически из метода UpdateData( ))
    void DoDataExchange( CDataExchange* pDX );
};

BOOL CApp::InitInstance(void)
{
    CFrame *pFrame=new CFrame;
    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;
}
CApp myApp;
CFrame::CFrame()
{
    // Для текста однострочного редактора
    e1 = "Заставка";
}
void CFrame::OnFileExit()
{
    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( );
}
void CFrame::OnDialogStart()
{
    // Размещаем объект окна немодального диалога в динамической  памяти
    Dialog *pDlg = new Dialog;
    ASSERT_VALID( pDlg );           // Обработка ошибки размещения
    // Передаем текст для элемента редактирования
    pDlg->e1 = e1;
    // Создаем немодальное окно диалога
    if( !pDlg->Create( ) )
    {
        TRACE0( "\n Ошибка 4 - немодальное окно диалога не создано \n" );
        exit( 4 );
    }
    // Перерисовка окна (формирует сообщение WM_PAINT)
    CWnd :: Invalidate( );
    return afx_msg void( );
}
BOOL Dialog :: OnInitDialog( void )
{
    // Вызываем метод базового класса
    CDialog :: OnInitDialog( );
    // Получаем указатель на однострочный редактор
    pEdit = static_cast< CEdit * >( GetDlgItem( IDC_EDIT1 ) );
    if( !pEdit )
    {
        TRACE0( "\n Ошибка 5 - однострочный редактор не создан \n" );
        exit( 5 );
    }
    // Устанавливаем длину текста (13) для элемента редактирования и вывод начального текста
    pEdit->SetLimitText( 13 );
    pEdit->SetWindowText( e1 );
    return TRUE;
}

// ON OK: обработка закрытия диалога кнопкой "OK"
void Dialog :: OnOK( void )
{
    // Вызываем метод базового класса
    CDialog :: OnOK( );// Из этого метода автоматически вызывается DoDataExchange( ),
    //   обновляющий данные из окна диалога
    UpdateData( TRUE );
    // Визуализация обновленных данных
    AfxMessageBox( static_cast< LPCTSTR >( e1 ) );
    return;
}

// Получение данных из окна диалога (метод вызывается автоматически
//   из метода UpdateData( ))
void Dialog :: DoDataExchange( CDataExchange *pDX )
{
    // Вызываем метод базового класса
    CDialog :: DoDataExchange( pDX );
    // Копируем в e1 текст из однострочного редактора
    DDX_Text( pDX, IDC_EDIT1, e1 );
    return;
}

// Создание немодального диалога !!! Внимание, важно
BOOL Dialog :: Create( void )
{
    return CDialog :: Create( IDD_DIALOG1,this );
}
BEGIN_MESSAGE_MAP(CFrame,CFrameWnd)
    ON_COMMAND(ID_FILE_EXIT, &CFrame::OnFileExit)
    ON_COMMAND(ID_START_DIALOG, &CFrame::OnDialogStart)
END_MESSAGE_MAP()



 

НАЗАД                                                                         ДАЛЬШЕ


Back to Top