Окна с геометрией данных
Мы вызываем функцию после того, как обнаружен факт выхода за пределы окна и снята подсветка, то есть стерт обрамляющий прямоугольник:
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.