Иллюстрированный самоучитель по Visual Studio .NET

Окна с геометрией данных

Мы вызываем функцию после того, как обнаружен факт выхода за пределы окна и снята подсветка, то есть стерт обрамляющий прямоугольник:

CWndGeom::CWndGeom(CRightView *p, int id)
{
//====== Запоминаем адрес родительского окна
m_pView = р;
//====== Запоминаем адрес документа
m_pDoc = p › GetDocument();
//====== и индекс окна в массиве
m_ID = id;
}
void CWndGeom::OnPaint()
{
CPaintDC dc(this);
dc.SetMapMode(MM_ISOTROPIC);
//====== Настраиваем логическое окно
dc.SetWindowOrg (m_pDoc › m_szDoc.cx/2, m_pDoc › m_szDoc.cy/2), dc.SetWindowExt(m_pDoc › m_szDoc);
//====== Узнаем текущие размеры окна
GetClientRect(&m_Rect);
int w = m_Rect.Width (), h = m_Rect.Height ();
//====== Настраиваем аппаратное окно
dc.SetViewportOrg (w/2, h/2);
dc.SetViewportExt (w, – h);
//=== Выбираем в контейнере нужный полигон и просим
//=== его изобразить себя в подготовленном контексте m_pDoc › m_Shapes[m_ID].Draw(Sdc);
}
void CWndGeom::OnLButtonDown (UINT nFlags, CPoint point)
{
//====== Изменяем дежурный полигон
m_pDoc › m_Poly = m_pDoc › m_Shapes [m_ID];
//== Если не было CDrawView, то создаем его
if (m_pDoc › MakeView())
return;
//=== Если он был, то находим его и делаем активным
CView *pView = m_pDoc › GetView (RUNTIME_CLASS (CDrawView);
{
(CMDIChildWnd*)pView › GetParentFrame ()
} › MDIActivate ();
//====== Перерисовка с учетом изменений
pView › Invalidate ();

Все "мышиные" сообщения сопровождаются параметрами, которые информируют нас о том, где и как произошло событие. Первый параметр есть набор битов, указывающих, какие виртуальные клавиши были нажаты в момент события. Например, если nFlags содержит бит с именем MK_CONTROL (символическая константа), то это означает, что в момент нажатия левой кнопки мыши также была нажата клавиша CTRL. Второй параметр содержит координаты (х, у) местоположения курсора в момент события. Они заданы относительно верхнего левого угла клиентской области окна:

void CWndGeom: lOnMouseMove (UINT nFlags, CPoint point)
{
//====== Если указатель мыши в пределах окна,
if (m_Rect.Pt!nRect (point))
{
//====== то захватываем мышь, выбираем перо
//====== и рисуем обрамляющий прямоугольник
SetCapture ();
CClientDC dc(this);
CPen pen (PS_SOLID, 4, RGB (192, 192, 255));
dc.SelectObject (&pen);
dc.MoveTo(m_Rect.left+4, m_Rect .top+4);
dc.LineTo (m_Rect.right-4, m_Rect .top+4);
dc.LineTo (m_Rect.right-4, m_Rect.bottom-4);
dc.LineTo (m_Rect.left+4, m_Rect.bottom-4);
dc.LineTo (m_Rect.left+4, m_Rect .top+4);
}
else
{
ReleaseCapture ();
// Освобождаем мышь Invalidated;
// Прямоугольник будет стерт
}
}

Так как в коде функции OnLButtonDown содержится обращение к объекту класса CDrawView, то необходимо в список директив препроцессора текущего файла (RightView.cpp) вставить еще одну: #include "DrawView.h.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.