Опубликован: 10.03.2009 | Доступ: свободный | Студентов: 2295 / 280 | Оценка: 4.31 / 4.07 | Длительность: 09:23:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Лекция 2:
Библиотека классов MFC
Окончательный текст программы
#include <afxwin.h> //MFC основные и стандартные компоненты
#include <afxext.h> //MFC расширения
#include "resource.h" //Идентификаторы ресурсов
#define IDC_MYBUTTON 100 //Идентификатор кнопки
#define IDC_MYEDIT 102 //Идентификатор поля редактирования
#define ID_TIMER_FOR_MOT 104 //Идентификатор для таймера
static UINT indicators[] =
{
IDS_STRING_X, //Идентификатор первой строки в ресурсах
IDS_STRING_Y //Идентификатор второй строки в ресурсах
};
class CMyButton: public CButton //Создание нового класса
{
public:
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnRButtonDown(UINT, CPoint);
private:
DECLARE_MESSAGE_MAP(); //Таблица откликов кнопки
};
class CMyApp : public CWinApp
{
public:
CMyApp(); //конструктор по умолчанию
virtual BOOL InitInstance(); //стандартная инициализация
};
class CMainWnd : public CFrameWnd
{
public:
CMainWnd(); //Конструктор по умолчанию
int OnCreate(LPCREATESTRUCT lpCreateStruct);
~CMainWnd(); //Деструктор
private:
int VX, sgn_x; //Приращение координаты по оси x и знак приращения
int VY, sgn_y; //Приращение координаты по оси y и знак приращения
CRect newPlace; //Квадрат, в который вписан отображаемый круг
CRect oldPlace; //Квадрат, в который был вписан отображаемый круг в предыдущий момент
CStatic* MyStatic; //Указатель на объект надпись
CMyButton* MyButton; //Указатель на объект кнопка
CEdit* MyEdit; //Указатель на объект поле редактирования
CStatusBar m_wndStatusBar; //Объект строки состояния
CMenu m_wndMenu; //Объект меню
DECLARE_MESSAGE_MAP(); //Таблица откликов окна
public:
afx_msg void MenuExit(); //Процедура реакции на выбор пункта меню "выход"
afx_msg void MenuStart(); //Процедура реакции на выбор пункта меню "старт"
afx_msg void MenuStop(); //Процедура реакции на выбор пункта меню "стоп"
afx_msg void OnTimer(UINT_PTR);
afx_msg void OnPaint();
afx_msg void OnKeyDown(UINT, UINT, UINT);
afx_msg void OnMouseMove(UINT, CPoint cp); //Движение мыши
};
BEGIN_MESSAGE_MAP(CMyButton, CButton) //Таблица откликов на сообщения для кнопки
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) //Таблица откликов на сообщения
ON_WM_CREATE() //Событие создания окна
ON_COMMAND(ID_APP_EXIT,MenuExit) //Обработка реакции на выбор меню "выход"
ON_COMMAND(ID_MOTION_START,MenuStart) //Выбор пункта "старт"
ON_COMMAND(ID_MOTION_STOP,MenuStop) //Выбор пункта "стоп"
ON_WM_TIMER() //Обработка WM_TIMER
ON_WM_PAINT()
ON_WM_KEYDOWN() //Реакция на нажатие клавиши
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
void CMyButton::OnLButtonDown(UINT, CPoint)
{
MoveWindow(10,110,90,30);
}
void CMyButton::OnRButtonDown(UINT, CPoint)
{
MoveWindow(10,40,90,30);
}
CMyApp::CMyApp(){} // конструктор главного класса приложения
BOOL CMyApp::InitInstance() // стандартная инициализация
{
m_pMainWnd=new CMainWnd(); // создать указатель на класс окна
ASSERT(m_pMainWnd); // проверить его правильность
m_pMainWnd->ShowWindow(SW_SHOW); // показать окно
m_pMainWnd->UpdateWindow(); // обновить окно
return TRUE; // вернуть, что все нормально
};
CMainWnd::CMainWnd()
{
oldPlace.left = 150;
oldPlace.top = 150;
oldPlace.right = 170;
oldPlace.bottom = 170;
newPlace = oldPlace;
VX = VY = sgn_x = sgn_y = 1;
Create(NULL,"Окно приложения пользователя", WS_OVERLAPPEDWINDOW, rectDefault, NULL, NULL); // создать окно программы
MyStatic = new CStatic();
if (MyStatic != NULL)
MyStatic->Create("Надпись", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(10, 10, 100, 30), this);
MyButton = new CMyButton();
if (MyButton != NULL)
MyButton->Create("Кнопка", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(10, 40, 100, 70), this, IDC_MYBUTTON);
MyEdit = new CEdit();
if (MyEdit != NULL)
MyEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER, CRect(10, 80, 100, 100), this, IDC_MYEDIT);
}
CMainWnd::~CMainWnd() //Деструктор класса
{
if (MyStatic != NULL) delete MyStatic; //Удалить динамический объект
if (MyButton != NULL) delete MyButton; //Удалить динамический объект
if (MyEdit != NULL) delete MyEdit; //Удалить динамический объект
}
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
m_wndStatusBar.SetPaneInfo(0, 0, 0, 50); //Изменение размеров первой секции строки состояния
m_wndStatusBar.SetPaneInfo(1, 0, 0, 50); //Изменение размеров второй секции строки состояния
m_wndMenu.LoadMenu(IDR_MENU1); //Загрузить меню из файла ресурса
SetMenu(&m_wndMenu); //Установить меню
return 0;
}
void CMainWnd::MenuExit()
{
DestroyWindow(); //Уничтожить окно
}
void CMainWnd::MenuStart()
{
SetTimer(ID_TIMER_FOR_MOT,10,NULL); //Запустить таймер
}
void CMainWnd::MenuStop()
{
KillTimer(ID_TIMER_FOR_MOT); //Остановить таймер
}
void CMainWnd::OnTimer(UINT_PTR nIDEvent)
{
CRect rectClient;
GetClientRect(&rectClient);
rectClient.bottom -= 20;
rectClient.left += 110;
if(newPlace.right > rectClient.right || newPlace.left < rectClient.left)
sgn_x = -sgn_x;
if(newPlace.bottom > rectClient.bottom || newPlace.top < rectClient.top)
sgn_y = -sgn_y;
newPlace.left += sgn_x*VX;
newPlace.right += sgn_x*VX;
newPlace.top += sgn_y*VY;
newPlace.bottom += sgn_y*VY;
InvalidateRect(oldPlace); //Обновить прямоугольник, в котором был круг
InvalidateRect(newPlace); //Обновить прямоугольник, в котором круг сейчас
oldPlace = newPlace;
}
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
CBrush bBrush(RGB(0,0,255));
dc.SelectObject(&bBrush);
dc.Ellipse(newPlace);
}
void CMainWnd::OnKeyDown(UINT nChar, UINT, UINT)
{
switch(nChar) //Обработка в зависимости от кода символа
{
case 40: if(sgn_y > 0) VY++;
else VY--;
break;
case 38: if(sgn_y > 0) VY--;
else VY++;
break;
case 37: if(sgn_x > 0) VX--;
else VX++;
break;
case 39: if(sgn_x > 0) VX++;
else VX--;
break;
}
}
void CMainWnd::OnMouseMove(UINT, CPoint cp)
{
char chX[10]; //Буфер для координат
char chY[10]; //Буфер для координат
itoa(cp.x,chX,10); //Число переводим в строку
itoa(cp.y,chY,10); //Число переводим в строку
CString csStatusX(chX); //Формируем строку
CString csStatusY(chY); //Формируем строку
m_wndStatusBar.SetPaneText(0,csStatusX); //Выводим первую панель
m_wndStatusBar.SetPaneText(1,csStatusY); //Выводим вторую панель
}
CMyApp theApp; //Запуск приложенияВ результате компиляции и запуска на выполнение. В результате получим окно приложения следующего вида: рис. 2.1
