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

 

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

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

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

void CCircleFill::Draw (CDC *PDC) (
CBrush Brush, *P01dBrush; CPen Pen, *POldPen;
// выберите перо/кисть:
Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (SPen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (SBrush);
// нарисуйте фигуру:
PDC->Ellipse (m_Xl, m_Yl, m_X2, m_Y2);
// удалите перо/кисть: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); }
Каждая функция Draw использует средства рисования фигур, описанные в этой главе. Функция Draw при рисовании разомкнутой фигуры выбирает объект nullbrush так, что внутренняя область фигуры не заполняется. Заметьте: функция Draw для замкнутых фигур инициализирует перо, используя стиль ps_ins i deframe (фигура будет находиться полностью внутри ограничивающего прямоугольника, созданного в окне представления). Классы рисования закругленных прямоугольников CRectRound и CRectRoundFill вычисляют размер эллипса для рисования закругленного угла.
int SizeRound = (m_X2 - m_Xl + m_Y2 - m_Yl) / 6; PDC->RoundRect (m_Xl, m_Yl, m_X2, m_Y2, SizeRound, SizeRound);
Диаметр окружности, используемой для закругления углов, равен одной трети среднего арифметического длин сторон прямоугольника.
Другие модификации программы
Внесем в программу изменения, необходимые для рисования различных типов фигур. Удалите в файле MiniDrawDoc.h объявления функций AddLine и GetLine класса CMiniDrawDoc. Замените имя функции CMiniDrawDoc::GetNumLines на CMiniDrawDoc::GetNumFigs, а имя переменной m_LineArray на m_FigArray (они используются для всех типов фигур, а не только линий). Измените также тип указателя, сохраняемого в CTypePtrArray с CLine на CFigure. Наконец, добавьте объявления функций AddFigure и GetFigure.
class CMiniDrawDoc : public CDocument {
protected:
CTypedPtrArray<CObArray, CFigure*> m_FigArray;
public:
// удаленные объявления AddLine и GetLine void AddFigure (CFigure *PFigure); CFigure *GetFigure (int Index);
int GetNumFigs О; // измененное имя из GetNumLines
// оставшаяся часть определения класса CMiniDrawDoc ...
Аналогично в файле MiniDrawDoc.cpp удалите реализацию функций
CMiniDrawDoc::AddLine и CMiniDrawDoc::GetLine, замените имя GetNumLines на GetNumFigs и добавьте следующие реализации для новых функций AddFigure и GetFigure:
// удаленные функции CMiniDrawDoc::AddLine и CMiniDrawDoc::GetLine
void CMiniDrawDoc::AddFigure (CFigure *PFigure) {
m_FigArray.Add (PFigure);
SetMbdifiedFlag ();
}
CFigure *CMiniDrawDoc::GetFigure (int Index) (
if (Index < 0 I I Index > m_FigArray.GetUpperBound ()) return 0;
return (CFigure *)m_FigArray.GetAt (Index); }
int CMiniDrawDoc::GetNumFigs () // имя, измененное из GetNumLines
{
return m_FigArray.GetSize (); }
Новые функции добавляют или получают указатели на объект класса CFigure вместо указателей на объект CLine. В отличие от функции AddLine функция AddFigure не вызывает операцию new для создания объекта. Эту задачу выполняет класс представления.
В файле MiniDrawDoc.cpp замените также все имена объекта ir._LineArray именем m_FigArray (всего 11 замен).
В файл MiniDrawView.h добавьте определение для переменной mPenDotted в начале определения класса CMiniDrawView.
class CMiniDrawView : public CScrollView {
protected:
CString m_ClassName; int m_Dragging; HCURSOR m_HArrow; HCURSOR m_HCross; CPen m_PenDotted; CPoint m_Point01d; CPoint m_PointOrigin;
В файле MiniDrawView.cpp добавьте в конструктор класса CMiniDrawView следующую инициализацию m_PenDotted.
CMiniDrawView::CMiniDrawView() {
// T0D0: добавьте здесь собственный конструктор m_Dragging = 0;
m_HArrow = AfxGetApp ()->LoadStandardCursor (IDC_ARR0W); m_HCross = AfxGetApp ()->LoadStandardCursor (IDC_CROSS);
m_PenDotted.CreatePen (PS_DOT, 1, RGB (0,0,0));
Переменная m_PenDotted используется для рисования временных пунктирных линий (вместо сплошных) при перетаскивании указателя мыши для рисования фигуры. Остальные изменения внесите в файл MiniDrawView.cpp.
Измените функцию OnMouseMove следующим образом.
void CMiniDrawView::OnMouseMove(UINT nFlags, CPoint point) {
// TODO: Здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
CClientDC ClientDC (this); OnPrepareDC (SClientDC); ClientDC.DPtoLP (Spoint);
if (!m_Dragging) {
CSize ScrollSize = GetTotalSize ();
CRect ScrollRect (0, 0, ScrollSize.cx, ScrollSize.cy); if (ScrollRect.PtlnRect (point))
: :SetCursor (m HCross); else
: :SetCursor (m HArrow); return ; }
ClientDC.SetROP2 (R2_N0T); ClientDC.SelectObject (fim_PenDotted); ClientDC. SetBkMode (TRANSPARENT) ; ClientDC.SelectStockObject (NULLJBRUSH);
switch (((CMiniDrawApp *)AfxGetApp () ) ->m_CurrentTool) (
case ID_TOOLS_LINE:
ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (m_Point01d); ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (point); break;
case ID_TOOLS_RECTANGLE: case ID_TOOLS_RECTFILL:
ClientDC.Rectangle (m_PointOrigin.x, m_PointOrigin.у,
m_Point01d.x, m_Point01d.y); ClientDC.Rectangle (m_PointOrigin.x, m_PointOrigin.у, point.x, point.y);
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100