Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
П_З.docx
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
179.91 Кб
Скачать

Отображение оттенков серого цвета

Определите обработчик события Scroll для компонента trackBar5 (листинг 4).

Листинг 4. Обработчик trackBar5. Scroll

private void trackBar5_Scroll(object sender, EventArgs e)

{trackBar2 . Value = trackBar3. Value = trackBar4 . Value = trackBar5.Value;}

Перемещение ползунка trackBar5 обеспечивает синхронное изменение всех трех базовых цветов, давая в итоге различные оттенки серого цвета (значение прозрачности при этом не изменяется).

Несмотря на то, что при перемещении ползунка trackBar5 положение ползунков trackBar2—trackBar4 синхронно изменяется, это изменение не влияет на цвет метки label6. Отмеченная ошибка объясняется тем обстоятельством, что при программном изменении свойства value событие Scroll не возникает.

Добавьте в метод trackBar5_Scroll оператор: trackBar1_Scroll(null, null);

Если программа должна не только реагировать на изменения положения ползунков, сделанные пользователем, но и сама изменять ползунки, то целесообразнее использовать обработчик события ValueChanged. Так, если бы в нашем проекте мы определили для компонентов trackBar1—trackBar4 обработчик события ValueChanged вместо обработчика события Scroll, то уже первый вариант метода trackBar5_Scroll (см. листинг 4) работал бы правильно.

Вывод цветовых имен

Измените метод trackBar1_Scroll (ЛИСТИНГ 5).

Листинг 5. Новый вариант метода trackBar1_Scroll

private void trackBar1_Scroll(object sender, EventArgs e)

{label6.BackColor = Color.FromArgb(trackBar1.Value,

trackBar2.Value, trackBar3.Value, trackBar4.Value);

Color с = label6.BackColor;

label6.ForeColor = Color.FromArgb(0xFF ^ c.R,

0xFF ^ c.G, 0xFF ^ с.В); string s = c.ToArgb().ToString("X8");

switch(c.A)

{case 0:

s += " Transparent"; break; case 255: string

s0 = ColorTranslator.FromWin32(ColorTranslator.ToWin32(c)).Name;

if (s0.Substring(0, 2) != "ff") s += " " + s0; break;}

label 6. Text = s;}

В том случае, когда с текущим цветом связано определенное имя (например, Black или Maroon), на панели отображается не только числовое значение текущего цвета в шестнадцатеричном формате, но и его имя. Если прозрачность имеет значение, равное 0, то рядом с числовым значением цвета выводится текст Transparent.

Все цвета, имеющие имена (именованные цвета), содержатся в перечислении KnownColor. Структура Color имеет метод ToKnownColor, возвращающий для любого именованного цвета соответствующий ему элемент перечисления KnownColor или 0, если цвет не является именованным. Однако область применения метода ToKnownColor существенно ограничивается тем обстоятельством, что если цвет создан с помощью метода FromArgb, то вызов для него метода ToKnownColor обязательно вернет 0 (даже если цвет с указанными составляющими входит в набор именованных цветов). Подобное поведение является одним из проявлений важной особенности структуры color: при анализе (в частности, сравнении) структур типа color учитываются не только их цветовые составляющие, но и способ, с помощью которого эти структуры были созданы. Например, если структура с1 типа Color была Создана с помощью метода FromArgb (0, 0, 0), а структура с2 — с помощью метода FromName("Black"), то они будут считаться различными, хотя обе представляют непрозрачный черный цвет (заметим также, что выражение c1.Name вернет строку ff000000, а выражение с2 . Name — строку Black).

Поскольку непосредственное применение метода ToKnownColor в нашем случае не позволит получить требуемый результат, можно было бы сформировать массив всех именованных цветов (воспользовавшись для этого перечислением KnownColor), а затем в цикле сравнивать цветовые характеристики каждого именованного цвета с цветовыми характеристиками интересующего нас цвета.

Однако в .NET имеется класс, позволяющий распознать именованный цвет более простым способом: это ColorTranslator. Если создать цвет с помощью метода FromWin32 класса ColorTranslator, то в случае именованного цвета его свойство Name вернет имя цвета, а в противном случае Name вернет числовое представление цвета в формате ARGB. Для возможности применения к объекту типа Color метода FromWin32 этот объект необходимо предварительно преобразовать к целочисленному формату RGB с помощью метода ToWin32. Правда, при использовании методов класса ColorTranslator не будет учитываться прозрачность, так как в цветовом формате для Win32 (RGB) подобная составляющая цвета не предусмотрена. Поэтому мы пользуемся методами класса ColorTranslator только для непрозрачных цветов, т. е. цветов, для которых Alpha = 255. Заметим, что такой подход является вполне допустимым, поскольку все именованные цвета, за исключением полностью прозрачного цвета с именем Transparent, являются непрозрачными. Кроме того, мы особым образом обрабатываем ситуацию полной прозрачности Alpha = 0.

Проверка s0.Substring (0, 2) != "ff" позволяет определить, что содержит строка s0: имя цвета или его числовое представление. В последнем случае строка s0 всегда начинается с двух символов ff, соответствующих значению Alpha = 255 (полная непрозрачность). Для получения подстроки строки s0 используется метод Substring (start, len) класса string, возвращающий подстроку длины len, начинающуюся с символа с индексом start. Имеется вариант данного метода с одним параметром start; этот вариант возвращает всю оставшуюся часть строки, начиная с символа с индексом start.