Лабораторная работа 2.1

Задание:

Разработать небольшой графический редактор. При нажатии левой клавиши мыши в точке нажатия должен появляться квадрат. А при нажатии правой – звезда.

Ход работы:

  1. Создание проекта. Создайте проект по схеме описанной в лабораторной работе 1.1 и назовите его L2_1.
  2. Создание образа звезды при помощи класса СArray. В MFC есть есть шаблонный класс позволяющий создавать динамические массивы любых стандартных типов. Это класс CArray. Воспользуемся им, для того чтобы создать массив, в котором мы будем хранить образ пятиконечной звезды. В таблице 2.1.1 приведены некоторые функции-члены класса CArray.
  3. Таблица 2.1.1

    Функции-члены

    Описание

    GetSize()

    Возвращает количество элементов массива

    SetSize(int newSize)

    Устанавливает количество элементов массива

    RemoveAll()

    Удаляет все элементы из массива

    Add(ARG_TYPE newElement)

    Добавляет элемент в конец массива

    Copy( const CArray& src )

    Копирует элементы из другого массива

    Добавьте в файл-описание класса CL2_1View следующие строчки:

    // Создаем массив m_coor, элементами которого

    // являются екземпляры класса CPoint, и возвращаются

    // элементы CPoint

    CArray <CPoint,CPoint> m_coor;

    После чего добавьте в класс CL2_1View функцию создающую образ пятиконечной звезды относительно некоторой точки.

    /

    / Функция создания образа звезды.

    void CL_2View::zvezda(CPoint point)

    {

    // Очищаем массив

    m_coor.RemoveAll();

    // Записываем координаты точек по которым

    // будет рисоваться звезда

    m_coor.Add(CPoint(point.x,point.y-20));

    m_coor.Add(CPoint(point.x+5,point.y-5));

    m_coor.Add(CPoint(point.x+20,point.y));

    m_coor.Add(CPoint(point.x+5,point.y+5));

    m_coor.Add(CPoint(point.x,point.y+20));

    m_coor.Add(CPoint(point.x-5,point.y+5));

    m_coor.Add(CPoint(point.x-20,point.y));

    m_coor.Add(CPoint(point.x-5,point.y-5));

    }

  4. Обработка сообщений от мыши. Обработчики сообщений создаются при помощи ClassWizard. Для запуска ClassWizard выполните команду главного меню: View->ClassWizard (Ctrl+W). После чего перед вами появиться окно ClassWizard. (Рис. 2.1.1).
  5. В поле Class Name выберете класс CL2_1View, а в поле Message выберете сообщение WM_LBUTTONDOWN. Затем нажмите кнопку Add Function. Тоже самое проделайте для других сообщений: WM_RBUTTONDOWN, WM_LBUTTONDBCLICK. После чего переходите к их редактированию.

    // Если нажата левая клавиша мыши, то выполняется

    // эта функция.

    void CL_2View::OnLButtonDown(UINT nFlags, CPoint point)

    {

    // В переменной point передаются координаты курсора мыши

    // Создаем новый контекст устройства и связываем его

    // с клиентской областью окна

    CClientDC dc(this);

    // Выбираем в этом контексте стандартную серую кисть

    dc.SelectStockObject(GRAY_BRUSH);

    // Рисуем прямоугольник

    dc.Rectangle(point.x-10,point.y-10,point.x+10,point.y+10);

    }

    // Если нажата правая клавиша мыши, то выполняется

    // эта функция.

    void CL_2View::OnRButtonDown(UINT nFlags, CPoint point)

    {

    // В переменной point передаются координаты курсора мыши

    //Создаем образ звезды относительно текущаго

    //положения курсора мыши

    zvezda(point);

    // Создаем новый контекст устройства и связываем его

    // с клиентской областью окна

    CClientDC dc(this);

    // Выбираем в этом контексте стандартную светло-серую

    // кисть

    dc.SelectStockObject(LTGRAY_BRUSH);

    // Получаем размер массива

    int razm=m_coor.GetSize();

    //Рисуем звезду

    dc.Polygon(&m_coor[0],razm);

    // Функция Polygon очень интересна тем, что

    // рисует фигуру по координатам записанным в массиве.

    // Единственное что остаеться сделать, так это сформировать

    // массив, и передать этой функции его адрес, а так же

    // количество точек используемых в рисунке.

    }

    // Если произведен двойной клик левой

    // клавишей мыши

    void CL_2View::OnLButtonDblClk(UINT nFlags, CPoint point)

    {

    // Без комментариев

    zvezda(point);

    CClientDC dc(this);

    int razm=m_coor.GetSize();

    dc.Polygon(&m_coor[0],razm);

    }

  6. Задание для самостоятельной домашней разработки. Разработайте несколько других фигур для вывода на экран при помощи функции Polygon. Так как за перерисовку экрана отвечает функция OnDraw, то любое изменение окна приложения приведет к его перерисовки и соответственно к потере изображения. Сделайте так, чтобы рисование шло внутри функции OnDraw. Для этого для каждого типа фигур создайте массивы, хранящие точки их вывода на экран, а в обработчиках сообщений от мыши добавляйте эти точки в соответствующие массивы, и вызывайте функцию заставляющую перерисовывать экран – Invalidate. Саму же перерисовку выполняйте в функции OnDraw.