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

Задание:

Усовершенствовать редактор из предыдущей лабораторной работы, таким образом, чтобы в главном меню можно было выбирать цвета линий, и заливки фигур, а в контекстном меню формы фигур.

Ход работы:

  1. Создание проекта. Создайте стандартный проект и назовите его L3_1.
  2. Создание ресурсов меню. Для того чтобы создать меню необходимо выполнить команду меню Insert->Resource, в появившемся окне выбрать Menu и нажать кнопку Add (Рис. 3.1.1).




    После этого необходимо перейти на вкладку Resource View (Рис. 3.1.2) и выбрав ваш ресурс меню приступить к его редактированию.




    Для того чтобы корректно отображались символы кириллицы нужно щелкнуть правой клавишей на ресурсе вашего меню, и в появившемся контекстном меню выбрать пункт Properties. Далее перед вами откроется окно свойств, в котором следует установить русский язык (Рис.3.1.3).




    Создайте два ресурса меню, такие, как показано на рисунке 3.1.4












    Если щелкнуть правой клавишей мыши на одном из пунктов, и в появившемся контекстном меню выбрать пункт Properties, то откроется окно свойств данного пункта где можно в окне Prompt написать подсказку, которая будет отображаться в строке состояния при выборе данного пункта меню. Напишите для каждого пункта свою подсказку. Например подсказка для пункта Цвета линий->Красный:
  3. Рисует фигуру красным контуром .

  4. Программирование контекстного меню. Для того чтобы сделать меню контекстным необходимо добавить в класс CL3_1View обработчик сообщения WM_CONTEXTMENU.
  5. //Создание контекстного меню

    void CL3_1View::OnContextMenu(CWnd* pWnd, CPoint point)

    { // Создаем меню

    CMenu menu;

    // Связываем созданное меню с ресурсом

    menu.LoadMenu(IDR_MENU1);

    // Конструируем контекстное меню, таким образом,

    // чтобы оно раскравылась справа от курсора и

    // пункты меню выравнивались по левому краю.

    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this); }

  6. Добавление переменных-членов. Добавьте следующие переменные-члены:
  7. Переменная

    Тип

    Описание

    m_lred

    int

    Определяет состояние пункта “Красный” меню “Цвета линий”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_zred

    int

    Определяет состояние пункта “Красный” меню “Цвета заливки”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_lblur

    int

    Определяет состояние пункта “Синий” меню “Цвета линий”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_zblur

    int

    Определяет состояние пункта “Синий” меню “Цвета заливки”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_lgreen

    int

    Определяет состояние пункта “Зеленый” меню “Цвета линий”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_zgreen

    int

    Определяет состояние пункта “Зеленый” меню “Цвета заливки”. Если равна 1 значит пункт выбран, если 0 то нет.

    m_col_l

    int

    Определяет текущий цвет линий

    m_col_z

    int

    Определяет текущий цвет заливки

    mouse_x

    int

    Хранит координату мыши по Х

    mouse_y

    int

    Хранит координату мыши по Y

    После того как Вы добавите переменные, необходимо будет провести их инициализацию. Лучше всего для этого подходит конструктор класса CL3_1View.

    CL3_1View::CL3_1View()

    {

    m_lred=0;

    m_zred=0;

    m_lblur=0;

    m_zblur=0;

    m_lgreen=0;

    m_zgreen=0;

    m_col_l=0;

    m_col_z=0;

    }

  8. Добавление функции OnMouseMove. Для того чтобы постоянно получать информацию о координатах мыши, необходимо добавить обработчик сообщения WM_MOUSEMOVE в класс CL3_1View.
  9. // Обработчик сообщения WM_MOUSEMOVE

    void CL3_1View::OnMouseMove(UINT nFlags, CPoint point)

    {

    //Сохраняем координату Х

    mouse_x=point.x;

    //Сохраняем координату Y

    mouse_y=point.y;

    //Вызываем функцию базового класса

    CView::OnMouseMove(nFlags, point);

    }

  10. Программирование команд контекстного меню. Для того, чтобы создать обработчик пункта меню необходимо при помощи Class Wizard создать обработчик сообщения ON_COMMAND поступающего от этого пункта (Рис. 3.1.5).
  11.  

    Создайте обработчики для всех пунктов контекстного меню в классе CL3_1View.

    ///////////////////////////////////////////////////////////////

    // Обработка контекстного меню //

    ///////////////////////////////////////////////////////////////

    //Рисование квадрата

    void CL3_1View::OnMenuKv()

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

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

    CClientDC dc(this);

    // Сохраняем текущий контекст

    int old=dc.SaveDC();

    //Создаем новую кисть и новый карандаш

    //в текущем контексте устройства

    CBrush newBrush(m_col_z);

    CPen newPen(PS_DASHDOT,2,(COLORREF) m_col_l);

    //Выбираем созданные кисть и карандаш в

    //текущем контексте устройства

    dc.SelectObject(&newPen);

    dc.SelectObject(&newBrush);

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

    dc.Rectangle(mouse_x-10,mouse_y-10,mouse_x+10,mouse_y+10);

    //Востанавливаем старый контекст устройства

    dc.RestoreDC(old);

    }

    // Рисование элипса

    void CL3_1View::OnMenuEl()

    {

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

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

    CClientDC dc(this);

    // Сохраняем текущий контекст

    int old=dc.SaveDC();

    //Создаем новую кисть и новый карандаш

    //в текущем контексте устройства

    CBrush newBrush(m_col_z);

    CPen newPen(PS_DASHDOT,2,(COLORREF) m_col_l);

    //Выбираем созданные кисть и карандаш в

    //текущем контексте устройства

    dc.SelectObject(&newPen);

    dc.SelectObject(&newBrush);

    //Рисуем элипс

    dc.Ellipse(mouse_x-15,mouse_y-10,mouse_x+15,mouse_y+10);

    //Востанавливыем старый контекст устройства

    dc.RestoreDC(old);}

    // Рисование линии

    void CL3_1View::OnMenuLine()

    {

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

    CClientDC dc(this);

    int old=dc.SaveDC();

    CPen newPen(PS_DASHDOT,2,(COLORREF) m_col_l);

    dc.SelectObject(&newPen);

    dc.MoveTo(mouse_x-10,mouse_y+10);

    dc.LineTo(mouse_x+10,mouse_y-10);

    dc.RestoreDC(old);

    }

  12. Программирование команд главного меню. Добавьте обработчики для пунктов главного меню. А также создайте обработчики для сообщений UDATE_COMMAND_UI. Это необходимо, для того чтобы Вы могли модифицировать пункты меню в процессе работы программы. Т.е. включать и выключить их, а также выводить перед пунктом флажок, отмечая, что этот пункт выбран.
  13. /////////////////////////////////////////////////////////////

    // Обработка комманд главного меню //

    ////////////////////////////////////////////////////////////

    // КРАСНАЯ ГРУППА

    // Обработка командного сообщения поступающего от пункта

    // Цвета линий->Красный

    ////////////////////////////////////////////////

    void CL3_1View::OnMenuLred()

    {

    //Если признак "выбранности" данного пункта

    //до этого не был установлен, то установить его,

    //и цвет ЛИНИЙ сделать красным. В противном случае

    //установить признак снятия "выбранности" и установить

    //черный цвет линий

    if (m_lred==0) {m_lred=1; m_col_l=RGB(255,0,0);}

    else {m_lred=0;m_col_l=RGB(0,0,0);}

    }

    // Обработка командного сообщения поступающего от пункта

    // Цвета заливки->Красный

    ////////////////////////////////////////////////

    void CL3_1View::OnMenuZred()

    {

    //Если признак "выбранности" данного пункта

    //до этого не был установлен, то установить его,

    //и цвет ЗАЛИВКИ сделать красным. В противном случае

    //установить признак снятия "выбранности" и установить

    //черный цвет линий

    if (m_zred==0) {m_zred=1;m_col_z=RGB(255,0,0);}

    else {m_zred=0;m_col_z=RGB(0,0,0);}

    }

    ////////////////////////////////////////////////

    //Модификация пункта Цвета линий-> Красный в соответствии

    //с признаками "выбранности"

    void CL3_1View::OnUpdateMenuLred(CCmdUI* pCmdUI)

    {

    // Если установлен ризнак "выбранности" красной ЗАЛИВКИ

    // то сделать пункт "Цвета линий -> красный" неактивным

    // в противном случае сделать его активным и установить

    // флажок в соответствии с признаком “выбранности.”

    if (m_zred==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_lred);

    }

    }

    //Модификация пункта Цвета заливки-> Красный в соответствии

    //с признаками "выбранности"

    ////////////////////////////////////////////////

    void CL3_1View::OnUpdateMenuZred(CCmdUI* pCmdUI)

    {

    // Если установлен ризнак "выбранности" красной ЛИНИИ

    // то сделать пункт "Цвета заливки -> красный" неактивным

    // в противном случае сделать его активным и установить

    //флажок в соответствии с признаком “выбранности.”

    if (m_lred==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_zred);

    }

    }

    ////////////////////////////////////////////////

    // СИНЯЯ ГРУППА

    ////////////////////////////////////////////////

    // Обработка командного сообщения поступающего от пункта

    // Цвета линий->Синий

    void CL3_1View::OnMenuLblur()

    {

    if (m_lblur==0) {m_lblur=1; m_col_l=RGB(0,0,255);}

    else {m_lblur=0;m_col_l=RGB(0,0,0);}

    }

    ////////////////////////////////////////////////

    //Модификация пункта Цвета линий-> Синий в соответствии

    //с признаками "выбранности"

    void CL3_1View::OnUpdateMenuLblur(CCmdUI* pCmdUI)

    {

    if (m_zblur==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_lblur);

    }

    }

    ////////////////////////////////////////////////

    // Обработка командного сообщения поступающего от пункта

    // Цвета заливки->Синий

    void CL3_1View::OnMenuZblur()

    {

    if (m_zblur==0) {m_zblur=1; m_col_z=RGB(0,0,255);}

    else {m_zblur=0;m_col_z=RGB(0,0,0);}

    }

    ////////////////////////////////////////////////

    //Модификация пункта Цвета заливки-> Синий в соответствии

    //с признаками "выбранности"

    void CL3_1View::OnUpdateMenuZblur(CCmdUI* pCmdUI)

    {

    if (m_lblur==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_zblur);

    }

    }

    ////////////////////////////////////////////////

    // ЗЕЛЕНАЯ ГРУППА

    ////////////////////////////////////////////////

    // Обработка командного сообщения поступающего от пункта

    // Цвета линий->Зеленый

    void CL3_1View::OnMenuLgreen()

    {

    if (m_lgreen==0) {m_lgreen=1; m_col_z=RGB(0,255,0);}

    else {m_lgreen=0;m_col_z=RGB(0,0,0);}

    }

    ////////////////////////////////////////////////

    //Модификация пункта Цвета линий-> Зеленый в соответствии

    //с признаками "выбранности"

    void CL3_1View::OnUpdateMenuLgreen(CCmdUI* pCmdUI)

    {

    if (m_zgreen==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_lgreen);

    }

    }

    ////////////////////////////////////////////////

    // Обработка командного сообщения поступающего от пункта

    // Цвета заливки->Зеленый

    void CL3_1View::OnMenuZgreen()

    {

    if (m_zgreen==0) {m_zgreen=1; m_col_z=RGB(0,255,0);}

    else {m_zgreen=0;m_col_z=RGB(0,0,0);}

    }

    ////////////////////////////////////////////////

    //Модификация пункта Цвета заливки-> Зеленый в соответствии

    //с признаками "выбранности"

    void CL3_1View::OnUpdateMenuZgreen(CCmdUI* pCmdUI)

    {

    if (m_lgreen==1) {pCmdUI->Enable(FALSE);}

    else

    {

    pCmdUI->Enable();

    pCmdUI->SetCheck(m_zgreen);

    }

    }

  14. Домашняя работа. Усовершенствовать программу таким образом, чтобы при перерисовке экрана фигуры не пропадали.