Нарисуйте гистограмму с подсказками в C#

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

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

// Нарисуем гистограмму.
private Matrix Transformation;
private void DrawHistogram(Graphics gr, Color back_color,
    float[] values, int width, int height)
{
    ...
    Transformation = new Matrix(data_bounds, points);
    gr.Transform = Transformation;
    ...
}

В следующем коде показан только действительно новый фрагмент кода, обработчик событий PictureBox MouseMove.

// Запишите положение мыши.
private string TipText;
private void picHisto_MouseMove(object sender, MouseEventArgs e)
{
    // Определите, какое значение данных находится под мышью.
    float bar_wid =
        picHisto.ClientSize.Width / (int)DataValues.Length;
    int bar_number = (int)(e.X / bar_wid);
    if (bar_number >= DataValues.Length) return;

    // Получить координаты верхней части панели.
    PointF[] points =
        { new PointF(0, DataValues[bar_number]) };
    Transformation.TransformPoints(points);

    // Посмотрим, находится ли мышь над панелью, а не над ней.
    string tip = "";
    if (e.Y >= points[0].Y) tip =
        "Item " + (bar_number + 1) + " has value " +
        DataValues[bar_number];

    // Обновляем всплывающую подсказку, если она изменилась.
    if (TipText != tip)
    {
        TipText = tip;
        tipBar.SetToolTip(picHisto, tip);
    }
}

Этот код делит ширину PictureBox на число баров, чтобы определить ширину полосы. Затем он делит координату X мыши на эту ширину, чтобы увидеть, какая полоса содержит положение мыши.

Вероятность того, что ошибки округления даст бару большее число, чем количество баров (в основном, если мышь находится прямо на краю PictureBox, поэтому код сравнивает bar_number к числу баров и возвращает, если это так.

В противном случае код создает массив, содержащий точку с координатой Y, равную значению бара. Затем он использует преобразование для преобразования точки. Полученная координата Y дает верхнюю часть панели, когда она нарисована на PictureBox.

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

Источник: http://csharphelper.com/blog/2015/09/draw-a-histogram-with-tooltips-in-c/

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