Получение местоположения курсора на графике во время события колесика мыши

Я пытаюсь получить местоположение мыши во время события MouseWheel. В событии MouseMove я успешно использовал HitTest и таким образом занимался своими делами, но по какой-то причине во время события MouseWheel мой HitTest всегда возвращает значение -1 для точки данных HitTest. Может ли кто-нибудь помочь мне понять это? Я включу свой код ниже.
То, что я пытаюсь выполнить, — это базовое событие масштабирования с помощью колесика мыши. Я хочу увидеть местоположение курсора, а затем добавить 1/4 просматриваемой в данный момент диаграммы с обеих сторон.

    private void chData_MouseWheel(object sender, MouseEventArgs e)
    {
        try
        {
            HitTestResult pos = chData.HitTest(e.X, e.Y);

            if (e.Delta < 0)
            {
                chData.ChartAreas[0].AxisX.ScaleView.ZoomReset();
                chData.ChartAreas[0].AxisY.ScaleView.ZoomReset();
            }
            if (e.Delta > 0)
            {
                double xMin = chData.ChartAreas[0].AxisX.ScaleView.ViewMinimum;
                double xMax = chData.ChartAreas[0].AxisX.ScaleView.ViewMaximum;
                double yMin = chData.ChartAreas[0].AxisY.ScaleView.ViewMinimum;
                double yMax = chData.ChartAreas[0].AxisY.ScaleView.ViewMaximum;

                double posXStart = pos.PointIndex - (xMax - xMin) / 4;
                double posXFinish = pos.PointIndex + (xMax - xMin) / 4;
                double posYStart = pos.PointIndex - (yMax - yMin) / 4;
                double posYFinish = pos.PointIndex + (yMax - yMin) / 4;

                chData.ChartAreas[0].AxisX.ScaleView.Zoom(posXStart, posXFinish);
                chData.ChartAreas[0].AxisY.ScaleView.Zoom(posYStart, posYFinish);
            }
        }
        catch { }

    }

Кстати, моя диаграмма называется chData. Я надеюсь, что это просто где-то простая опечатка.
Заранее спасибо!


person tmwoods    schedule 09.12.2012    source источник
comment
Итак, я понял, что PointIndex работает только тогда, когда вы действительно находитесь над точкой данных. Что мне нужно, так это знать, какое значение оси X я нахожусь, даже если я не выше точки данных. У кого-нибудь есть идеи?   -  person tmwoods    schedule 11.12.2012


Ответы (1)


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

private void chData_MouseWheel(object sender, MouseEventArgs e)
    {
        try
        {
            if (e.Delta < 0)
            {
                chData.ChartAreas[0].AxisX.ScaleView.ZoomReset();
                chData.ChartAreas[0].AxisY.ScaleView.ZoomReset();
            }

            if (e.Delta > 0)
            {
                double xMin = chData.ChartAreas[0].AxisX.ScaleView.ViewMinimum;
                double xMax = chData.ChartAreas[0].AxisX.ScaleView.ViewMaximum;
                double yMin = chData.ChartAreas[0].AxisY.ScaleView.ViewMinimum;
                double yMax = chData.ChartAreas[0].AxisY.ScaleView.ViewMaximum;

                double posXStart = chData.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 4;
                double posXFinish = chData.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 4;
                double posYStart = chData.ChartAreas[0].AxisY.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 4;
                double posYFinish = chData.ChartAreas[0].AxisY.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 4;

                chData.ChartAreas[0].AxisX.ScaleView.Zoom(posXStart, posXFinish);
                chData.ChartAreas[0].AxisY.ScaleView.Zoom(posYStart, posYFinish);
            }
        }
        catch { }            
    }

Итак, что в основном делает этот код, так это увеличивает график, на котором находится курсор. Это по существу ограничит максимальные/минимальные значения осей половиной того, на что вы сейчас смотрите, но центрируете вокруг курсора.
Я знаю, что, вероятно, есть способы оптимизировать это, но на данный момент я думаю, что это работает достаточно хорошо, чтобы люди начали.
Надеюсь, это поможет!

person tmwoods    schedule 12.12.2012