Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаФИН kosh.doc
Скачиваний:
29
Добавлен:
15.02.2016
Размер:
3.16 Mб
Скачать

Практическое занятие №8 Тема: «Элементы графики. Использование мыши».

8.1. Приложение, которое строит четырехугольник, вершины кото­ро­го задает пользователь щелчками левой кнопки мыши. Программа проводит диагонали четырехугольника и выводит на экран их длины в точках и см.

Создайте однодокументное приложение (Single Document).

В окне Solution Explorer раскройте раздел Header Files и сделайте мы­шью двойной щелчок по имени файла View.h, в рабочей области откро­ется текст файла. Этот файл содержит объявление класса C…View. В этом классе объявите переменные:

int i; // счетчик щелчков левой кнопкой мыши

CPoint p[4]; // массив для хранения координат вершин 4-угольника

CString text; // объект для вывода текста

Откройте файл …View.cpp.

В конструкторе проинициализируйте счетчик i:

C…View::C…View()

{

i = 0;

}

Найдите функцию OnDraw(…).

Измените текст функции как показано ниже.

void CQuadrangleView::OnDraw(CDC* pDC)

{

CBrush* pBrush;

CBrush NewBrush(RGB(0,255,255)); // Кисть для закраски 4-хугольника

CPen* pPen;

CPen NewPen(PS_DOT,1,RGB(0,125,125)); // Перо для диагоналей

if (i == 0)

pDC->DrawText("Задайте четыремя щелчками мыши вершины \

4-хугольника",CRect(10,10,500,30),DT_CENTER);

else

{

if (i>0 && i<4) // если пользователь щелкнул мышью менее 4 раз

// рисуем точки там, где пользователь щелкнул мышью:

for (int j = 0; j<i; j++)

pDC->SetPixel(p[j],RGB(0,0,0));

else if (i==4) // Если заданы все 4 вершины четырехугольника

{

pBrush = pDC->SelectObject(&NewBrush);

// подключаем кисть

pDC->Polygon(p,4); // рисуем четырехугольник

// устанавливаем перо:

pPen = pDC->SelectObject(&NewPen);

// рисуем диагонали:

pDC->MoveTo(p[0]);

pDC->LineTo(p[2]);

pDC->MoveTo(p[1]);

pDC->LineTo(p[3]);

// восстанавливаем контекст устройства:

pDC->SelectObject(pBrush);

pDC->SelectObject(pPen);

// Устанавливаем шрифт:

CFont* pFont;

CFont MyFont;

MyFont.CreateFont(25, 0,0,0,20, true, true, false,

0,0,0,0,0, "Arial cyr");

pFont = pDC->SelectObject(&MyFont);

pDC->SetTextColor(RGB(0,0,255)); // цвет текста

pDC->SetBkMode(TRANSPARENT); // прозрачный цвет знакоместа

CRect rect;

// прямоугольник, соответствующий клиентской области окна

GetClientRect(&rect);

// Выводим текст на экран:

pDC->DrawText(text, rect, DT_CENTER);

pDC->SelectObject(pFont); // восстанавливаем шрифт

}

}

}

В окне Class View щелкните правой кнопкой по имени класса С…View и в появившемся контекстном меню выберите Properties.

В окне Properties откройте вкладку Messages. На этой странице пере­чис­лены сообщения, которые могут передаваться клиентской области окна. Вы­берите в списке сообщение WM_LBUTTONDOWN и щелкните мышью спра­ва от него. Щелкните по появившейся кнопке. Вы увидите имя функции OnLButtonDown(), ко­торая обрабатывает щелчок левой кнопки мыши. Щелкните по этому имени, функция будет добавлена в класс С…View. Второй параметр этой функции CPoint point содержит координаты точки, в которой пользователь щелкнул мышью.

Добавьте в функцию код, показанный ниже.

void CQuadrangleView::OnLButtonDown(UINT nFlags, CPoint point)

{

if (i==4) i=0; // Если четырехугольник задан, обнуляем счетчик

p[i++] = point; // Запоминаем в массиве точку (вершину четырехугольника)

if (i==4) // Если заданы все вершины четырехугольника

{ // находим длины диагоналей (в точках):

double l1 = Len(p[0], p[2]);

double l2 = Len(p[1], p[3]);

text.Format("Длина диагоналей: %.0f и %.0f в точках",

l1, l2);

// Создаем контекст устройства для текущего окна:

CClientDC dc(this);

double wmm = dc.GetDeviceCaps(HORZSIZE);

// ширина экрана в мм

double wpix = dc.GetDeviceCaps(HORZRES); // в пикселях

double k = wmm/(wpix*10); // коэффициент пересчета из точек в см

int count = int(wpix*10/wmm);

// количество точек в 1 см по горизонтали

TRACE ("\n count1 = %i\n", count);

wmm = dc.GetDeviceCaps(VERTSIZE);

// высота экрана в мм

wpix = dc.GetDeviceCaps(VERTRES); // в пикселях

count = int(wpix*10/wmm);

// количество точек в 1 см по вертикали

TRACE ("\n count2 = %i\n", count);

CString str;

str.Format("Длина диагоналей: %.1f и %.1f в сантиметрах", l1*k, l2*k);

text+=("\n" + str); // формируем текст для вывода на экран

// Для сравнения можно вывести размеры клиентской области

CRect rect;

GetClientRect(&rect);

TRACE("Ширина и высота клиентской области: %i и %i точек \n", rect.right, rect.bottom);

}

Invalidate();// вызываем функцию OnDraw(…)

}

Добавьте вспомогательную функцию double Len(CPoint p1, CPoint p2)

в класс С…View. Эта функция находит длину отрезка между двумя точками.

double CQuadrangleView::Len(CPoint p1, CPoint p2)

{

return sqrt(pow(p1.x - p2.x, 2.) + pow(p1.y - p2.y,2.));

}

Откомпилируйте и запустите приложение.