2013-09-04 3 views
1

차트가 하나 있지만 ChartAreas가 3 개인 차트 폼이 있습니다. 또한 각 ChartArea는 적어도 하나가 표시 될 것이라는 의도로 표시되거나 표시되지 않을 수 있습니다. 또한 사용자는 양식의 크기를 조정하여 전체 차트의 크기를 조정할 수 있지만 다행히도 재배치 할 수는 없습니다. 그러나 최대 XY 범위는 크기 조정으로 인해 다를 수 있습니다.ChartArea 내에서 마우스가 있는지 확인하십시오.

내 욕망은 마우스 동작에 따라 각 ChartArea에서 확대/축소 작업을 수행 할 수있게하려는 것입니다. 예를 들어; 주어진 ChartArea 위로 마우스를 올려 놓고 마우스 휠을 사용하여 확대/축소를하고 싶습니다.

ChartArea의 지리를 결정하는 방법을 모르겠습니다. 예를 들어, 나는 하나의 Chart, 3 ChartAreas를 가지고 있는데, 그 사이에 약간의 버퍼링으로 균등하게 간격을 둘 것인가? 차트 사이의 버퍼 간격을 어떻게 결정합니까, 심지어 속성입니까? 실제 차트 공간을 사용하고 있는지 여부와 같은 질문. 이것들은 FastLine 차트이므로, 나는 X 축과 Y 축을 가지고 있고 그것들은 레이블이 붙어 있습니다. 또한 데이터 값에 따라 X 축 레이블이 더 커질 수 있으므로 축을 오른쪽으로 이동시킬 수 있습니다.

Axis (XY) .PixelPositionToValue를 사용하고 그 값이 < 인 경우 ChartArea에없는가요?

+0

'Control'형식 인 경우 '높이', '너비'및 '위치'를 볼 수 있습니다. 그리고 'MoveOver' 이벤트 또는 someting이 있어야합니다. – gunr2171

+3

http://msdn.microsoft.com/en-us/library/dd468025.aspx –

답변

1

당신은 (gunr2171에 의해 제안)과는 Position 특성 (MSDN link)에 의존하여 ChartArea 주어진 MouseMove 이벤트에 의존하여 Chart에서 마우스의 위치를 ​​찾을 수 있습니다.

  • :;합니다 (ChartArea에 의해 주어진 프레임에 대하여 아래에서 위로 오른쪽 Y 왼쪽에서 X)을 위치의 종류를 제공하기 위해 해결해야 후 각종 문제가 있습니다 "반비례"(상단 (0) 에서 하단 (높이)까지)로 제공되는 Y 값을 수정하십시오.
  • 지정된 차트 (Chart 참조)가 지정된 ChartArea 내부에 있는지 확인합니다.
  • 차트 참조 시스템에서 ChartArea 참조 시스템으로 좌표를 변환하십시오.

첫 번째 것은 최대/최소를 계산합니다. 주어진 ChartArea를 정의 값 : 주어진 차트 MouseMove 이벤트에서

int minX1, minY1, maxX1, maxY1; 
minX1 = (int)chart1.ChartAreas[0].Position.X; 
maxX1 = (int)(chart1.ChartAreas[0].Position.X + chart1.ChartAreas[0].Position.Width * chart1.Width /100); 
minY1 = (int)chart1.ChartAreas[0].Position.Y; 
maxY1 = (int)(chart1.ChartAreas[0].Position.Y + chart1.ChartAreas[0].Position.Height * chart1.Height/100); 

:

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point posChart = new Point(e.X, e.Y); //Position of the mouse respect to the chart 
    if (posChart.X >= minX1 && posChart.X <= maxX1 && posChart.Y >= minY1 && posChart.Y <= maxY1) 
    { 
     //The mouse is inside the given area 
     //Conversion of the mouse position to the ChartArea reference system, with the corresponding "inversion" of the Y values 
     Point posChartArea = new Point(posChart.X - minX1, Math.Abs((posChart.Y - minY1) - maxY1)); 
    } 
} 

참고 : 한스 김에 마우스 내부 특정 ChartArea인지의 여부를 결정하기 위해 interesting link를 제공했다. 비록 다른 시스템 (차트 및 ChartArea 시스템)간에 이동하는 데 최소/최대, X/Y 계산이 필요하지 않지만 chart1_MouseMove 메서드의 조건을 대체 할 수 있습니다. 어떤 경우이든,이 함수로 기대되는 정확한 입력 (제공된 링크에서 명확하게 설명되지 않음)을 확인해야하며, 3 가지 다른 참조 시스템이 관련되어 있음을 명심해야합니다 (글로벌 차트, 차트 및 ChartArea 중 하나). 이러한 종류의 상황에서는 서로 다른 참조 시스템을 사용하는 동안 호환성 문제를 피하기 위해 전체 계산을 "수동으로"수행하는 것을 선호합니다.

+0

제안에 감사드립니다. 특히 varocarbas. 또한 Hans Passant가 제공하는 링크는 흥미로운 기능이며, 실제로 일부 실험에서는이를 시작할 수도 있습니다. – rtm

+0

@ user2311569 당신은 오신 것을 환영합니다. – varocarbas

관련 문제