Главная страница

Практика. Выбор цвета (2). Урок 12 практических работ у групп 18спи тема. Выбор цвета


Скачать 0.85 Mb.
НазваниеУрок 12 практических работ у групп 18спи тема. Выбор цвета
Дата18.12.2021
Размер0.85 Mb.
Формат файлаdocx
Имя файлаПрактика. Выбор цвета (2).docx
ТипУрок
#307815

Урок №12 практических работ у групп 18СПИ

Тема. Выбор цвета.

Перед нами стоит задача выбора по желанию пользователя 2 цветов (или вручную, или с помощью специального диалогового окна), создание подпрограмм перевода из цветовой модели RGB в HSV и обратно, расчет 8 промежуточных оттенков между выбранными ранее цветами, рассчитанными в моделях RGB и HSV.

В пустой информационной базе создадим обработку «ВыборЦвета». Создадим реквизиты Цвет1 и Цвет2 с типом «Произвольный».



На форме создадим реквизиты «Цвет1Строка» и «Цвет2Строка» с типом «Строка» и разместим их на форме в виде полей для ввода. Также создадим 2 команды «ВыборЦвет1» и «ВыборЦвет2» и разместим в соответствующие группы вместе с полями ввода цвета №1 и №2. Для отображения кнопок выберем «Картинка» (картинки можно выбрать из библиотеки «Стандартные»).



Процедуры для команд будут следующие:

&НаКлиенте

Процедура ВыборЦвет1(Команда)

Диалог = Новый ДиалогВыбораЦвета;

Пока Истина Цикл

Если Диалог.Выбрать() Тогда

Если Диалог.Цвет.Вид=ВидЦвета.Абсолютный Тогда

Прервать;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Объект.Цвет1 = Диалог.Цвет;

Цвет1Строка=""+Объект.Цвет1.Красный+";"+Объект.Цвет1.Зеленый+";"+Объект.Цвет1.Синий;

КонецПроцедуры
&НаКлиенте

Процедура ВыборЦвет2(Команда)

Диалог = Новый ДиалогВыбораЦвета;

Пока Истина Цикл

Если Диалог.Выбрать() Тогда

Если Диалог.Цвет.Вид=ВидЦвета.Абсолютный Тогда

Прервать;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Объект.Цвет2 = Диалог.Цвет;
Цвет2Строка=""+Объект.Цвет2.Красный+";"+Объект.Цвет2.Зеленый+";"+Объект.Цвет2.Синий;

КонецПроцедуры

Бесконечный цикл нужен для того, чтобы при выборе цвета в диалоговом окне не появлялся вариант с типом «Web цвет» (когда выбран оттенок, а не комбинация чисел для составляющих цвета: красный, синий, зеленый).

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



Для отображения самих цветов на форме добавим соответствующие каждому цвету декорации и выберем цвет фона на основе диалоговых окон выбора цвета.



Дополним процедуры «КомандаВыборЦвет1» и «КомандаВыборЦвет1» соответствующим изменением цвета фона декораций.

Элементы.ДекорацияЦвет1.ЦветФона=Объект.Цвет1;

и

Элементы.ДекорацияЦвет2.ЦветФона=Объект.Цвет2;

Чтобы можно было выбирать цвет без использования диалогового окна «Выбор цвета», сделаем функцию «СтрокаВЦвет» для конвертации строки «R;G;B» в цвет, которая будет запускаться при изменении содержимого в полях ввода Цвет1RGB и Цвет2RGB.

&НаКлиенте

Функция СтрокаВЦвет(ЗНАЧ СтрокаЦвета)

ПозРазд=СтрНайти(СтрокаЦвета,";");

ЦвКрасный=Число(Лев(СтрокаЦвета,ПозРазд-1));

СтрокаЦвета=Сред(СтрокаЦвета,ПозРазд+1);

ПозРазд=СтрНайти(СтрокаЦвета,";");

ЦвЗеленый=Число(Лев(СтрокаЦвета,ПозРазд-1));

ЦвСиний=Число(Сред(СтрокаЦвета,ПозРазд+1));

Цвет=Новый Цвет(ЦвКрасный,ЦвЗеленый,ЦвСиний);

Возврат Цвет;
КонецФункции // СтрокаВЦвет()

&НаКлиенте

Процедура Цвет1RGBПриИзменении(Элемент)

Объект.Цвет1=СтрокаВЦвет(Цвет1Строка);

Элементы.ДекорацияЦвет1.ЦветФона=Объект.Цвет1;
КонецПроцедуры
&НаКлиенте

Процедура Цвет2RGBПриИзменении(Элемент)

Объект.Цвет2=СтрокаВЦвет(Цвет2Строка);

Элементы.ДекорацияЦвет2.ЦветФона=Объект.Цвет2;

КонецПроцедуры

Но нам для дальнейшего отображения промежуточных оттенков нужен перевод в цветовую модель HSV1.

Создадим еще 2 реквизита формы Цвет1HSVСтрока и Цвет2HSVСтрока и разместим их на форме в соответствующих каждому цвету группах (вид – Поле надписи).



Создадим функцию перевода цветовой модели RGB в HSV.

&НаКлиенте

Функция ПреобразованиеВHSV(ЗНАЧ СтрокаЦветаRGB)

ПозРазд=СтрНайти(СтрокаЦветаRGB,";");

ЦвR=Число(Лев(СтрокаЦветаRGB,ПозРазд-1))/255;

СтрокаЦветаRGB=Сред(СтрокаЦветаRGB,ПозРазд+1);

ПозРазд=СтрНайти(СтрокаЦветаRGB,";");

ЦвG=Число(Лев(СтрокаЦветаRGB,ПозРазд-1))/255;

ЦвB=Число(Сред(СтрокаЦветаRGB,ПозРазд+1))/255;
Максимум=Макс(ЦвR,ЦвG,ЦвB);

Минимум=Мин(ЦвR,ЦвG,ЦвB);
Если Максимум=Минимум Тогда

H="-";

ИначеЕсли Максимум=ЦвR И (ЦвG=ЦвB Или ЦвG>ЦвB) Тогда

H=Цел(60*(ЦвG-ЦвB)/(Максимум-Минимум))+0;

ИначеЕсли Максимум=ЦвR И ЦвG<ЦвB Тогда

H=Цел(60*(ЦвG-ЦвB)/(Максимум-Минимум))+360;

ИначеЕсли Максимум=ЦвG Тогда

H=Цел(60*(ЦвB-ЦвR)/(Максимум-Минимум))+120;

ИначеЕсли Максимум=ЦвB Тогда

H=Цел(60*(ЦвR-ЦвG)/(Максимум-Минимум))+240;

КонецЕсли;

Если Максимум=0 Тогда

S=0;

Иначе

S=(1-Минимум/Максимум);

КонецЕсли;

V=Максимум;

Возврат ""+H+";"+Цел(S*100)+";"+Цел(V*100);
КонецФункции // ПреобразованиеВHSV()

И дополним ранее созданные процедуры «КомандаВыборЦвет1», «КомандаВыборЦвет2», «Цвет1СтрокаПриИзменении», «Цвет2СтрокаПриИзменении» соответствующими операторами:

Цвет1HSVСтрока=ПреобразованиеВHSV(Цвет1Строка);

и

Цвет2HSVСтрока=ПреобразованиеВHSV(Цвет2Строка);

Запустим программу.



Для того, чтобы при открытии формы пользователь увидел уже заполненные поля и раскрашенные декорации создадим процедуру ПриОткрытии.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Цвет1Строка="255;0;0";

Цвет2Строка="255;0;255";

Элементы.ДекорацияЦвет1.ЦветФона=Новый Цвет(255,0,0);

Элементы.ДекорацияЦвет2.ЦветФона=Новый Цвет(255,0,255);

Цвет1HSVСтрока=ПреобразованиеВHSV(Цвет1Строка);

Цвет2HSVСтрока=ПреобразованиеВHSV(Цвет2Строка);

КонецПроцедуры

Далее будем находить промежуточные оттенки между двумя заданными цветами. Создадим на форме 10 декораций для отображения оттенков (ДекорацияRGB1- ДекорацияRGB10, ширина 20) и команду «ПоказатьОттенкиRGB».



Заполним процедуру команды «ПоказатьОттенкиRGB» алгоритмом нахождения промежуточных оттенков в цветовой модели RGB и раскрашивания декораций. При этом мы сформируем подсказку для каждой декорации, в которой будет показан ее цвет в виде «R;G;B».

&НаКлиенте

Процедура ПоказатьОттенкиRGB(Команда)

НачалR=Элементы.ДекорацияЦвет1.ЦветФона.Красный;

НачалG=Элементы.ДекорацияЦвет1.ЦветФона.Зеленый;

НачалB=Элементы.ДекорацияЦвет1.ЦветФона.Синий;

ШагR=(Элементы.ДекорацияЦвет2.ЦветФона.Красный-НачалR)/9;

ШагG=(Элементы.ДекорацияЦвет2.ЦветФона.Зеленый-НачалG)/9;

ШагB=(Элементы.ДекорацияЦвет2.ЦветФона.Синий-НачалB)/9;

Элементы.ДекорацияRGB1.ЦветФона=Элементы.ДекорацияЦвет1.ЦветФона;

Элементы.ДекорацияRGB1.Подсказка=Цвет1Строка;

Элементы.ДекорацияRGB10.ЦветФона=Элементы.ДекорацияЦвет2.ЦветФона;

Элементы.ДекорацияRGB10.Подсказка=Цвет2Строка;

Для Шаг=2 По 9 Цикл

Элементы["ДекорацияRGB"+Шаг].ЦветФона=Новый Цвет(Цел(НачалR+(Шаг-1)*ШагR),

Цел(НачалG+(Шаг-1)*ШагG),Цел(НачалB+(Шаг-1)*ШагB));

Элементы["ДекорацияRGB"+Шаг].Подсказка=""+Цел(НачалR+(Шаг-1)*ШагR)+";"+

Цел(НачалG+(Шаг-1)*ШагG)+";"+Цел(НачалB+(Шаг-1)*ШагB);

КонецЦикла;

КонецПроцедуры

Запустим программу.



Теперь аналогично создадим оттенки для цветовой модели HSV. Создадим 10 декораций и кнопку «ПоказатьОттенкиHSV».



Заполним код в процедуре «ПоказатьОттенкиHSV» и во вспомогательной функции «ИзHSVВЦвет» (перевод из HSV в RGB).

&НаКлиенте

Процедура ПоказатьОттенкиHSV(Команда)

СтрокаЦвета=Цвет1HSVСтрока;

ПозРазд=СтрНайти(СтрокаЦвета,";");

Цв1H=Число(Лев(СтрокаЦвета,ПозРазд-1));

СтрокаЦвета=Сред(СтрокаЦвета,ПозРазд+1);

ПозРазд=СтрНайти(СтрокаЦвета,";");

Цв1S=Число(Лев(СтрокаЦвета,ПозРазд-1));

Цв1V=Число(Сред(СтрокаЦвета,ПозРазд+1));
СтрокаЦвета=Цвет2HSVСтрока;

ПозРазд=СтрНайти(СтрокаЦвета,";");

Цв2H=Число(Лев(СтрокаЦвета,ПозРазд-1));

СтрокаЦвета=Сред(СтрокаЦвета,ПозРазд+1);

ПозРазд=СтрНайти(СтрокаЦвета,";");

Цв2S=Число(Лев(СтрокаЦвета,ПозРазд-1));

Цв2V=Число(Сред(СтрокаЦвета,ПозРазд+1));
ШагH=(Цв2H-Цв1H)/9;

ШагS=(Цв2S-Цв1S)/9;

ШагV=(Цв2V-Цв1V)/9;

Элементы.ДекорацияHSV1.ЦветФона=Элементы.ДекорацияЦвет1.ЦветФона;

Элементы.ДекорацияHSV1.Подсказка=Цвет1HSVСтрока+" - "+Цвет1Строка;

Элементы.ДекорацияHSV10.ЦветФона=Элементы.ДекорацияЦвет2.ЦветФона;

Элементы.ДекорацияHSV10.Подсказка=Цвет2HSVСтрока+" - "+Цвет2Строка;

Для Шаг=2 По 9 Цикл

ЦветЭлемента=ИзHSVВЦвет(Цел(Цв1H+(Шаг-1)*ШагH),Цел(Цв1S+(Шаг-1)*ШагS),Цел(Цв1V+(Шаг-1)*ШагV));

Элементы["ДекорацияHSV"+Шаг].ЦветФона=ЦветЭлемента;

Элементы["ДекорацияHSV"+Шаг].Подсказка=""+Цел(Цв1H+(Шаг-1)*ШагH)+";"+

Цел(Цв1S+(Шаг-1)*ШагS)+";"+Цел(Цв1V+(Шаг-1)*ШагV)+" - "+

ЦветЭлемента.Красный+";"+ЦветЭлемента.Зеленый+";"+ЦветЭлемента.Синий;

КонецЦикла;

КонецПроцедуры
&НаКлиенте

Функция ИзHSVВЦвет(ЗНАЧ H,ЗНАЧ S,ЗНАЧ V)
Hi=Цел(H/60)%6;

Vmin=Цел((100-S)*V/100);

a=Цел((V-Vmin)*(H%60)/60);

Vinc=Vmin+a;

Vdec=V-a;

Если Hi=0 Тогда

R=V;

G=Vinc;

B=Vmin;

ИначеЕсли Hi=1 Тогда

R=Vdec;

G=V;

B=Vmin;

ИначеЕсли Hi=2 Тогда

R=Vmin;

G=V;

B=Vinc;

ИначеЕсли Hi=3 Тогда

R=Vmin;

G=Vdec;

B=V;

ИначеЕсли Hi=4 Тогда

R=Vinc;

G=Vmin;

B=V;

ИначеЕсли Hi=5 Тогда

R=V;

G=Vmin;

B=Vdec;

КонецЕсли;

ЦветRGB=Новый Цвет(Цел(R*2.55),Цел(G*2.55),Цел(B*2.55));

Возврат ЦветRGB;
КонецФункции

В подсказках к декорациям ДекорацияHSV указывается цвет в модели HSV и в RGB.

Для лучшего просмотра последовательности оттенков уберем вертикальный интервал в свойствах формы



Запустим программу.



(Заодно получили радугу из 10 цветов)

1 https://ru.wikipedia.org/wiki/HSV_(цветовая_модель)


написать администратору сайта