Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

Int px, py; //координаты пикселей

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

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

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

X=PX*4*PI/Image1->Width; // X- координата соответствующая PX

Y=sin(X);

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

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

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

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

}

Стиль линии, как отмечалось можно менять с помощью свойства Style. Оно может принимать следующие значения

psSolid

Сплошная линия

psDash

Штриховая линия

psDot

Пунктирная линия

psDashDot

Штрих-пунктирная линия

psDashDotDot

Линия чередующая штрих и два пунктира

psClear

Отсутствие линии

psInsideFrame

Сплошная линия, но при Width>1 допускающая цвета отдичные от палитры Windows

Все стили со штрихами доступны только при Width=1, иначе они рисуются как сплошные линии.

Любой цвет TColor представляет собой число - перечислимый тип. С числом возможны бинарные операции - and, or, not, xor, not xor и т.д. Так и здесь - смешивание основано на бинарных операциях, когда сравниваются попарно биты двух цветов.

Mode

  • pmCopy - без смешивания - цвет пера перекрывает фон.

  • pmNotCopy - инверсный (операция not) цвет пера перекрывает фон.

  • pmNot - цвет фона заменяется на инверсный.

  • pmXor - xor наложение. Из пары битов возвращается 1, если только один из битов равен 1.

  • pmNotXor - сначала проводится pmXor, а затем результирующий цвет подвергается not-операции.

  • pmMask - логическое and между цветом пера и фоном - возвращается 1, если оба бита равны 1. Приводит к затемнению.

  • pmNotMask - сначала pmMask, а затем pmNot.

  • pmMerge - логическое or между цветом пера и фоном - возвращает 1, если оба бита не равны 0. Приводит к осветлению.

  • pmNotMerge - инверсный pmMerge.

  • pmNop - без изменений.

  • pmBlack - всегда черный.

  • pmWhite - всегда белый.

Хочу особо отметить pmNotXor - очень полезный режим. Объясню почему. Допустим, нужно водить курсор особой формы. Но после него след остается! В режиме pmNotXor при повторной прорисовке восстанавливается цвет фона. Правда, в таком режиме цвет курсора будет меняться в зависимости от фона.

Style

Я уже говорил - стиль линии. Чем тут пунктирный-штрихпунктирный говорить, лучше картинку с разными вариантами приведу:

Напомню, что при ширине больше 1 стили, кроме psInsideFrame, здесь не приведенного, не используются. У меня просто для удобства широкие. Фоновый белый цвет в данном случае - цвет кисти Brush.

Про psInsideFrame. Бывает так, что программа использует звет из палитры High Color, а у бедного юзера только 256 цветов :(. В этом случае при ширине больше 1 в этом стиле цвет сглаживается до наиболее подходящего. Легче, правда, юзеру порекомендовать видеокарту сменить :).

С помощью пера можно рисовать не только прямые, но и линии иной формы и некоторые фигуры. Для этого используются следующие методы канвы:

Arc

Дуга эллипса, в частном случае окружности

Chord

Замкнутая фигуру типа сегмента, ограниченного дугой эллипса

Ellipse

Эллипс, как частный случай окружность

Pie

Сектор эллипса или окружности

Polygon

Многоугольник, не обязательно выпуклый

Polyline

Рисует ломанную

Rectangle

Прямоугольник

RoundRect

Прямоугольник со скругленными углами.

Кроме линий на канву можно вывести текст. Для этого используется свойство канвы Font и метод TextOut, синтаксис которого

void_Fastcall TextOut(int X, int Y, const System::AnsiString Text);

Записанный прототип пугает, но на самом деле это выглядит так:

Image1->Canvas->TextOut(300,100,”Это текст”);

Следующий код написанный в функции формы позволяет проиллюстрировать методы канвы.

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

Image1->Canvas->TextOut(150,220,"Методы канвы");

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");

В результате на экране появятся фигуры