Назад | Начало урока |
Содержание

Ответы 4_1

На этой странице ответы на вопросы главы 4.

Вопросы
  1. С какими сообщениями мыши можно связать функции?

    Сообщения от мыши можно связать с такими сообщениями: WM_LBUTTONDOWN
    WM_LBUTTONUP
    WM_LBUTTONDBLCLK
    WM_RBUTTONDOWN
    WM_RBUTTONUP
    WM_RBUTTONDBCLK
    WM_MLBUTTONDOWN
    WM_MLBUTTONUP
    WM_MLBUTTONDBCLK
    WM_XBUTTONDOWN
    WM_XLBUTTONUP
    WM_XLBUTTONDBCLK
    WM_MOUSEMOVE
    WM_MOUSEWHEEL

  2. Предположим вы обрабатываете сообщение WM_ONMOUSEMOVE. Как определить была ли нажата левая кнопка мыши?

    Используя флаг MK_LBUTTON,можно наложить маску на флаги, передаваемые функции OnMouseMove :

    if((nFlags & MK_LBUTTON) == MK_LBUTTON)

  3. Как предотвратить восстановление принятой по умолчанию формы указателя мыши после того,как его форма была изменена?

    Следует в функции, обрабатывающей событие OnSetCursor возвратить значение true,чтобы предотвратить вызов основной (системной) функции OnSetCursor.

Упражнения
  1. Измените графическое приложение так,чтобы при нажатой левой кнопке мыши цвет рисуемого объекта был красным (RGB(255,0,0)),а при нажатой правой - голубым(RGB(0,0,255)).

    Далее создайте функцию обрабатывающую сообщение о событии WM_RBUTTONDOWN и добавьте в нее следующий код:

    void CMouseDlg::OnRButtonDown(UINT nFlags, CPoint point)
    {

    //установить текущую точку в качестве исходной
    m_iPrevX = point.x;
    m_iPrevY = point.y;
    CDialog::OnRButtonDown(nFlags, point);
    }

    Дополните функцию OnMouseMove следующим кодом:

    void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)
    {

    //выяснить нажата ли левая кнопка мыши
    if((nFlags & MK_LBUTTON) == MK_LBUTTON||
    (nFlags & MK_RBUTTON) == MK_RBUTTON))
    {
    //получить контекст устройства
    CClientDC dc(this);
    CPen* pPrevPen = 0;

    if((nFlags & MK_LBUTTON) == MK_LBUTTON)
    {

    //создать новое перо
    CPen lpen(PS_SOLID, 14, RGB(255, 0, 0));

    //использовать новое перо
    pPrevPen = dc.SelectObject(&lpen);

    //провести линию от предыдущей точки до текущей точки
    dc.MoveTo(m_iPrevX,m_iPrevY);
    dc.LineTo(point.x,point.y);

    }

    if((nFlags & MK_RBUTTON) == MK_RBUTTON)
    {

    //создать новое перо
    CPen lpen(PS_SOLID, 14, RGB(0, 0, 255));

    //использовать новое перо
    pPrevPen = dc.SelectObject(&lpen);

    //провести линию от предыдущей точки до текущей точки
    dc.MoveTo(m_iPrevX,m_iPrevY);
    dc.LineTo(point.x,point.y);

    }

    //сохранить текущую точку в качестве предыдущей точки
    m_iPrevX = point.x;
    m_iPrevY = point.y;

    //восстановить предыдущее перо
    dc.SelectObject(pPrevPen);

    }
    CDialog::OnMouseMove(nFlags,point);
    }

  2. Усовершенствуйте функцию OnKeyDown,добавив в нее следующие стандартные указатели мыши:


Назад | Начало урока | Вверх |
Содержание

Hosted by uCoz