Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


бщие сведения о компонентах, инструментах для рисования




абораторная работа № 1

 

ASCII коды и их применение в С++ программах

 

Цель лабораторной работы состоит в изучении ASCII кодов символов и техники их применения в С++ программах для консольных приложений Windows. Изучаются правила написания и отладки исходных текстов С++ программ.

 

1. Общие сведения

Каждый символ, указанный на кнопке клавиатуры, характеризуется стандартным ASCII кодом, который можно использовать в исходных текстах С++ программ. Например, для проверки условия, клавиша с каким символом была нажата, необходимо записать в условие ASCII код соответствующего символа. В стандартных ASCII таблицах также имеются коды для псевдографических значков, с помощью которых можно в текстовом режиме работы программы на экране строить различные рамки или другие фигуры или обозначения. На клавиатуре каждая кнопка обозначается соответствующим Scan кодом, который вместе с ASCII кодом символа формирует Scan-ASCII код. При нажатии клавиши с символом на клавиатуре в буфер клавиатуры записывается определенный Scan-ASCII код, по которому прерывания BIOS операционной системы ПК определяют, что введено с клавиатуры в программу.

 

2. Постановка задач лабораторной работы

Задание №1. Необходимо создать консольное приложение Windows, в котором по диагонали окна будут строиться три рамки при помощи псевдографических значков. В этих рамках нужно обеспечить возможность ввода любых символов с клавиатуры и на границе рамки для последнего введенного символа на экране нужно показать ASCII код символа.

Задание №2. Создается консольное приложение Windows для работы в среде MS DOS. При работе программы на экране должны появляться запросы на ввод координат левого верхнего угла рамки и координат правого нижнего угла рамки. После ввода координат углов рамки на экране должны появиться угловые псевдографические значки, а при нажатии любой клавиши клавиатуры на экране должны рисоваться линии рамки.

 

Порядок действий и команд при выполнении Задания №1 в лабораторной работе.

Шаг 1. Через кнопку New откройте окно New Items и выберите Console Wizard и для опции Source Type задайте режим С++. В результате С++ Builder откроет шаблон текста исходной программы в таком виде

 

 

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

return 0;

}

//---------------------------------------------------------------------------

 

Шаг 2. Добавьтев соответствующие места шаблона программы указания препро-цессора, объявления и операторы в соответствии со следующим текстом программы

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#include <conio.h>

#include <system.hpp>

#include <stdio.h>

#define dx 24 /* Ширина рамки окна */

#define dy 5 /* Высота рамки окна */

void my_box(int xul,int yul,int xlr,int ylr,int btype)

{

static int boxcar[2][6] = { /* Графические символы для контура */

{ 218,196,191,179,192,217 }, /* одинарный контур */

{ 201,205,187,186,200,188 } /* двойной контур */

};

int i,hzchar,vtchar;

if(btype) {

hzchar = boxcar[btype -1][1];

vtchar = boxcar[btype -1][3];

/* Вывод верхней и нижней стороны контура */

gotoxy(xul,yul);

for(i = xul; i<= xlr; i++) putch(hzchar);

gotoxy(xul,ylr);

for(i = xul; i<= xlr; i++) putch(hzchar);

/* вывод правой и левой стороны контура */

for(i = yul; i<= ylr; i++)

{ gotoxy(xul,i); putch(vtchar);

gotoxy(xlr,i); putch(vtchar);

}

/* Вывод углов контура:*/

/* верхнего левого угла */

gotoxy(xul,yul); putch(boxcar[btype - 1][0]);

/* верхнего правого угла*/

gotoxy(xlr,yul); putch(boxcar[btype - 1][2]);

/* нижнего левого угла*/

gotoxy(xlr,ylr); putch(boxcar[btype - 1][5]);

/* нижнего правого угла */

gotoxy(xul,ylr); putch(boxcar[btype - 1][4]);

 

}

}

//----------------------------------------------------------------------------

 

#pragma argsused

int main(int argc, char* argv[])

{

int c,ch;

int btype;

int xul,yul; /* координаты левогоугла рамки */

int xlr,ylr; /* координаты правого угла рамки */

int N,n; /* N -номер окна, n -количество символов в окне*/

char S_1[7],S_2[15],S_3[15],S_4[8]; /* лев Ctr+shift -> шрифт EN*/

/* прав Ctrl+Shift -> шрифт Ru */

p1: clrscr(); btype = 2;

gotoxy(3,22); textcolor(RED); cprintf("ESC");

gotoxy(7,22); textcolor(GREEN); CharToOem("Выход\n",S_1); cprintf(S_1);

gotoxy(1,23); textbackground(LIGHTCYAN); textcolor(RED);

CharToOem("Лабораторная \n",S_2); cprintf(S_2);

gotoxy(1,24); CharToOem("работа № 8 ->1 \n",S_3); cprintf(S_3);

textmode(LASTMODE); gotoxy(1,1);

N = 1; xul =1; yul = 1; ch = (dx - 2) * (dy -1) + 2;

do

{ xlr = xul + dx; n = 0;

ylr = yul + dy;

textcolor(CYAN);

my_box(xul,yul,xlr,ylr,btype);

window(xul + 1,yul + 1,xlr - 1,ylr - 1);

gotoxy(0,0);

do

{ c = getch();

if(c!= 0x1b)

{ textbackground(BLUE); textcolor(YELLOW);

putch(c);

n++;

}

else

goto p2;

} while(n <= ch);

window(1,1,80,25);

gotoxy(xlr - 17,ylr + 1); textbackground(LIGHTGRAY);

textcolor(MAGENTA); cprintf(" ASCII "); CharToOem("код \n",S_4);cprintf(S_4);

gotoxy(xlr - 17,ylr + 2); textbackground(GREEN);

textcolor(RED); cprintf(" "); putch(c);

cprintf("= 0x%x ",c);

textmode(LASTMODE);

N++; btype --;

xul = xlr + 1; /* координаты для window(1,1,80,25) */

yul = ylr + 1;

} while(N <= 3);

window(1,1,80,25);

goto p1;

p2:;

return 0;

} /*end main*/

//---------------------------------------------------------------------------

 

Порядок действий и команд при выполнении Задания №2 в лабораторной работе.

Шаг 1. Через кнопку New откройте окно New Items и выберите Console Wizard и для опции Source Type задайте режим С++. В результате С++ Builder откроет шаблон текста исходной программы в таком виде

 

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

return 0;

}

//---------------------------------------------------------------------------

 

Шаг 2. Добавьтев соответствующие места шаблона программы указания препро-цессора, объявления и операторы в соответствии со следующим текстом программы

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

/*===============================================*

* Вычерчивание рамки при помощи *

* ASCII кодов псевдографических символов *

*===============================================*/

#include <system.hpp>

#include <stdio.h>

#include <conio.h>

void draw_border(int startx,int starty,int endx,int endy)

{ register int i;

textcolor(LIGHTCYAN);

gotoxy(startx,starty); cprintf("%c",218); /* putchar(218);*/

gotoxy(startx,endy); cprintf("%c",192); /* putchar(192);*/

gotoxy(endx,starty); cprintf("%c",191); /* putchar(191);*/

gotoxy(endx,endy); cprintf("%c",217); /* putchar(217);*/

getch();

for(i = startx + 1; i < endx; i++)

{ textcolor(LIGHTRED);

gotoxy(i,starty); cprintf("%c",196); /*putchar(196);*/

gotoxy(i,endy); cprintf("%c",196); /*putchar(196);*/

getch();

}

for(i = starty + 1; i < endy; i++)

{ textcolor(LIGHTMAGENTA);

gotoxy(startx,i); cprintf("%c",179); /* putchar(179);*/

gotoxy(endx,i); cprintf("%c",179); /* putchar(179);*/

getch();

}

textmode(LASTMODE);

}

//---------------------------------------------------------------------------

 

#pragma argsused

int main(int argc, char* argv[])

{

int lux,luy; /* Левый верхний угол рамки */

int rdx,rdy; /* Правый нижний угол рамки */

char S_1[15],S_2[15],S_3[15],S_4[20],S_5[22],S_6[22],S_7[22];

char S_8[30],S_9[30],S_10[30],S_11[30];

/* лев Ctr+shift -> шрифт EN*/

/* прав Ctrl+Shift -> шрифт Ru */

m1: clrscr();

gotoxy(1,23); textbackground(LIGHTCYAN); textcolor(RED);

CharToOem("Лабораторная \n",S_1); cprintf(S_1);

gotoxy(1,24); CharToOem("работа № 8->2 \n",S_2); cprintf(S_2);

gotoxy(30,1); textbackground(GREEN); textcolor(RED);

CharToOem("ВВЕДИТЕ\n",S_3); cprintf(S_3);

gotoxy(1,3); textbackground(LIGHTGRAY); textcolor(LIGHTBLUE);

CharToOem("Кординаты левого\n",S_4); cprintf(S_4);

gotoxy(1,4);

CharToOem("верхнего угла рамки \n",S_5); cprintf(S_5);

gotoxy(28,4); textmode(LASTMODE); textcolor(LIGHTGREEN);

cprintf(" X="); scanf("%d", &lux);

gotoxy(37,4); cprintf(" Y="); scanf("%d", &luy);

gotoxy(40,23); textbackground(LIGHTGRAY); textcolor(LIGHTBLUE);

CharToOem("Кординаты правого\n",S_6); cprintf(S_6);

gotoxy(40,24);

CharToOem("нижнего угла рамки\n",S_7); cprintf(S_7);

gotoxy(62,24); textmode(LASTMODE); textcolor(LIGHTGREEN);

cprintf(" X="); scanf("%d", &rdx);

gotoxy(72,24); cprintf(" Y="); scanf("%d", &rdy);

if(rdx < lux)

{ textcolor(LIGHTBLUE);

gotoxy(40,10);

CharToOem("Вы ошиблись при вводе координаты X \n",S_8); cprintf(S_8);

gotoxy(40,11);

CharToOem("нижнего правого угла рамки\n",S_9); cprintf(S_9);

getch(); textmode(LASTMODE);

goto m1;

}

if(rdy < luy)

{ textcolor(LIGHTBLUE);

gotoxy(40,12);

CharToOem("Вы ошиблись при вводе координатыи Y \n",S_10); cprintf(S_10);

gotoxy(40,13);

CharToOem("нижнего правого угла рамки\n",S_11); cprintf(S_11);

cprintf(" ");

getch(); textmode(LASTMODE);

goto m1;

}

lux =(lux > 70)? 70: lux;

luy =(luy > 20)? 18: luy;

rdx =(rdx > 80)? 80: rdx;

rdy =(rdy > 20)? 20: rdy;

draw_border(lux,luy,rdx,rdy);

return 0;

} /* end main() */

//---------------------------------------------------------------------------

 

 

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

 

Компоненты, инструменты и функции С++ Builder

для графических построений

 

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

 

бщие сведения о компонентах, инструментах для рисования

 

Для отображения графической информации в библиотеке С++ Builder имеются компоненты, список которых приведен ниже в табл.2.1.

Компоненты для отображения графических изображений Таблица 2.1

Пиктограмма Наименование компоненты Страница библиотеки Назначение
Image (изображение) Additional Используется для отображения графики: пиктограмм, битовых матриц и метафайлов
DBImage (изображение данных) Data Controls Связанный с данными аналог Image
PaintBox (окно для рисования) System Используется для создания на форме некоторой области, в которой можно рисовать

 

Кроме этого, отображать и вводить графическую информацию можно на поверхности любого оконного компонента, имеющего свойство Canvas – канва(холст). Канва Canvas не является компонентой. Многие компоненты в С++ Builder имеют свойство Canvas, представляющее собой область компоненты, на которой можно рисовать или отображать готовые изображения. Это свойство имеют формы, графические компоненты Image, DBImage, PaintBox и многие другие. Канва содержит свойства и методы, существенно упрощающие работу с графикой в С++ Builder и все сложные взаимодействия с системой спрятаны для пользователя.

Каждая точка канвы имеет координаты X и Y. Система координат канвы начинается в левом верхнем углу области холста. Кордината X возрастает при изменении слева направо, а кордината Y изменяется сверху вниз. Кординаты изменяются в пикселях.

Пиксель – это наименьший элементв изображении рисунка, которым можно манипулировать. Важнейшее свойство пикселя – это цвет. Для описания цвета используется тип Tcolor.

Рисовать на канве можно разными способами. Первый вариант (Pixels) – рисование по отдельным пикселям. Второй вариант (Pen) – рисование пером Pen.

Свойство Pixels у канвы представляет собой двумерный массив, определяющий цвета точек на канве:

Cavas->Pixels[int X][int Y]

С массивом пикселей можно обращаться как с любым свойством: изменять цвет, задавать пикселю новое значение, или определять его цвет константой. Например, Cavas->Pixels[int X][int Y] = clBlue; - здесь задается пикселю синий цвет. При необходимости нарисовать некоторый график функции F(x) на канве компоненты Image, если заданы значения Ymin, Ymax и Xmin, Xmax., можно если описать кодом такой процедуры

 

//--------------------------------------------------------------

float x, y; //---координаты функции

float PX, PY; //---координаты пикселей

for(PX=0; PX <= Image1->Width; PX ++)

{ //--x – координата, соответствующая пикселю с координатой РХ

x = Xmin + PX*(Xmax - Xmin) / Image -> Width;

y = F(x);

//--PY –координата пикселя, соответствующая координате y

PY = Image1->Width – (y - Ymin)* Image->Height/(Ymax - Ymin);

//---устанавливается черный цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clBlack;

}

//--------------------------------------------------------------

 

У канвы имеется свойство Pen – перо. Это объект, в свою очередь имеющий ряд свойств. Свойство Color –цвет, которым наносится рисунок, свойство Widht – ширина рисуемой линии. Ширина линии задается в пикселях и по умолчанию равна 1. Свойство Style – определяет вид линии. Это свойство может принимать такие значения:

 

psSolid psDash psDot psDashDot psDashDotDot psClear psInsideFrame Сплошная линия Штриховая линия Пунктирная линия Штрих-пунктирная линия Линия,чередующая штрих и два пунктира Отсутствие линии Сплошная линия и при Widht > 1 допускаются цвета отличные от цветов Windows

 

Все стили со штрихами и пунктирами доступны только при Widht = 1. В противном случае лини этих стилей рисуются как сплошные. Стиль psInsideFrame – единственный, который допускает произвольные цвета. Цвет линии при остальных стилях округляется до ближайшего из палитры Windows. Свойство PenPos – определяет в координатах канвы текущую позицию пера. Изменение PenPos, т.е. перемещение пера без прорисовки линии выполняется с помощью метода канвы MovеTo(X,Y). Здесь (Х,У) – координаты точки, в которую перемещается перо.Эта текущая точка становится исходной, от которой методом LineTo(X,Y) можно провести линию в точку с координатами (Х,У). При этом текущая точка перемещается в конечную точку линии и новый вызов LineTo(X,Y) будет проводить линию из этой новой текущей точки.

Перо Pen может рисовать не только прямые линии, но базовые фигуры. Ниже перечислены некотрые из методов канвы, использующие перо для рисования фигур:

Arc Chord   Ellipse Pie Polygon Polyline Rectangle RoundRect Рисует дугу окружности или эллипса Рисует замкнутую фигуру, ограниченную дугой окружности или эллипса и хордой Рисует эллипс или окружность Рисует сектор окружности или эллипса Рисует замкнутую фигуру с кусочно-линейной границей Рисует кусочно-линейную кривую Рисует прямоугольник Рисует прямоугольник со скругленными углами

 

 

У канвы имеется свойство Brush – кисть. Это свойство определяет фон и заполнение замкнутых фигур на канве. Brush – это объект, имеющий в свою очередь ряд свойств. Свойство Color определяет цвет заполнения. Свойство Style – определяет шаблон заполнения (штриховку).

 

Постановка задачи лабораторной работы. Задание №1. Необходимо создать приложение, демонстрирующее построение графика функции Sin(X) двумя способами: первый вариант – рисование графика на канве с помощью Pixels; второй вариант – рисование графика с помощью инструмента Pen методами MovеTo(X,Y) и LineTo(X,Y).

Задание №2. Необходимо создать приложение, демонстрирующее построение фигур с помощью инструмента Pen в режиме рисования стандартных фигур.

 

Порядок действий и команд при выполнении Задания №1 данной лабораторной работы:

1. На диске D:\ создайте папку Lab_2 и в этой папке сформируйте внутреннюю папку Sin_2 для файлов проекта P_Sin_2.

2. Выберите в библиотеке компонент страницу Additional и на форму разместите компоненту Image1, затем маркерной рамкой определите размер под рисунок графика.

3. На странице Standart выберите кнопку и установите на форму элемент Button1 и замените название на «Расчитать».

4. Определите событие OnClik для кнопки Button1.

5. В шаблон обработчика события TForm1::Button1Click(TObject *Sender) добавте код, чтобы строился график функции Sin(X) с помощью изменения координат Pixels

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "U_Sin_2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

#include <math.h>

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

#define Pi 3.14159

float X,Y; // координаты функции

int PX,PY; // координаты пикселей

for (PX = 0; PX <= Image1->Width; PX++)

{

//X - координата, соответствующая пикселю с координатой PX

 

X = PX * 4 * Pi / Image1->Width;

Y = sin(X);

//PY - координата пикселя, соответствующая координате Y

PY = Image1->Height - (Y+1) * Image1->Height / 2;

//Устанавливается цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clRed;

}

}

 

//---------------------------------------------------------------------------

 

6. Для построения инструментом Pen второго графика функции Sin(X) добавте компоненту Image2.

7. Необходимо сформировать два одинаковых поля под графики. Удерживая нажатой клавишу Shift замаркируйте Image1, Image2 и выполните команду правой клавишей на форме. В открывшемся меню выберите команду Size и установите опцию Grow to largest или Shrink to smallest.

8. Измените в обработчике события TForm1::Button1Click(TObject *Sender)

код программы на такой

 

//---------------------------------------------------------------------------

#include <math.h>

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

#define Pi 3.14159

float X,Y; // координаты функции

int PX,PY; // координаты пикселей

Image2->Canvas->MoveTo(0,Image2->Height/2);

 

for (PX = 0; PX <= Image1->Width; PX++)

{

//X - координата, соответствующая пикселю с координатой PX

X = PX * 4 * Pi / Image1->Width;

Y = sin(X);

//PY - координата пикселя, соответствующая координате Y

PY = Image1->Height - (Y+1) * Image1->Height / 2;

//Устанавливается цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clRed;

//Проводится линия на втором графике черным цветом

Image2->Canvas->LineTo(PX,PY);

}

}

//---------------------------------------------------------------------------

9. Выполните компиляцию программы и получите результат в следующем виде

 

 

Порядок действий и команд при выполнении Задания №2 данной лабораторной работы:

1. На диске D:\, в созданной папке Lab_2, нужно сформировать внутреннюю папку Figures_2 для файлов проекта P_Figures_2.

2. На форме задайте поле Image1 и заполните в программный модуль U_Figures_2 следующий текст кода программы:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "U_figures_2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Image1->Canvas->Font->Style << fsBold;

Image1->Canvas->Arc(10,10,90,90,90,50,10,50);

Image1->Canvas->TextOut(40,60,"Arc");

Image1->Canvas->Chord(110,10,190,90,190,50,110,50);

Image1->Canvas->TextOut(135,60,"Chord");

Image1->Canvas->Ellipse(210,10,290,50);

Image1->Canvas->TextOut(230,60,"Ellipse");

Image1->Canvas->Pie(310,10,390,90,390,30,310,30);

Image1->Canvas->TextOut(340,60,"Pie");

TPoint points[5];

points[0] = Point(30,150);

points[1] = Point(40,130);

points[2] = Point(50,140);

points[3] = Point(60,130);

points[4] = Point(70,150);

Image1->Canvas->Polygon(points,4);

Image1->Canvas->TextOut(30,170,"Polygon");

points[0].x += 100;

points[1].x += 100;

points[2].x += 100;

points[3].x += 100;

points[4].x += 100;

Image1->Canvas->Polyline(points,4);

Image1->Canvas->TextOut(130,170,"Polyline");

Image1->Canvas->Rectangle(230,120,280,160);

Image1->Canvas->TextOut(230,170,"Rectangle");

Image1->Canvas->RoundRect(330,120,380,160,20,20);

Image1->Canvas->TextOut(325,170,"RoundRect");

}

//---------------------------------------------------------------------------

 

3. Выполните компиляцию и получите такой результат

 

абораторная работа № 3

 

Обработка событий мышки в программе С++

Основная цель лабораторной работы состоит в изучении методики задания и управления событиями мышки в программах приложениях Windows. Также изучается техника работы с рисунками на форме и правила применения встроенного редактора изображений - Image Editor для создания курсора нестандартного вида и его включения в файл ресурсов проекта приложения. Одновременно рассматриваются и команды для изменения изображения курсора мыши при его перемещении по рабочему окну программы.





Поделиться с друзьями:


Дата добавления: 2017-02-11; Мы поможем в написании ваших работ!; просмотров: 379 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

В моем словаре нет слова «невозможно». © Наполеон Бонапарт
==> читать все изречения...

2217 - | 2180 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.