Казахстан |
Опубликован: 10.03.2009 | Уровень: специалист | Доступ: платный
Лекция 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