2016-10-07 1 views
1

언제 어떻게 주석을 생성합니까? Annotation.BeginPlacement()으로 최종 사용자 배치를 사용하려면 어떻게해야합니까? 여러 가지 방법으로이 작업을 시도했지만 작동하지 않습니다. BeginPlacement()가 호출 된 후 실시간으로 렌더링되어야합니다.사용자가 MSChart에서 어노테이션을 작성하게하는 방법은 무엇입니까?

이 주제에 관한 문서는 거의 없으며 거의 ​​없음 -이 문제에 대한 도움을 찾을 수 없습니다.

내가 지금까지 시도한 것은 주석을 작성하여 AnchorX/Y로 배치하고 모든 Allow- 플래그를 true로 설정하고 마우스가 이동하는 동안 BeginPlacement()를 호출하는 것입니다. 그러나 마우스를 이동하는 동안 주석을 볼 수는 없습니다 그에 따라 그것의 장소에 들어 가지 않을 것입니다. 예를 들어, LineAnnotation은 올바른 위치에서 시작하지만 왼쪽에서 끝나지는 않습니다. ChartAreas {0,0}에서 시작되도록 이동하면 끝점에 도달합니다.

내가 알고 싶은 것은, 언제 어떻게 이러한 도구를 사용할 수 있는가? 내가하려는 일은 사용자가 차트에 주석을 그리고 차트를 분석 할 때 도구로 사용하도록하는 것입니다.

답변

2

올바른 위치를 계산해야합니다. MouseMove는 위치 (백분율) 또는 값 (데이터)이 아니라 픽셀을 제공합니다. 다양한 축 기능을 사용하여 변형 할 수 있습니다. 공식적으로 xxxPaint 이벤트에서만 작동하지만 마우스 이벤트 중에는 정상적으로 작동합니다.

업데이트 : 거기 앵커링 두 가지 방법 :

  • 어느 이용한 '포지션', 즉 비율 또는 '값', 즉 데이터 값. 당신이 축 최소 및/또는 최대 chaning처럼, 어떤 방법으로 축 크기를 조정해야 할이 잘 unles 작동

    enter image description here

    LineAnnotation laNew = null; 
    
        private void chart1_MouseDown(object sender, MouseEventArgs e) 
        { 
         if (cbx_drawAnnotation.Checked) 
         { 
          Axis ax = chart1.ChartAreas[0].AxisX; 
          Axis ay = chart1.ChartAreas[0].AxisY; 
          laNew = new LineAnnotation(); 
          chart1.Annotations.Add(laNew); 
          double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X)); 
          double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)); 
          laNew.X = vx; 
          laNew.Y = vy; 
         } 
        } 
    
    
        private void chart1_MouseMove(object sender, MouseEventArgs e) 
        { 
         if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked) 
         { 
          Axis ax = chart1.ChartAreas[0].AxisX; 
          Axis ay = chart1.ChartAreas[0].AxisY; 
          double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X))- laNew.X; 
          double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)) - laNew.Y; 
          laNew.Width = Math.Min(100, vx); 
          laNew.Height = Math.Min(100, vy); 
          laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red; 
          laNew.AllowMoving = true; // optional 
         } 
        } 
    

    : 여기

는 1 가지 예입니다 값.

  • 앵커를 입력해야하는 경우.

먼저 우리는 AxesAnnotation 연관 필요도 falseIsSizeAlwaysRelative을 설정합니다. 그런 다음 우리는 앵커와 크기 값을 계산할 수있다 : 지금 최대를 확장 할 수 있으며, 여전히 데이터 포인트와 함께 머물 차트와 그의 주석의 크기를 조정하는 방법을

private void chart1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (cbx_drawAnnotation.Checked) 
    { 
     Axis ax = chart1.ChartAreas[0].AxisX; 
     Axis ay = chart1.ChartAreas[0].AxisY; 
     laNew = new LineAnnotation(); 
     chart1.Annotations.Add(laNew); 

     laNew.IsSizeAlwaysRelative = false; 

     laNew.AxisX = ax; 
     laNew.AxisY = ay; 

     laNew.AnchorX = ax.PixelPositionToValue(e.X); 
     laNew.AnchorY = ay.PixelPositionToValue(e.Y); 

     laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red; 
     laNew.AllowMoving = true; 
    } 
} 


private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked) 
    { 
     Axis ax = chart1.ChartAreas[0].AxisX; 
     Axis ay = chart1.ChartAreas[0].AxisY; 

     laNew.Width = ax.PixelPositionToValue(e.X) - laNew.AnchorX; // values 
     laNew.Height = ay.PixelPositionToValue(e.Y) - laNew.AnchorY; 
    } 
} 

주 .. :

enter image description here

+0

LineAnnotation의 너비와 높이에 백분율을 사용하는 것으로 나타났습니다. Axis 값으로 가져올 수 있습니까? 시간 창 크기 조정 (Axis 최소/최대, 확대/축소 없음)을 허용하고 선이 "크기 조정"되지 않도록합니다. 편집 : 아니면 귀하의 차트는 단지 100x100 ...? – misthema

+0

맞습니다. 모든 ChartElement.Position.xxx 값은 각 컨테이너의 백분율로 표시됩니다. 이 유형의 앵커링을 DataPoint 값에 상대적으로 앵커링으로 전환하는 방법을 살펴 보겠습니다. – TaW

+0

솔루션을 찾을 수 있다면 정말 멋지 겠지요 ...미리 감사드립니다! – misthema

관련 문제