Опубликован: 10.03.2009 | Доступ: свободный | Студентов: 2297 / 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

Окно приложения пользователя

Рис. 2.1. Окно приложения пользователя