Использование полос прокрутки для выбора цветов RGB и HLS в C#

Пример Преобразование между цветами RGB и HLS модели в C# объясняют, как преобразовать цветные модели RGB и HLS. В этом примере используется аналогичный код, позволяющий пользователю манипулировать полосами прокрутки для выбора цветов с использованием любой модели.

Перетащите полосы прокрутки вперед и назад, чтобы настроить выбранный цвет и посмотреть, как результат влияет на значения другой цветовой модели. Например, интересно посмотреть, как изменяются компоненты R, G и B при перетаскивании компонента H взад и вперед.

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

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

// Выбранный цвет.
private Color SelectedColor;

// Истина, когда мы устанавливаем цвет.
private bool IgnoreEvents = false;

// Выберите цвет из значений RGB.
private void SelectRGBColor()
{
    if (IgnoreEvents) return;
    IgnoreEvents = true;

    // Сохранить выбранный цвет и отобразить образец.
    int R = (int)nudR.Value;
    int G = (int)nudG.Value;
    int B = (int)nudB.Value;
    SelectedColor = Color.FromArgb(R, G, B);
    picSample.BackColor = SelectedColor;

    // Преобразование в HLS.
    double H, L, S;
    ColorStuff.RgbToHls(R, G, B, out H, out L, out S);

    // Отображение значений HLS.
    txtH.Text = H.ToString("0.00");
    txtL.Text = L.ToString("0.00");
    txtS.Text = S.ToString("0.00");

    IgnoreEvents = false;
}

// Выберите цвет из значений HLS.
private void SelectHLSColor()
{
    if (IgnoreEvents) return;
    IgnoreEvents = true;

    try
    {
        // Преобразование в RGB.
        double H = double.Parse(txtH.Text);
        double L = double.Parse(txtL.Text);
        double S = double.Parse(txtS.Text);
        int R, G, B;
        ColorStuff.HlsToRgb(H, L, S, out R, out G, out B);

        // Отображение значений RGB.
        nudR.Value = (decimal)R;
        nudG.Value = (decimal)G;
        nudB.Value = (decimal)B;

        // Сохранить выбранный цвет и отобразить образец.
        SelectedColor = Color.FromArgb(
            (int)nudR.Value,
            (int)nudG.Value,
            (int)nudB.Value);
        picSample.BackColor = SelectedColor;
    }
    catch
    {
    }
    IgnoreEvents = false;
}

Когда пользователь изменяет значение R, G или B, код вызывает SelectRGBColor, чтобы определить цвет, используя эти значения. Когда пользователь изменяет значение H, L или S, код вызывает SelectHLSColor, чтобы определить цвет, используя эти значения.

Программа использует переменную IgnoreEvents, чтобы средства управления не могли создавать рекурсивные вызовы. Например, предположим, что вы изменили значение R, чтобы код вызывал SelectRGBColor. Этот метод устанавливает значения элементов управления H, L и S TextBox. Затем выполняются обработчики событий TextChanged и вызывают метод SelectHLSColor. Этот метод устанавливает значения R, G и B, которые запускают их события, вызывающие SelectRGBColor, и все это начинается снова. Результатом является бесконечная серия событий, которая использует стек вызовов программы, приводящий к сбою программы.

Попробуйте удалить переменную IgnoreEvents и посмотреть, что произойдет, если вы несколько раз измените значение R.

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

Теперь вернемся к новому примеру. В этом примере выполняется следующий код при изменении значения R, G или B. Код, который обрабатывает значения H, L и S, аналогичен.

// Выберите новый цвет RGB.
private void scrRGB_Scroll(object sender, ScrollEventArgs e)
{
    // Сохранить выбранный цвет и отобразить образец.
    int R = scrR.Value;
    int G = scrG.Value;
    int B = scrB.Value;
    picSample.BackColor = Color.FromArgb(R, G, B);

    // Преобразование в HLS.
    double H, L, S;
    ColorStuff.RgbToHls(R, G, B, out H, out L, out S);

    // Отображение значений HLS.
    scrH.Value = (int)H;
    scrL.Value = (int)(L * 1000);
    scrS.Value = (int)(S * 1000);

    ShowNumericValues(R, G, B, H, L, S);
}

Обратите внимание, что этот код не использует переменную IgnoreEvents. Использование этой переменной не повредит, но в этом случае это не обязательно из-за особенностей элементов управления HScrollBar и VScrollBar. Эти элементы управления имеют два события, которые могут возникать при изменении их значений: Прокрутка и ValueChanged. Событие Scroll происходит, когда пользователь меняет значение ScrollBar. Событие ValueChanged происходит всякий раз, когда значение ScrollBar изменяется, было ли оно изменено пользователем или кодом.

Источник: http://csharphelper.com/blog/2016/08/use-scrollbars-to-select-rgb-and-hls-colors-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector