18105

Графические примитивы API Windows

Лекция

Информатика, кибернетика и программирование

Лабораторная работа №2 Графические примитивы API Windows 1. Отдельные пикселы Функция SetPixel рисует один пиксел растра. Она имеет такие аргументы: SetPixelhdc x y clr где hdc контекст xy координаты clr цвет пиксела. Аргумент clr имеет тип 4байтного COLORREF причем тр...

Русский

2013-07-06

77.01 KB

9 чел.

Лабораторная работа2

Графические примитивы API Windows

1. Отдельные пикселы

Функция SetPixel рисует один пиксел растра. Она имеет такие аргументы:

SetPixel(hdc, x, y, clr),

где hdc – контекст, x,y – координаты, clr – цвет пиксела. Аргумент clr – имеет тип 4-байтного COLORREF, причем три младших байта соответствуют компонентам Blue, Green, Red (в диапазоне от 0 до 255 каждая), а старший байт не используется. Цвет, кодируемый типом COLORREF, удобно задавать макросом Red(r,g,b). Функция SetPixel сама имеет тип COLORREF – она возвращает значение цвета пиксела. 

2. Линии

В состав API Windows входит несколько функций, которые рисуют прямые и кривые линии:

AngleArc 

дуга окружности с заданием углов

BOOL AngleArc(

 HDC hdc, // контекст устройства 

 int X, // x-координата центра окружности

 int Y, // y-координата центра окружности

 DWORD dwRadius, // радиус окружности 

 FLOAT eStartAngle, // начальный угол дуги

 FLOAT eSweepAngle  // конечный угол дуги

  );

Arc 

дуга эллипса

BOOL Arc(

 HDC hdc, // контекст устройства

 int nLeftRect, // x-координата левого верхнего угла

 int nTopRect, // y-координата левого верхнего угла

 int nRightRect, // x-координата правого нижнего угла

 int nBottomRect, // y-координата правого нижнего угла

 int nXStartArc, // x-координата начальной точки

 int nYStartArc, // y -координата начальной точки

 int nXEndArc, // x-координата конечной точки

 int nYEndArc  // y -координата конечной точки

  );

LineTo

рисование отрезка прямой линии от текущей позиции к заданной точке

BOOL LineTo(

   HDC hdc,      // контекст устройства

   int nXEnd,  // x-координата последней точки линии

   int nYEnd   // y-координата последней точки линии

  );

MoveToEx

задание текущей позиции графического вывода

BOOL MoveToEx(

   HDC hdc, // контекст устройства

   int X, // x- координата

   int Y, // y- координата 

   LPPOINT lpPoint  // адрес старой позиции

  );

Polyline 

ломаная линия из многих связанных между собой отрезков прямых (полилиния)

BOOL Polyline(

   HDC hdc, // контекст устройства

   CONST POINT *lppt, // адрес массива, содержащего конечную точку

   int cPoints  // количество точек в массиве

  );

PolylineTo

ломаная линия из многих связанных между собой отрезков прямых (полилиния)

BOOL PolylineTo(

   HDC hdc, // контекст устройства

   CONST POINT *lppt, // адрес массива точек 

   DWORD cCount  // количество точек в массиве

  );

3. Стиль линии. Перо.

Чтобы начать рисовать линии, напрмер, другим цветом, необходимо создать новое перо и выбрать его в контексте графического устройства. 

Создавая новое перо, нужно обязательно позаботиться об уничтожении предыдущего пера. Не следует пытаться уничтожить стандартные перья.

Типичная последовательность для вывода линии с заданным стилем может быть такой:

HPEN hPen, hPenOld;

hPen = CreatePen(PS_SOLID,1,RGB(255,0,0);

//формат CreatePen(стиль, толщина, цвет)

hPenOld = (HPEN)SelectObject(hdc,hPen);

. . . //здесь рисуем линии

SelectObject(hdc,hPenOld);   //выбираем предыдущее перо

DeleteObject(hPen);          //уничтожаем наше перо

Здесь создается перо, которое соответствует тонкой красной сплошной линии. После использования перо уничтожается.

Задание

Изобразить в центре экрана квадрат, движущийся по окружности и вращающийся вокруг своего центра.

Изменение координат центра квадрата и концов отрезков (сторон квадрата) можно задать через параметрическое уравнение окружности x=r cos t, y=r sint, t[0,2), r-радиус окружности.

Для создания вращения используем цикл, например, while 

t=0;

while(t<12.55){ // два оборота 

 x1=200+r*cos(t); //если окно 400х300

 y1=150+r*sin(t);  

 x2=200+r*cos(t+3.14/2);

 y2=150+r*sin(t+3.14/2);

 // (x1,y1)-координаты первой вершины квадрата

 // (x2,y2)-координаты второй вершины квадрата

 // для каждой следующей добавляем еще 3.14/2

 //находим x3 y3 x4 y4

 MoveToEx(hdc,x1,y1,NULL);

 LineTo(hdc,x2,y2);

 LineTo(hdc,x3,y3);

// аналогичные линии для 3-х других сторон

 t+=0.001;

}

Перед тем как рисовать новую позицию квадрата нужно подождать sleep(int ms) и, взяв белое перо, удалить старую позицию.

Для того, чтобы квадрат двигался по окружности, нужно создать подобный цикл для перемещения центра (вместо фиксированного 200,150).


 

А также другие работы, которые могут Вас заинтересовать

22305. Данные и основные операторы 725.5 KB
  Хороший выбор структур данных позволяет разрабатывать на языке Паскаль простые и эффективные алгоритмы. Достоинства Паскаля: он ориентирован на структурное программирование имеет развитые средства контроля и достаточно прост в изучении; язык имеет хороший состав типов и структур данных; трансляторы с Паскаля есть во всех распространенных ПК; конкретные реализации языка дают возможность использовать все аппаратные средства ПК; на основе языка Паскаль разработана Delphi одна из современных систем визуального программирования....
22306. Организация лечебно-эвакуационного обеспечения населения при ЧС 269.5 KB
  Опыт ликвидации медико-санитарных последствий ЧС позволяет выделить общие факторы обстановки, которые, как правило, имеют место при всех ЧС, сопровождающихся значительными потерями населения, и влияют на организацию лечебно-эвакуационного обеспечения. К ним можно отнести следующие...
22307. МЕДИЦИНСКОЕ ОБЕСПЕЧЕНИЕ НАСЕЛЕНИЯ ПРИ ПРОВЕДЕНИИ МЕРОПРИЯТИЙ ГРЖДАНСКОЙ ОБОРОНЫ 196 KB
  Процесс оповещения населения обязательно сопровождается организацией оповещения органов управления и ответственных должностных лиц, принимающих решения о проведении конкретных мероприятий по защите населения, аварийно-спасательных и других неотложных работ в районах чрезвычайных ситуаций.
22308. Медико-санитарное обеспечение при ликвидации последствий чрезвычайных ситуаций техногенного (антропогенного) характера 233.5 KB
  Изучить классификацию АОХВ, характеристику очагов химического и радиационного заражения при авариях на радиационно опасных и химически опасных объектах. Изучить виды дорожно-транспортных аварий и катастроф, а также чрезвычайных ситуаций на пожаро - и взрывоопасных объектах
22309. ОРГАНИЗАЦИЯ ЛЕЧЕБНО-ЭВАКУАЦИОННОГО ОБЕСПЕЧЕНИЯ НАСЕЛЕНИЯ ПРИ ЛИКВИДАЦИИ ПОСЛЕДСТВИЙ НАПАДЕНИЯ ПРОТИВНИКА 160.5 KB
  Изучить организацию лечебно-эвакуационного обеспечения населения в очагах массовых санитарных потерь при применении противником ОМП. Рассмотреть организацию оказания медицинской помощи пострадавших, медицинскую сортировку. Изучить принципиальную схему развертывания этапа медицинской эвакуации, организацию медицинской эвакуации пострадавших
22310. Медико-санитарное обеспечение при ликвидации последствий чрезвычайных ситуаций природного характера (стихийных бедствий) 271.5 KB
  Изучить условия, определяющие систему лечебно-эвакуационного обеспечения населения при ликвидации последствий чрезвычайной ситуации природного характера, особенности формирования очагов массовых санитарных потерь при землетрясениях, наводнениях, лесных и торфяных пожарах
22311. РАБОТА НЕШТАТНЫХ АВАРИЙНО-СПАСАТЕЛЬНЫХ ФОРМИРОВАНИЙ ГРАЖДАНСКОЙ ОБОРОНЫ ЗДРАВООХРАНЕНИЯ ПРИ ПРОВЕДЕНИИ СПАСАТЕЛЬНЫХ РАБОТ 235.5 KB
  Первая врачебная помощь — комплекс общеврачебных мероприятий, оказываемых в целях устранения или ослабления последствий ранений (заболеваний), угрожающих жизни пораженным, раненых и больных, предупреждения развития опасных для жизни осложнений или уменьшения их тяжести, а также подготовки нуждающихся к дальнейшей эвакуации.
22312. Управління користувачами в невеликій мережі 28 KB
  Створюючи групи і додаючи в них користувачів ви визначаєте громадянство які мають права доступу до комп'ютерів в мережі. Крім того ви дістаєте можливість розділити користувачів на групи що володіють різними правами доступу. Двічі клацніть на значку Користувачі і паролі щоб відкрити діалогове вікно. Дозвольте користувачам обов'язково указувати свої ім'я користувача і пароль для чого встановите відповідний прапорець єдиний на вкладці Користувачі діалогового вікна Користувачі і паролі Перейдіть на вкладку Додатково.