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