Задача 10. Горизонтальне меню. Побудувати зображення меню і забезпечити рух курсору миші по об'єктах меню

Лабораторна робота № 7.

Робота з графiчним модулем мови С.

Метароботи. Навчитися працювати з різноманітними функціями графічного модуля. У запропонованих задачах потрібно, користуючись засобами графіки відтворити на екрані необхідний рисунок. Бажано користуватись шрифтами, штриховкою та іншими засобами графічного модуля мови Сі.

Приклади розв‘язання задач

Задача 1.

Зобразити на екрані прямокутник і забезпечити можливість його пересування за допомогою клавіш керування курсором.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#define BGIPATH "С:\\borlandc\\bgi"

// Директорія, що містить файли *.bgi. Можливо, на Вашій машині необхідно

// змінити значення BGI PATH.

#define ESC 27 // Коди клавіш, що повертаються getch()

#define UP_ARROW 72

#define DOWH_ARROW 80

#define RIGHT_ARROW 77

#define LEFT_ARROW 75

void Initialize ( ) ;

void MoveRec ( ) ;

int GraphDriver; // Номер драйвера

int GraphMode; // Номер графічного режиму

int MaxX, MaxY; // Максимальний роздільність екрана

int MaxColors; // Максимальне доступне число кольорів

int ErrorCode; // Код завершення графічної функції

void main ( )

{

Initialize ( ) ;

MoveRec ( ) ;

closegraph ( ) ;

}

void Initialize ( )

{

detectgraph (&GraphDriver, &GraphMode);

initgraph (&GraphDriver, &GraphMode, BGIPATH);

ErrorCode - graphresult ();

if < ErrorCode != grOk )

{

printf ("Помилка ініціалізації: %s\n", grapherrormsg ( ErrorCode ) );

exit (1);

}

MaxColors=getmaxcolor ( ) +1; //Визначаємо максимальне число кольорів

MaxX=getmaxx ( ); //Визначаємо розмір екрана

MaxY=getmaxy ( );

}

void MoveRec ( )

{

int i, x, y, x1, y1, x2, y2;

int scalex=1, scaley=1;

setbkcolor (BLUE) ;

setfillstyle (1, WHITE);

//Зобразити прямокутник у центрі екрана - початкова позиція

х1=MaxX/2 -70; y1=MaxY/2-20;

x2=MaxX/2+70; y2=MaxY/2+20;

bar(x1, y1, х2, у2);

// Очікувати натискання клавіші. Вихід при натисканні клавіші <ЕSС>

for (i=getch( ); i != ESC; i=getch() )

{

if (і) continue; // Алфавітно-цифрова клавіша

switch (getch ())

{

case UP_ARROW : x=0; y=-1; break;

case DOWH_ARROW : x=0; y=1; break;

case RIGHT_ARROW : x=1; y=0; break ;

case LEFT_ARROW : x=-1; y=0; break;

default : continue;

}

// чи не вийшли за межі екрана?

if ( ( x1+x*scalex<0) || (x2+x*scalex>MaxX) ) x=0;

if ( ( y1+y*scaley<0) || (y2+y*scaley>MaxY) ) y=0;

//Вилучити старе зображення – зафарбувати кольором фону

setfillstyle (1, BLUE);

bar (x1, y1, x2, y2);

//Нарисувати прямокутник у нових координатах, використовуючи масштабування

setfillstyle (1, RED);

x1+=x*scalex; x2+=x*scalex;

| y1+=y* scaley; у2+=у * scaley;

bar (x1, y1, x2, y2);

}

}

 

Задача 2.

Одержати на екрані картину "зоряного неба", причому заповнення екрана повинне виконуватися в два прийоми: спочатку верхня частина екрана, потім нижня.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#define BGIPATH "С:\\borlandc\\bgi"

void Initialize ( ) ;

void Pixel ( ) ;

int GraphDriver, GraphMode, MaxX, MaxY, MaxColors, ErrorCode;

void main ( )

{

Initialize ( ) ;

Pixel ( ) ;

closegraph ( ) ;

}

void Initialize ( )

{

GraphDriver = DETECT; // Автовизначення типу графічного адаптера

initgraph (&GraphDriver, &GraphMode, “ “ );

MaxColors=getmaxcolor ( ) + 1 ;

MaxX = getmaxx ( ) ; MaxY = getmaxy ( ) ;

}

void Pixel ( )

{

int seed= 1000;

int x,у, h, w, color;

long int і;

cleadevice ( );

rand (seed); // Виведення у верхній частині екрана

// Вивести 20000 пікселів на екран

for( і=0; і<20000 ; ++і)

{

x = 1 + random (МахX - 1); // Одержати координати чергового пікселя

y = 1 + random (МахY/2 - 1);

// Вибір кольору і виведення пікселя на екран

color = random (MaxColors);

putpixel (x, у, color);

}

// Виведення у нижній частині екрана з використанням відсічення

setviewport (0, MaxY/2, MaxX, MaxY, 1);

rand(seed);

for ( i=0; i<20000; ++i)

{

x = 1 + random (MaxX - 1);

у = 1 + random (MaxY - 1);

color = random (MaxColors);

putpixel (x, y, color);

}

getch();

}

 

 

Для збереження зображень і їх послідуючого відтворення використовують функції getimage, imagesize, putimage. Для того, щоб запам’ятати бітове зображення повинен бути виділений необхідний об’єм пам’яті прямокутника екрану за допомогою функції imagesize.

Її прототип unsigned far imagesize(int left, int top, int right, int bottom); де left, top – координати лівого верхнього кута прямокутника;

right, bottom – координати правого нижнього кута прямокутника.

Функція getimage запам’ятовує в ОП бітове зображення прямокутної частини екрана. Її прототип:

void far getimage(int left, int top, int right, int bottom, void far *bitmap);

Перші 4 параметри подібні попереднім, а bitmap – безтиповий (void) покажчик на область ОП, в якій запам’ятовується зображення прямокутника. Функція putimage призначена для відтворення в заданому місці екрану зображення прямокутника, який запам’ятала функція getimage. Її прототип:

void far putimage(int left, int top, void far *bitmap, int op);

де left, top – координати лівого верхнього кута прямокутника;

bitmap – покажчик на область ОП, де зберігається зображення;

ор – умова виведення кольорів пікселів;

Можливі такі значення:

COPY_PUT 0 виведення копії зображення на екран

Для коду кольорів зображення:

XOR_PUT 1 виключаюче АБО

OR_PUT 2 об’єднуюче АБО

AND_PUT 3 логічне І

NOT_PUT 4 інверсія коду

При використанні значення ор=0 на екран виводиться копія зображення. При виведенні на те ж саме місце екрана того ж зображення з параметром ор=1 старе зображення стирається з екрану.

 

Завдання для виконання лабораторних робіт.

Задача 1. Обертання прямокутника. Здійснити обертання зафарбованого прямокутника в площині екрану навкруги однієї з своїх вершин.

 

Задача 2. Дошка.Зобразити на екрані приладову дошку, на якій знаходяться лампи, тумблери і прямокутні кнопки (з тінню). Забезпечити можливість:

§ вмикати/вимикати лампи (супроводжувати звуком)

§ маніпулювати тумблерами;

§ натискувати на кнопки (тінь зникає) і повертати їх в початкове положення.

 

Задача 3. На екрані зображено коло радіусу 20 з центром в точці (100,100). Необхідно надати можливість управління розміром і положенням кола

клавіша ">" збільшує радіус на 5 точок;

клавіша "<" зменшує радіус на 5 точок;

клавіші управління курсором " Ü ", " Ý ", " Þ "," ß ";

переміщають коло по екрану.

 

Задача 4. Рух символу. На екрані – символ X. Клавішами управління курсору можна переміщати його по екрану. Спроба виходу за межу екрану повинна позначатися звуковим сигналом. По натисненню клавіші "пропуск "символ починає переміщатися із залишенням за собою сліду. Повторне натиснення клавіші повертає його в колишній стан.

Задача 5. Прямокутник. На екрані зображений прямокутник. Необхідно надати можливість управління його розмірами і положенням:

клавіша ">" збільшує ширину на 5 точок;

клавіша "<" зменшує ширину на 5 точок;

клавіша "+" збільшує висоту на 5 точок;

клавіша "-" зменшує висоту на 5 точок;

клавіші управління курсором " ", " ", " "," "; переміщають прямокутник по екрану.

Задача 6. Жуки. На площині сидять N жуків. Kожен з них з постійною швидкістю, рівною 1, повзе до наступного (N-й до першого). Якщо відстань між жучками стає меншою або рівною 1, переслідуваний жук вважається з'їденим. Зобразити еволюцію системи.

 

Задача 7. Ліфт. В будинку N поверхів і 3 ліфти. Кожний з ліфтів може бути вільним або зайнятим. На одному з поверхів стоїть людина. Він повинен викликати найближчий вільний ліфт, а якщо такого немає, найближчий зайнятий, який їде у бік поверху, де стоїть людина. Показати картину руху ліфтів.

Задача 8. Лампочка. Одержати на екрані рисунок лампочки і забезпечити можливість «запалювати» і «гасити» нарисовану лампочку: Вмикання і вимикання лампочки повинне виконуватися з клавіатури, спіраль запаленої і погашеної лампочок зафарбовується в різні кольори.

Задача 9. Будинок. Одержати на екрані рисунок і забезпечити можливість «запалювати» і «гасити» колір у будинку: включення і вимикання повинне виконуватися з клавіатури, вікно фарбується в різні кольори.

 

Задача 10. Горизонтальне меню. Побудувати зображення меню і забезпечити рух курсору миші по об'єктах меню.

 

С
Б
А