2012-10-03 4 views
2

저는 현재 pictureBox로 작업하고 있습니다. 나는 대략 2 x 2 사각형의 크기 인 그림 상자에 그리드를 그리는 데 어려움을 겪고 있습니다. 이제 아래 코드는 나에게 선을 그어주는 것입니다. Proplery가 pictureBox 위에 전체 격자를 그리려면 어떻게해야합니까?PictureBox에 그리드 그리기

는 CODE :

private Graphics g1; 

    public Form1() 
    { 
     InitializeComponent(); 


     pictureBox1.Image = new Bitmap(500, 500); 
     g1 = Graphics.FromImage(this.pictureBox1.Image); 
     Pen gridPen = new Pen(Color.Black, 2); 
     g1.DrawLine(gridPen, 0, 0, 100, 100); 

    } 

내가 좋아하는 것이 무엇 이것은 달성하기 : enter image description here

답변

7

나는이 질문을 발견 :

: 여기 Efficiently draw a grid in Windows Forms

그것의 요점이다

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      int numOfCells = 200; 
      int cellSize = 5; 
      Pen p = new Pen(Color.Black); 

      for (int y = 0; y < numOfCells; ++y) 
      { 
       g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); 
      } 

      for (int x = 0; x < numOfCells; ++x) 
      { 
       g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); 
      } 
     } 

적절하게 맞춤 설정

+0

+1 감사합니다! 이것은 삶의 게임과 관련이 있습니다. 하지만 왜'Form1_Paint'를 사용해야하는지 모르겠습니다.'pictureBox' 이벤트 안에 있을까요? 나는 C#을 처음 접했고 귀하의 도움이 감사 할 것입니다. – techAddict82

+0

그림 상자의 페인트 이벤트 여야합니다. 내 사과 – MikeB

+0

좋아, 고마워. 나는 그리드를 전혀 보이지 않게하고있다. 그러나 코드도 오류가 없습니다. 그래서 나는 그 문제가 뭔지 확실하지 않다. – techAddict82

0

MikeB의 대답은 정확하지만 OP는 여전히 혼란스럽고 사람들은 여전히 ​​이것을보고 있으므로 확실한 답변 (예, 8 년 후)을 추가하고 있습니다.

마이크의 방법

private void pictureBox1_Paint(object sender, PaintEventArgs e) 

는 적절한 시간에 호출 할 필요가있는 독립형 방법이다. 이 작업을 수행하려면 OnPaint 이벤트 디스패처에 등록해야하므로 OnPaint 이벤트가 발생할 때마다 호출됩니다. 이렇게하려면 당신은 당신의 클래스의 생성자와 같이 몇 가지 편리한 장소에 다음 줄을 추가합니다 :

OnPaint += pictureBox1_Paint; 

이 방법은 OK,하지만 당신은 당신이 정말로 그것을 당신을 다치게 할 것이다 그리기 성능을 필요로하는 곳에 도착하면, PaintEventArgs가 생성되어 전달 될 때 추가 비용이 발생하기 때문입니다. 더 나은 방법은 부모 클래스의 OnPaint 메서드를 재정의하고 드로잉 코드를 직접 OnPaint 메서드에 넣는 것입니다. 그렇게하면 이벤트 처리기를 연결하지 않아도되고 더 빠르게 실행됩니다. 코드는 거의 동일하게 보입니다.

protected override void OnPaint (PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      int numOfCells = 200; 
      int cellSize = 5; 
      Pen p = new Pen(Color.Black); 

      for (int y = 0; y < numOfCells; ++y) 
      { 
       g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); 
      } 

      for (int x = 0; x < numOfCells; ++x) 
      { 
       g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); 
      } 
     } 

마지막으로 한 가지 제안은 PictureBox 컨트롤에서 그리기를 거의 권장하지 않습니다. 많은 사람들이 그렇게하지만 많은 전문가들이 그렇게하지는 않습니다. 그리기 캔버스로 디자인되지는 않았으며 모든 폼 기반 컨트롤과 동일한 기능을 상속 받았으며 복잡한 기능을 추가하고 유용한 기능을 추가하지 않고 속도를 늦 춥니 다. 그림 상자를 제거하고 그림 상자를 보유하고있는 폼이나 패널에 직접 그리는 경우 더 행복해집니다.

관련 문제