2017-02-22 4 views
-3

은 :왜이 그림이 그려지지 않습니까? 나는 내 코드에서 if 문을 다음 한

//global variables 
int x1; 
int y1; 
int x2; 
int y2; 
int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      x1 = Cursor.Position.X; 
      y1 = Cursor.Position.Y; 
      counter++;       
     }  
     else 
     { 
      x2 = Cursor.Position.X; 
      y2 = Cursor.Position.Y; 

      if (counter == 1) 
      { 
       Graphics g = CreateGraphics(); 
       g.DrawLine(Pens.Black, x2, y2, x1, y1); 
      } 
      counter = 0; 
     } 
    } 
} 

내 PictureBox를 두 번 클릭하기로되어있어 그것은 x와 y i가 클릭 할 때마다 저장합니다. 두 번째 클릭에서 선은 두 좌표 사이에 있어야합니다. 하지만 나던 이유는 알 수 없습니다. 누군가가 무엇이 잘못되었는지 말해 줄 수 있습니까?

+1

'radioButtonDrawLine.Checked == true? ' –

+0

여전히 작동하지 않습니다. 나는 "== true"를 사용하지 않고 동일해야한다고 생각한다. –

답변

3

코드에는 두 가지 주요 문제가 있습니다.

먼저 그림 상자가 아닌 양식에 CreateGraphics을 호출합니다. 실제로 올바른 위치에 그림을 그리면 그림 상자에 그림이 숨겨집니다.

두 번째로, Cursor.Position은 화면에 표시 할 컨트롤과 관련되지 않고 화면 조합을 반환하기 때문에 동료가 꺼져 있습니다. 하지만 이미 불필요합니다. 처음에는 Click 이벤트를 사용해서는 안되며, 대신 MouseUp을 사용하십시오. Click은 포인팅 장치를 전혀 사용할 필요가없는 다른 동작입니다 (예 : 버튼의 눌러 진 공간). 마우스 클릭을 처리하기를 원하므로 마우스 이벤트를 사용하십시오. 보너스로 이벤트 처리기의 인수에서 로컬 클릭 속성을 얻을 수 있습니다.

마지막으로, 이미지를 지속성있게 유지하려면 그림 상자 그래픽 객체를 직접 그리지 않는 것이 좋습니다. 드로잉을 유지하기 위해 메모리 내 비트 맵을 생성하고, 그림 상자가 적절하게 보이듯이 다시 그려 지도록합니다. 그렇지 않으면, 그림 상자를 다시 그리는 원인이 무엇이든지 지금까지 그렸던 것을 지울 것입니다.

2

페인트 이벤트에서 도면을 수행해야합니다. 아래처럼 뭔가 작업을해야합니다 :

//global variables 
private Point? p1; 
private Point? p2; 
private int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      p1 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      counter++; 
     } 
     else 
     { 
      p2 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      pictureBox1.Refresh(); 
      counter = 0; 
     } 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (p1.HasValue && p2.HasValue) 
    { 
     e.Graphics.DrawLine(Pens.Black, p1.Value.X, p1.Value.Y, p2.Value.X, p2.Value.Y); 
    } 
} 

pictureBox1.Refresh() 호출은 한 번에 두 번째 지점이 생성 된 다시 그리기를 강제하는 것입니다. 좌표를 저장할 때 int가 아닌 Point 구조체를 사용 했으므로 좌표를 논리적 그룹으로 유지하고 그 좌표를 명확하게 나타냅니다.

+0

이렇게하면, 'Paint' 이벤트가 아니라 coördinates를 캡처하자마자'PointToClient'를 수행하십시오. 그 사이에 컨트롤이 움직여서 라인이 움직이게 될 수도 있습니다. – Luaan