Лабораторная работа № 2. Клиентская область
Цель:Научиться работать с клиентской областью. Сделать подписи, научиться рисовать простейшие геометрические фигуры средствами WinAPI.
Краткие теоретические сведения:
FillRect – заполняет указанную прямоугольную область, используя заданную кисть, до правой и нижней границ.
SetRect – задает координаты указанной прямоугольной области.
Задание:
2.1. Разбить клиентскую область на 6 частей и вывести в них прямоугольник, квадрат, ромб, эллипс, сектор (45 градусов), равносторонний треугольник. Для построения треугольника и ромба использовать отрезки. Сделать подписи под каждым рисунком. Использовать параметры пера и кисти. В правом нижнем углу экрана написать свою фамилию и инициалы.
2.2. Распечатать расписание занятий вида, представленного на рис. 1
РАСПИСАНИЕ ЗАНЯТИЙ
Рис.1. Вид документа расписания занятий
и так далее, используя различные цвета заливки для различных видов занятий.
2.3. Разработать приложение так, чтобы в окне было изображено несколько прямоугольников разных цветов (см. рис. 2).
Рис. 2. Пример клиентской области
Используя FillRect, избавиться от рамок прямоугольников. Используя близкие по значениям цвета, получить эффект плавного перехода.
2.4.Задавая координаты центров и длины сторон случайным образом, нарисовать 10 закрашенных прямоугольников.
Анализ реализации алгоритма:
При выполнении первого задания для разбиения клиентской области на 6 частей я использовала функции MoveToEx() и LineTo().
Для вывода прямоугольника, квадрата, эллипса, сектора я использовала стандартные функции Rectangle(), Ellipse(), Pie(); для построения треугольника и ромба отрезками – функции MoveToEx() и LineTo().
Чтобы сделать подписи под каждым рисунком и в правом нижнем углу экрана написать свою фамилию и инициалы, я использовала функцию TextOut().
Исходный код:
MoveToEx(hdc, (R.right/3), R.top, NULL);
LineTo(hdc, (R.right/3), R.bottom);
SetTextColor(hdc,RGB(150,150,0));
TextOut(hdc,R.right-100,R.bottom-20,"Герман П.В.",11);
Pie(hdc, 85+R.right/3,R.bottom/2+40,2*R.right/3-85,R.bottom-40, R.right/2, R.bottom/2+40, 10, 10);//сектор
MoveToEx(hdc, 5*(R.right/6) , (R.bottom)/2+40, NULL);
LineTo(hdc, 5*(R.right/6)+50, (R.bottom)/2+126.6);
LineTo(hdc, 5*(R.right/6)-50 ,(R.bottom)/2+126.6 );
LineTo(hdc, 5*(R.right/6) , (R.bottom)/2+40); //треугольник
Скриншоты реализации можно просмотреть в приложении 2.
Во втором задании создание и заполнение таблицы я оформила в виде цикла, используя функции MoveToEx(), LineTo(), FillRect(), DrawText().
Исходный код:
for (int i=1; i<11; ++i)
{
MoveToEx (hdc, 50, 20+i*(rect.bottom-25)/11, 0);
LineTo (hdc, rect.right-5, 20+i*(rect.bottom-25)/11);
}
if((i==0 || i==6) &&( (j==1)||(j==0) || (j==2)) )
{
hbr=CreateSolidBrush(RGB(180,240,240));
FillRect(hdc,&rectt,hbr);
SetBkColor (hdc, RGB(180,240,240));
rectt.top=20+((rect.bottom-25)/11)+i*(rect.bottom-25)/11+1;
DrawText (hdc, "Алгебра ауд.506",15, &rectt, DT_SINGLELINE| DT_CENTER | DT_END_ELLIPSIS);
}
static LOGFONT lf; //атрибуты шрифта
lf.lfEscapement=900; //поворот против часовой от горизонтали
lf.lfCharSet=DEFAULT_CHARSET; //установка языка (default – самоопределение)
lf.lfPitchAndFamily=DEFAULT_PITCH; //ширина символов
lf.lfHeight=20; //высота символа
Скриншоты реализации можно просмотреть в приложении 2.
Для выполнения третьего задания я использовала FillRect, чтобы избавиться от рамок прямоугольников. Эффект плавного перехода получился при помощи незначительного изменения цвета каждого прямоугольника в цикле:
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);
}
Скриншоты реализации можно просмотреть в приложении 2.
Для выполнения четвертого задания я использовала датчик случайных чисел, чтобы задавать координаты центров и цвета случайным образом, и функции SetRect() и FillRect(), чтобы нарисовать и закрасить прямоугольники:
for(int i=0;i<10; i++)
{
hBrush1=CreateSolidBrush(RGB(rand()%255,rand()%255,rand()%255));
SetRect(&R1,rand()%500,rand()%500,rand()%500,rand()%500);
FillRect(hdc,&R1,hBrush1);
}
Скриншоты реализации можно просмотреть в приложении 2.
Выводы:Научилась работать с клиентской областью. Разработала приложение “Расписание занятий”. Изучила функции создания и удаления объектов для рисования, а также функции создания геометрических фигур.