2017-05-19 12 views
-1

이 문제에 대한 몇 가지 질문을 보았지만 모든 솔루션을 시도했지만 그 중 아무 것도 내 경우에는 효과가 없었습니다. 내 코드가 작동 중입니다. 이 image은 그리기 버튼을 클릭하면 어떻게되는지 보여줍니다. 해당 도면을 확대해야합니다. AutoCAD 기능 "확대/축소"와 같은 코드를 작성할 수 있습니까?페인트 이벤트의 드로잉 크기 조정

Pen myPen = new Pen(Color.Black); 
int centerpointx, centerpointy; 
private void pictureBoxDraw_Paint(object sender, PaintEventArgs e) 
    { 
     centerpointx = pictureBoxDraw.Size.Width/2; 
     centerpointy = pictureBoxDraw.Size.Height/2; 

     myPen.Width = 2; 
     if (binary > 0) 
     { 
      var sizecrestgeo = 40; 
      var distancearraycrestgeo = new float[sizecrestgeo]; 
      var elevationarraycrestgeo = new float[sizecrestgeo]; 
      for (int i = 0; i < sizecrestgeo; i++) 
      { 
       distancearraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[0].Value.ToString()); 
       elevationarraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[1].Value.ToString())*-1; 

      } 
      for (int i=0; i < sizecrestgeo-1; i++) 
      { 
      e.Graphics.DrawLine(myPen, distancearraycrestgeo[i]+centerpointx, elevationarraycrestgeo[i]+centerpointy, distancearraycrestgeo[i + 1]+centerpointx, elevationarraycrestgeo[i + 1]+centerpointy); 
      } 
     } 
     else 
     { 
     } 
    } 

    private void buttonDraw_Click_1(object sender, EventArgs e) 
    { 
     if (Hd > 0.0001) 
     { 
      binary = 1; 
      pictureBoxDraw.Invalidate(); 
     } 
     else 
     { 
      MessageBox.Show("No data to draw, perform analysis first."); 
     } 

    } 

    private void buttoncleardraw_Click(object sender, EventArgs e) 
    { 
     binary = 0; 
     pictureBoxDraw.Invalidate(); 
    } 
} 
+1

Graphics 객체의 크기를 조절할 수 있습니다. [여기] (http://stackoverflow.com/questions/32204274/panel-drawing-zoom-in-c-sharp/32204516#32204516) 및 [여기] (http://stackoverflow.com/questions/32204274/)를 참조하십시오. 패널 드로잉 - 줌 - 인 - 샤프/32204516? s = 4 | 0.8505 # 32204516). – TaW

+0

펜의 너비도 조정되므로 그림판에서 1px보다 작은 크기를 사용하는 것이 좋습니다. 그들은 여전히 ​​최소 1px로 그려 질 것입니다. – TaW

+0

@TaW 유용한 예와 경고, 감사합니다. [img1] (https://i.hizliresim.com/V0q6oV.png) [img2] (https://i.hizliresim.com/1LQDmp.png) 사실 이것은 내가 정확히 원하는 것이 아닙니다. 나는 사용자가 이것을 제어하기를 원하지 않는다. 나는 어떻게 든 그림을 중심에 놓아야한다. –

답변

0

Graphics.ScaleTransform() 확대/축소 방법입니다. 당신의 페인트 이벤트 핸들러 내부에 이런 식으로 뭔가를 사용해보십시오 :

e.Graphics.ScaleTransform(2.0F, 2.0F); 
0

이것은 당신이 모든 퍼즐 조각을 알고 있으면, 그렇게 어렵지 않다.

의 명백한 하나의 시작하자 :

  • 당신은 Graphics 객체가 ScaleTransform확대 그래픽을 만들기 위해 확장 할 수 있습니다.

앞서 언급했듯이, 여기에는 펜의 너비, 글꼴 크기 및 그릴 이미지가 포함됩니다 (HatchBrush의 해치가 아님).

그림을 '가운데 맞춤'으로 유지할 것인지 물어 보았습니다. 이것은 분명하지 않은 개념입니다. 의 그림 화면은 무엇입니까?

기본이으로 당신은 항상 줌의 중심점 알 필요가 (단지 회전 등) (또는 회전을.) 확대 기원 (0,0)입니다. 나는 Panel의 센터를 선택했다. 다른 점을 선택하고 싶을 수도 있습니다.

그래픽 뷰포트의 원점을 TranslateTransform으로이 점으로 이동할 수 있습니다.

이 모든 것을 얻으면 거의 확실하게 스크롤을 허용하려고합니다.

수행 작업

은 그래서 당신은 두 가지 옵션이 있습니다

  • 당신은 AutoScroll = false둥지AutoScroll = true을 가지고 내부의 캔버스 제어 일반적으로 다른 제어하는 ​​Panel을 유지 할 수 있습니다; 다음으로 캔버스 컨트롤을 항상 크게 그리기 만하면됩니다. 그러면 완료됩니다.

  • 또는 캔버스 컨트롤의 경우 AutoScroll을 켤 수 있으며 충분히 큰 AutoScrollMinSize을 설정할 수도 있습니다. 그런 다음 현재 스크롤 위치를 번역에 추가하면 완료됩니다.

    Size sz = panel3.ClientSize; 
    Point center = new Point(sz.Width/2, sz.Height/2); 
    Graphics g = e.Graphics; 
    
    // center point for testing only! 
    g.DrawEllipse(Pens.Orange, center.X - 3, center.Y - 3, 6, 6); 
    
    // you determine the value of the zooming! 
    float zoom = (trackBar1.Value+1)/3f; 
    
    // move the scrolled center to the origon 
    g.TranslateTransform(center.X + panel3.AutoScrollPosition.X, 
             center.Y + panel3.AutoScrollPosition.Y); 
    // scale the graphics 
    g.ScaleTransform(zoom, zoom); 
    
    // draw some stuff.. 
    using(Pen pen = new Pen(Color.Yellow, 0.1f)) 
    for (int i = -100; i < 100; i+= 10) 
         g.DrawEllipse(Pens.Yellow, i-22,i-22,44,44); 
    

    몇 가지 참고 사항 :

    • 나는 오렌지 원을 그리 이것은 Paint 이벤트의 코드가

    enter image description here

    입니다 :의 행동에이 솔루션을 보자 이 점을 보여주기 위해 중심에 불변의 .

  • 내 좌표가 음수에서 양수로 이동하므로 이것이 제대로 작동한다는 것을 알 수 있습니다.
  • 작은 펜 너비로 그립니다. 결과 펜이 1 픽셀을 넘으면 도면의 너비가 변경됩니다. 아무거나 당기는 것은 1 pxiel 폭을 가진 끌기 일 것이다.
  • 먼저 스케일을 적용한 부분을 계산할 필요가 없도록 처음으로 변환 한 다음 스케일을 조정합니다. 그러나 그것이 깜박임을 방지하기 위해 Panel에 필요한 panel3.Invalidate();

유일한 설정

panel3.AutoScroll = true; 
panel3.AutoScrollMinSize = new Size(500, 500); // use the size you want to allow! 

있습니다 :

  • TrackBarScroll 이벤트의 유일한 선은 Paint 이벤트를 트리거하는 것입니다 DoubleBuffered 하위 클래스를 사용하는 것이 좋습니다.

    class DrawPanel : Panel 
    { 
        public DrawPanel()  { DoubleBuffered = true; } 
    }