- •Отчет по учебной практике
- •Оглавление
- •Html. Web – презентация с использованием css
- •Лабораторная работа № 1. Простейшее приложение
- •Лабораторная работа № 2. Клиентская область
- •Лабораторная работа № 3. Работа с таймером 1
- •Лабораторная работа №1. Простейшее приложение Windows Forms
- •Лабораторная работа №2. Наследование
- •Приложение 1 (html):
- •Приложение 2 (WinApi):
- •Приложение 3 (c#):
- •Список литературы:
Лабораторная работа № 2. Клиентская область
Цель: Научиться работать с клиентской областью. Сделать подписи, научиться рисовать простейшие геометрические фигуры средствами WinAPI.
Краткие теоретические сведения:
FillRect – заполняет указанную прямоугольную область, используя заданную кисть, до правой и нижней границ.
SetRect – задает координаты указанной прямоугольной области.
DrawText - рисует отформатированный текст в заданном прямоугольнике.
Задание:
2.1. Разбить клиентскую область на 6 частей и вывести в них прямоугольник, квадрат, ромб, эллипс, сектор (45 градусов), равносторонний треугольник. Для построения треугольника и ромба использовать отрезки. Сделать подписи под каждым рисунком. Использовать параметры пера и кисти. В правом нижнем углу экрана написать свою фамилию и инициалы.
2.2. Распечатать расписание занятий вида, представленного на рис 1.
РАСПИСАНИЕ ЗАНЯТИЙ
Рис 1. Расписание занятий
и так далее, используя различные цвета заливки для различных видов занятий.
2.3. Разработать приложение так, чтобы в окне было изображено несколько прямоугольников разных цветов, по примеру, изображенному на рис 2.
Рис 2. Прямоугольники
Используя FillRect, избавиться от рамок прямоугольников.
Используя близкие по значениям цвета, получить эффект плавного перехода.
2.4. Задавая координаты центров и длины сторон случайным образом, нарисовать 10 закрашенных прямоугольников.
Анализ реализации алгоритма:
2.1. При выполнении первого задания для разбиения клиентской области на 6 частей я использовала собственную класс Table, который разбивает экран на заданное количество частей, и функцию DrawLine(), содержащую функции MoveToEx() и LineTo().
Для вывода прямоугольника, квадрата, эллипса, сектора я использовала стандартные функции Rectangle(), Ellipse(), Pie(); для построения треугольника и ромба отрезками собственные функции DrawingTriangle() и DrawingRomb().
Чтобы сделать подписи под каждым рисунком и в правом нижнем углу экрана написать свою фамилию и инициалы, я использовала функцию DrawText().
Исходный код:
case WM_PAINT:
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps);
RECT R, RectForPrint;
GetClientRect(hwnd, &R);
T = new Table(Dimen, R, 0, 0);
SetTextColor(hdc, RGB(150, 150, 0));
DrawText(hdc, "Прямоугольник", - 1, &GetMyRect(i++, R, Dimen, marg), DT_SINGLELINE | DT_CENTER | DT_VCENTER); //остальные подписи делаются также
Rectangle(hdc, marg, 2 * marg, R.right /Dimen[1] - marg, R.bottom /Dimen[0] - 2 * marg);
Rectangle(hdc, 4 * marg+R.right /Dimen[1], ((R.bottom /Dimen[0]) - (R.right /Dimen[1])+(8 * marg)) /2,
2 * R.right /Dimen[1] - 4 * marg, (R.bottom /Dimen[0]+R.right /Dimen[1] - 8 * marg) /2);
DrawingRomb(hdc, Dimen, R, marg);
Ellipse(hdc, 2 * marg, (Dimen[0] - 1) * R.bottom /Dimen[0]+3 * marg, R.right /Dimen[1] - 2 * marg, R.bottom - 4 * marg);
param = 0.040 * R.bottom;
Pie(hdc, 6 * param+R.right /Dimen[1], R.bottom - 8 * param,
12 * marg+R.right /Dimen[1], R.bottom - 2 * param,
6 * param+R.right /Dimen[1], R.bottom - 8 * param,
6 * param+R.right /Dimen[1], R.bottom - 5 * param); //сектор
DrawingTriangle(hdc, Dimen, R, marg);
T ->Drawing(hdc);
EndPaint(hwnd, &ps);
break;
Результат: В ходе выполнения работы были созданы необходимые фигуры, их подписи. Результат работы можно найти в Приложении 2 (WinApi).
2.2. Сформируем таблицу, создавая каждую ячейку с помощью фукнции Rectangle. Предварительно следует создать кисти, соответствующие цветам данных ячеек. Заполним ячейки текстом с помощью функции DrawText. Для того, чтобы фон ячеек совпадал с заливкой текста (по умолчанию – белый цвет), укажем фон текста с помощью функции SetBkColor. Важно помнить, что все созданные кисти должны быть удалены после окончания рисования всех ячеек.
Исходный код:
switch (TimeTable[i][j])
{
case 0:
{
hbr = CreateSolidBrush(RGB(180, 240, 240));
SetBkColor (hdc, RGB(180, 240, 240));
FillRect(hdc, &GetMyRectForFill(i + 1, j, rect, Dim, marg, minmarg), hbr);
DrawText (hdc, "Геометрия и алгебра ауд.506", - 1, &GetMyRectForPrint(i + 1, j, rect, Dim, marg, minmarg), DT_SINGLELINE| DT_CENTER | DT_END_ELLIPSIS);
break;
}
case 1:
{
hbr = CreateSolidBrush(RGB(180, 180, 240));
SetBkColor (hdc, RGB(180, 180, 240));
FillRect(hdc, &GetMyRectForFill(i + 1, j, rect, Dim, marg, minmarg), hbr);
DrawText (hdc, "Матанализ", - 1, &GetMyRectForPrint(i + 1, j, rect, Dim, marg, minmarg), DT_SINGLELINE| DT_CENTER | DT_END_ELLIPSIS);
break;
}
По аналогии записываем каждый предмет в заранее созданную таблицу при помощи написанной функции.
Результат: В ходе выполнения работы была разработана программа, создающая таблицу расписания в соответствии с рис. 1. Результат работы можно найти в Приложении 2 (WinApi).
2.3. Для создания заданного объекта используем функцию FillRect, которая заполняет прямоугольную область, предварительно ограниченную посредством SetRect, соответсвующим цветом. Для последовательного изменения границ данной области организуем цикл for.
Исходный код:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
RECT R1, R;
HBRUSH hBrush1;
GetClientRect(hWnd, &R);
for(int i = 0; i<250; i ++ )
{
hBrush1 = CreateSolidBrush(RGB(200, 255 - i, i));
SetRect(&R1, R.left + i, R.top + i, R.right - i, R.bottom - i);
FillRect(hdc, &R1, hBrush1);
}
DeleteObject(hBrush1);
EndPaint(hWnd, &ps);
break;
}
Результат: В ходе выполнения работы была разработана программа, создающая необходимое количество прямоугольников, соблюдая условие плавного перехода цветов. Результат работы можно найти в Приложении 2 (WinApi).
2.4 С помощью датчика случайных чисел определим координаты центра, высоту и ширину прямоугольника, а также значение переменной, которая определяет его цвет. Используя данные значения, нарисуем указанный прямоугольник посредством функции Rectangle. Повторим вышеописанный порядок действий 10 раз путем организации цикла for.
Исходный код:
for(int i = 0; i<10; i ++ )
{
hBrush1 = CreateSolidBrush(RGB(200, 255 - i, i));
SetRect(&R1, R.left + i, R.top + i, R.right - i, R.bottom - i);
FillRect(hdc, &R1, hBrush1);
}
С помощью данного участка кода мы создаем 10 случайных разноцветных прямоугольников.
Результат: В ходе выполнения работы была разработана программа, создающая необходимое количество прямоугольников разных цветов и размеров. Результат работы можно найти в Приложении 2 (WinApi).
Выводы: Научилась работать с клиентской областью. Разработала приложение “Расписание занятий”. Изучила функции создания и удаления объектов для рисования, а также функции создания геометрических фигур.
