Практика. Выбор цвета (2). Урок 12 практических работ у групп 18спи тема. Выбор цвета
Скачать 0.85 Mb.
|
Урок №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_(цветовая_модель) |