8 Библиотека Microsoft Foundation Classes
(MFC)
Иерархия классов
CObject
CCmdTarget

CWnd

CEdit

CButton

CStatic

CWinChread

CDialog

CWinApp

1

Приложение «Возведение числа в квадрат»
С1 – WM_INITDIALOG главного окна;
С2 – EN_CHANGE при вводе числа;
С3 – BN_CLICKED кнопки Выполнить;
С4 – BN_CLICKED кнопки Следующее;
С5 – BN_CLICKED для кнопки Выход;
С6 – BN_CLICKED для кнопки OK;
С7 – EN_CHANGE при удалении.
Нормальное выполнение
С4

С7
С1

Ожидание

С2

С5

Ввод
символов

С3

Вывод
результата

С3 [ошибка]
С6

Сообщение
об ошибке

2

Приложение «Возведение числа в
квадрат»(2)
CWinApp

CDialog

CEx1App

CEx1Dlg

CEx1App()
InitInstance()

m_hIcon
m_next
m_start
CEx1App()
DoDataExchange()
OnQueryDragIcon()
OnPaint()
OnInitDialog()
OnSetFocusInput()
OnChangeInput()
OnCulc()
OnNext()

2
3
2

CEdit
CButton
CStatic
CDialog1
DoDataExchange()
3

Описание класса приложения (Файл Ex1.h):
#include "resource.h " // файл уникальных номеров ресурсов
class CEx1App : public CWinApp
{ public:
CEx1App(); // конструктор
virtual BOOL InitInstance();// инициализация окна
DECLARE_MESSAGE_MAP() // макрос таблицы сообщений
};

4

Таблица, конструктор, объект(Файл Ex1.сpp)
BEGIN_MESSAGE_MAP(CEx1App, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
CEx1App::CEx1App()
{ }
CEx1App theApp; // экземпляр приложения

5

Метод инициализации (Файл Ex1.сpp)
BOOL CEx1App::InitInstance()
// Метод инициализации
{ #ifdef _AFXDLL
Enable3dControls(); // если MFC в виде DLL
#else
Enable3dControlsStatic();// если статическая MFC
#endif
CEx1Dlg dlg;

// Создается объект «Окно диалога»

m_pMainWnd = &dlg;
// Окно объявляется главным
int nResponse = dlg.DoModal(); // Вывод окна
if (nResponse == IDOK) {/* при нормальном завершении*/}
else
if (nResponse == IDCANCEL){/* если Cancel*/}
return FALSE;
}

6

Описание класса CEx1Dlg (Ex1Dlg.h)
class CEx1Dlg : public CDialog
{ public:
BOOL m_next;
BOOL m_start;
CEx1Dlg(CWnd* pParent = NULL); // Конструктор
enum { IDD = IDD_EX1_DIALOG };
CEdit

m_eInput;

CEdit

m_eOutput;

CStatic

m_sInput;

CStatic

m_sOutput;

CButton

m_bNext;

CButton

m_bCulc;

CButton

m_bExit;

7

Описание класса CEx1Dlg (Ex1Dlg.h)(2)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnSetFocusInput();
afx_msg void OnChangeInput();
afx_msg void OnCulc();
afx_msg void OnNext();
DECLARE_MESSAGE_MAP()
};
8

Описание класса CEx1Dlg (Ex1Dlg.cpp)
CEx1Dlg::CEx1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CEx1Dlg::IDD, pParent)
{ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_start=TRUE;
m_next=FALSE;
}
void CEx1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1,
m_eInput);
DDX_Control(pDX, IDOK,
m_bExit);
DDX_Control(pDX, IDC_STATIC1, m_sInput);
DDX_Control(pDX, IDC_STATIC2, m_sOutput);
DDX_Control(pDX, IDC_EDIT2,
m_eOutput);
DDX_Control(pDX, IDC_BUTTON2, m_bNext);
DDX_Control(pDX, IDC_BUTTON1, m_bCulc);
}

9

Описание класса CEx1Dlg (Ex1Dlg.cpp)(2)
BEGIN_MESSAGE_MAP(CEx1Dlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_EN_SETFOCUS(IDC_EDIT1,
OnSetFocusInput)
ON_EN_CHANGE( IDC_EDIT1,
OnChangeInput)
ON_BN_CLICKED( IDC_BUTTON1, OnCulc)
ON_BN_CLICKED( IDC_BUTTON2, OnNext)
END_MESSAGE_MAP()
BOOL CEx1Dlg::OnInitDialog()
{ CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_eInput.SetFocus();
m_start=FALSE;
// Начальная установка выполнена
return FALSE;
// Означает, что установлен фокус ввода
}
10

Описание класса CEx1Dlg (Ex1Dlg.cpp)(3)
void CEx1Dlg::OnPaint()
{ if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND,
(WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
CDialog::OnPaint();
}
11

Описание класса CEx1Dlg (Ex1Dlg.cpp)(4)
HCURSOR CEx1Dlg::OnQueryDragIcon()
{ return (HCURSOR) m_hIcon;}
void CEx1Dlg::OnSetFocusInput()
{ if (m_start || m_next)// Если начало или к следующему
{m_eInput.SetWindowText(""); // Очистка поля ввода
_eInput.SetReadOnly(FALSE);
// Разрешение ввода
m_eInput.ModifyStyle(0,WS_TABSTOP); /* Разрешение
установки фокуса*/
m_sOutput.ModifyStyle(WS_VISIBLE,0); /*Сокрытие метки
вывода */
m_eOutput.ModifyStyle(WS_VISIBLE,0); /* Сокрытие поля
вывода*/
m_bCulc.ModifyStyle(0,WS_DISABLED); /*Дезактивация кнопки
Выч. */
m_bNext.ModifyStyle(0,WS_DISABLED); /* Дезактивация кнопки
След. */
InvalidateRect(NULL); /* Запрос на перерисовку окна */
SetDefID(IDOK); // Выполнение по Enter – на кнопку Выход
}
}
12

Описание класса CEx1Dlg (Ex1Dlg.cpp)(5)
void CEx1Dlg::OnChangeInput()
{ char S[10];
m_eInput.GetWindowText(S,10); // Чтение строки
if (S[0]!='\0')
{
m_bCulc.ModifyStyle(WS_DISABLED,0); // Активация кнопки
m_bCulc.InvalidateRect(NULL);// Запрос на перерисовку кнопки
SetDefID(IDC_BUTTON1);// Выполнение по Enter – на кнопку Выч.
}
else
{/* Дезактивация кнопки Выч. */
m_bCulc.ModifyStyle(0,WS_DISABLED);
m_bCulc.InvalidateRect(NULL);// Запрос на перерисовку кнопки
SetDefID(IDOK); // Выполнение по Enter – на кнопку Выход
}
}
13

Описание класса CEx1Dlg (Ex1Dlg.cpp)(6)
void CEx1Dlg::OnCulc()
{ char S[10];
m_eInput.GetWindowText(S,10); // Чтение строки
int Num,Result;
unsigned i;
BOOL Code=TRUE;
for (i=0;i'9'||S[i]
Описание класса CEx1Dlg (Ex1Dlg.cpp)(7)
m_eOutput.ModifyStyle(0,WS_VISIBLE); /* Установка
видимости поля */
m_bCulc.ModifyStyle(0,WS_DISABLED);
/* Дезактивация
кнопки Выч.*/
m_bNext.ModifyStyle(WS_DISABLED,0); // Активация След.
InvalidateRect(NULL); // Запрос на перерисовку окна диалога
SetDefID(IDC_BUTTON2); // По Enter – на кнопку След.
GotoDlgCtrl(&m_bNext); // Фокус на кнопку След.
}
else
{
CDialog1 dlg1;
// Объект класса
int nRes1 = dlg1.DoModal(); // Вывод окна
m_eInput.SetFocus();
// Фокус на ввод
}
}
15

Описание класса CEx1Dlg (Ex1Dlg.cpp)(8)
void CEx1Dlg::OnNext()
{ m_next=TRUE;
// Переход к следующему
m_eInput.SetFocus(); // Фокус ввода на редактор ввода
m_next=FALSE;
// Переход к следующему выполнен
}

16






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.