Вторник, 22.07.2025, 10:06 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Краски, палитры, заполнения(2)

Процедура SetAllPalette.

Изменяет одновременно несколько цветов палитры. Заголовок процедуры:

Procedure SetAllPalette(var Palette);

Параметр Palette в заголовке процедуры описан как нетипизированный параметр. Первый байт этого параметра должен содержать длину N палитры, остальные N байты - номера вновь устанавливаемых цветов в диапазоне от -1 до MaxColors. Код -1 означает, что соответствующий цвет исходной палитры не меняется.

В следующей программе происходит одновременная смена сразу всех цветов палитры.

Uses Graph, CRT; 

var

Palette: array [0..MaxColors] of Shortint;

d,r,e,k: Integer; 

begin

{Инициируем графику} 

d := Detect; InitGraph(d, r, ''); 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

{Выбираем толстые сплошные линии} 

SetLineStyle(SolidLn, 0, ThickWidth); 

{Выводим линии всеми доступными цветами} 

for k := 1 to GetMaxColor do 

begin

SetColor(k);

Line(GetMaxX div 3,k*10,2*GetMaxX div 3,k*10) 

end;

Palette[0] := MaxColors; {Размер палитры} 

repeat {Цикл смены палитры} 

for k := 1 to MaxColors do

Palette[k] := Random(succ(MaxCoLors)); 

SetAllPalette(Palette) 

until KeyPressed;

if ReadKey=#0 then k := ord(ReadKey); 

CloseGraph 

end 

end.

Функция GetPaletteSize.

Возвращает значение типа Integer, содержащее размер палитры (максимальное количество доступных цветов). Заголовок:

Function GetPaletteSize: Integer;

Процедура GetDefaultPalette.

Возвращает структуру палитры, устанавливаемую по умолчанию (в режиме автонастройки). Заголовок:

Procedure GetDefaultPalette(var Palette: PaletteType);

Здесь Palette - переменная типа PaletteType (см. процедуру GetPalette), в которой возвращаются размер и цвета палитры.

Процедура SetFillStyle.

Устанавливает стиль (тип и цвет) заполнения. Заголовок:

Procedure SetFillStyle(Fill,Color: Word);

Здесь Fill - тип заполнения; Color - цвет заполнения.

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

const

EmptyFill = 0;{Заполнение фоном (узор отсутствует)} 

SolidFill = 1;{Сплошное заполнение}

LineFill = 2;{Заполнение -------}

LtSlashFill = 3;{Заполнение ///////}

SlashFill = 4;{Заполнение утолщенными ///}

BkSlashFill = 5;{Заполнение утолщенными \\\}

LtBkSlashFill = 6;{Заполнение \\\\\\\}

HatchFill = 7;{Заполнение +++++++}

XHatchFill = 8;{Заполнение ххххххх}

InterleaveFill= 9;{Заполнение прямоугольную клеточку}

WideDotFill = 10;{Заполнение редкими точками}

CloseDotFill = 11;{Заполнение частыми точками}

UserFill = 12;{Узор определяется пользователем}

Программа из следующего примера продемонстрирует Вам все стандартные типы заполнения.

Uses Graph, CRT; 

var

d,r,e,k,j,x,y: Integer; 

begin

{Инициируем графику} 

d := Detect; InitGraph(d, r, ' ') ; 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

x := GetMaxX div 6;{Положение графика}

у := GetMaxY div 5;{на экране}

for j := 0 to 2 do{Два ряда}

for k := 0 to 3 do{По четыре квадрата}

begin

Rectangle((k+1)*x,(j+1)*y,(k+2)*x,(j+2)*y); 

SetFillStyle(k+j*4,j+1);

Bar((k+1)*x+1,(j+1)*y+1,(k+2)*x-1,(j+2)*y-1) 

end;

if ReadKey=#0 then k := ord(ReadKey); 

CloseGraph 

end 

end.

Если параметр Fill имеет значение 12 (UserFill), то рисунок узора определяется программистом путем обращения к процедуре SetFillPattern.

Процедура SetFillPattern.

Устанавливает образец рисунка и цвет штриховки. Заголовок:

Procedure SetFillPattern(Pattern: FillPatternType;Color: Word);

Здесь Pattern - выражение типа FillPatternType; устанавливает образец рисунка для Fill - UserFill в процедуре SetFillStyle; Color - цвет заполнения.

Образец рисунка задается в виде матрицы из 8x8 пикселей и может быть представлен массивом из 8 байт следующего типа:

type

FillPatternType = array [1..8] of Byte;

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

На рис. 14.8 показан пример двух образцов заполнения. На рисунке черточкой обозначается несветящийся пиксель, а прямоугольником - светящийся. Для каждых 8 пикселей приводится шестнадцатеричный код соответствующего байта.

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

Рис.14.8. Образцы заполнения и их коды

Uses Graph, CRT; 

const

pattl: FillPatternType= ($49,$92,$49,$92,$49,$92,$49,$92); 

patt2: FillPatternType= ($00,$18,$24,$42,$42,$24,$18,$00); 

var

d,r,e: Integer;

begin  {Инициируем графику} 

d := Detect; InitGraph(d, r, ''); 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

if d=CGA then

SetGraphMode (0) ; {Устанавливаем цвет для CGA} 

SetFillStyle(UserFill,White); 

{Левый верхний квадрат} 

SetFillPattern(Patt1,1); 

Bar(0,0,GetMaxX div 2, GetMaxY div 2); 

{Правый нижний квадрат} 

SetFillPattern(Patt2,2);

Bar(GetMaxX div 2,GetMaxY div 2,GetMaxX,GetMaxY); 

if ReadKey=#0 then d := ord(ReadKey); 

CloseGraph 

end 

end.

Если при обращении к процедуре указан недопустимый код цвета, вызов процедуры игнорируется и сохраняется ранее установленный образец заполнения. В частности, если в предыдущем примере убрать оператор

if d=CGA then

SetGraphMode(0);

устанавливающий цветной режим работы CGA -адаптера, на экран ПК, оснащенного адаптером этого типа, будут выведены два одинаковых прямоугольника, так как обращение

SetFillPattern(patt2, 2);

содержит недопустимо большой для данного режима код цвета и обращение игнорируется. Сказанное, однако, не относится к процедуре SetFillStyle для значения параметра Fill в диапазоне от 0 до 11: программа будет нормально работать и в режиме высокого разрешения CGA-адаптера, причем все цвета палитры, кроме цвета фона, при этом заменяются на белый.

Процедура GetFillPattern.

Возвращает образец заполнения, установленный ранее процедурой SetFillPattern. Заголовок:

Procedure GetFillPattern(var Pattern: FillPatternType);

Здесь Pattern - переменная типа FillPatternType, в которой возвращается образец заполнения.

Если программа не устанавливала образец с помощью процедуры SetFillPattern, массив Pattern заполняется байтами со значением 255 ($FF).

Процедура GetFillSettings.

Возвращает текущий стиль заполнения. Заголовок:

Procedure GetFillSettings(var Pattlnfo: FillSettingsType);

Здесь Pattlnfo - переменная типа FillSettingsType, в которой возвращается текущий стиль заполнения,

В модуле Graph определен тип:

type

FillSettingsType = record

Pattern: Word; {Образец}

Color : Word {Цвет} 

end;

Поля Pattern и Color в этой, записи имеют то же назначение, что и аналогичные параметры при обращении к процедуре SetFillStyle.

Процедура SetRGBPalette.

Устанавливает цветовую гамму при работе с дисплеем IBM 8514 и адаптером VGA. Заголовок:

Procedure SetRGBPalette(ColNum,RedVal, GreenVal,BlueVal:Integer);

Здесь ColNum - номер цвета; RedVal, GreenVal, BlueVal - выражения типа Integer, устанавливающие интенсивность соответственно красной, зеленой и синей составляющих цвета.

Эта процедура может работать только с дисплеем IBM 8514, а также с адаптером VGA, использующим видеопамять объемом 256 Кбайт. В первом случае параметр ColNum задается числом в диапазоне 0...255, во втором - в диапазоне 0...15. Для установки интенсивности используются 6 старших разрядов младшего байта любого из параметров RedVal, GreenVal, BlueVal.

В следующей программе в центре экрана выводится прямоугольник белым цветом, после чего этот цвет случайно изменяется с помощью процедуры SetRGBPalette. Для выхода из программы нужно нажать любую клавишу.

Uses Graph,CRT; 

var

Driver, Mode, Err, xl, yl: Integer; 

begin

{Инициируем графический режим}

Driver := Detect;

InitGraph(Driver, Mode, '');

Err := GraphResult;

if ErroO then

WriteLn(GraphErrorMsg(Err)) 

else if Driver in [IBM8514, VGA] then 

begin

{Выводим прямоугольник в центре экрана}

x1 := GetMaxX div 4;

y1 := GetMaxY div 4;

SetColor(lS);

Bar(x1,y1,3*x1,3*y1);

{Изменяем белый цвет на случайный}

while not KeyPressed do

SetRGBPalette(15,Random(256),Random(256),Random(256)); 

CloseGraph 

end 

else 

begin

CloseGraph; .

WriteLn('Адаптер не поддерживает ' , 'RGB-режим управления цветами') 

end 

end.

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0