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

абораторная работа № 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 для создания курсора нестандартного вида и его включения в файл ресурсов проекта приложения. Одновременно рассматриваются и команды для изменения изображения курсора мыши при его перемещении по рабочему окну программы.