Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 75

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 69 70 71 72 73 74 < 75 > 76 77 78 79 80 81 .. 173 >> Следующая

break;
case ID_TOOLS_RECTROUND: case ID_TOOLS_RECTROUNDFILL: {
int SizeRound = (abs (m_Point01d.x - m_PointOrigin.x) + abs (m_Point01d.у - m_PointOrigin.у)) / 6;
ClientDC.RoundRect (m_PointOrigin.x, m_PointOrigin.у, m_Point01d.x, m_Point01d.у, SizeRound, SizeRound);
SizeRound = (abs (point.x - m_PointOrigin.x) +
abs (point.у - m_PointOrigin.y)) / 6;
ClientDC.RoundRect (m_PointOrigin.x, m_PointOrigin.у, point.x, point.у, SizeRound, SizeRound);
break; }
case ID_TOOLS_CIRCLE: case ID_TCOLS_CIRCLEFILL:
ClientDC.Ellipse (m_PointOrigin.x, m_PointOrigin.у,
m_Point01d.x, m_Point01d.y); ClientDC.Ellipse (m_PointOrigin.x, m_PointOrigin.у, point.x, point.y);
break;
}
m_Point01d = point;
CScrollView::OnMouseMove(nFlags, point);
}
Вновь добавленные строки удаляют прежнюю временную фигуру, а затем перерисовывают новую с текущей позиции мыши. Временная фигура отмечает место, где будет нарисована постоянная фигура, если пользователь отпустит кнопку мыши. Код начинается с выбора соответствующих инструментов рисования и установки необходимых атрибутов. Затем он переходит на соответствующую подпрограмму рисования для выбранного текущего инструмента рисования.
Измените функцию OnLButtonUp.
void CMiniDrawView::OnLButtonUp(UINT nFlags, CPoint point) {
// TODO: Здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
if (!m_Dragging) return;
m_Dragging = 0; ::ReleaseCapture () ; ::ClipCursor (NULL);
CClientDC ClientDC (this);
OnPrepareDC (SClientDC);
ClientDC.DPtoLP (Spoint);
ClientDC.SetR0P2 <R2_N0T);
ClientDC.SelectObject (Sm_PenDotted);
ClientDC.SetBkMode (TRANSPARENT) ;
ClientDC.SelectStockObject (NULL_BRUSH);
CMiniDrawApp *PApp = (CMiniDrawApp *)AfxGetApp (); CFigure *PFigure;
switch (PApp->m_CurrentTool) {
case ID_TOOLS_LINE:
ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (m_Point01d); PFigure = new CLine
(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y,
PApp->irt CurrentColor,
PApp->m CurrentThickness); break ;
case ID_TOOLS_RECTANGLE:
ClientDC.Rectangle (m_PointOrigin.x, m_PointOrigin.y,
m_Point01d.x, m_Point01d.y); PFigure = new CRectangle
(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y, PApp->m_CurrentColor, PApp->itt_CurrentThickness) ; break;
case ID_TOOLS_RECTFILL:
ClientDC.Rectangle (m_PointOrigin.x, m_PointOrigin.y,
m_Point01d.x, m_Point01d.y); PFigure = new CRectFill
(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y, PApp->m_CurrentColor) ; break;
case ID_TCOLS_RECTR0UND: {
int SizeRound = (abs (m_Point01d.x - m_PointOrigin.x) + abs (m_Point01d.y - m_PointOrigin.y)) / 6;
ClientDC.RoundRect (m_PointOrigin.x, m_PointOrigin.y, m_Point01d.x, m_Point01d.y, SizeRound, SizeRound);
PFigure = new CRectRound
(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y,
PApp->m_CurrentColor,
PApp->m_CurrentThickness); break; }
case ID_TCX)LS_RECTROUNDFILL: {
int SizeRound = (abs (m_Point01d.x - m_PointOrigin.x) +
abs (m_Point01d.y - m_PointOrigin.y)) / 6; ClientDC.RoundRect (m_PointOrigin.x, m_PointOrigin.y, m_Point01d.x, m_Point01d.y, SizeRound, SizeRound); PFigure = new CRectRoundFill
(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y, PApp->m_CurrentColor); break; }
case ID_TOOLS_CIRCLE:
ClientDC.Ellipse (m_PointOrigin.x, m_PointOrigin.y,
m_Point01d.x, m_Point01d.y); PFigure = new CCircle
(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y, PApp->m_CurrentColor, PApp->m_CurrentThickness); break;
case ID_TOOLS_CIRCLEFILL:
ClientDC.Ellipse (m_PointOrigin.x, m_PointOrigin.y,
m_Point01d.x, m_Point01d.y); PFigure = new CCircleFill
(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y, PApp->m_CurrentColor); break;
)
ClientDC.SetR0P2 (R2_C0PYPEN) ; PFigure->Draw (SClientDC); CMiniDrawDoc* PDoc = GetDocument(); PDoc->AddFigure (PFigure);
PDoc->UpdateAllViews (this, 0, PFigure);
CScrollView::OnLButtonUp(nFlags, point);
\
Новый код также начинается с выбора необходимых инструментов и установки атрибутов рисования. Затем он переходит на программу, соответствующую выбранному текущему инструменту рисования. Каждая подпрограмма удаляет временную фигуру, а затем создает объект корректного класса для сохранения и рисования новой постоянной фигуры, присваивая адрес объекта PFigure. После выполнения оператора switch функция OnLButtonUp вызывает функцию SetROP2, чтобы восстановить стандартный режим рисования, и использует указатель PFigure, чтобы вызвать функцию Draw для рисования постоянной фигуры. Поскольку функция Draw является виртуальной, ее вызов автоматически вызывает соответствующую версию Draw для текущего типа фигуры. Наконец, новый код вызывает функцию MiniDrawDoc: :AddFigure, чтобы сохранить фигуру внутри класса документа, и функцию UpdateAllViews для перерисовки другого окна представления (в случае, если открыты два окна).
Наконец, необходимо изменить несколько строк внутри функции Draw.
void CMiniDrawView::OnDraw(CDC* pDC)
{
CMiniDrawDoc* pDoc = GetDocument(); ASSERT_ VALID(pDoc);
// TODO: здесь добавьте код отображения собственных данных
Предыдущая << 1 .. 69 70 71 72 73 74 < 75 > 76 77 78 79 80 81 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100