2013-12-19 2 views
1

Panel과 작은 pictureBox로 구성된 사용자 지정 컨트롤이 있습니다. DrawLine을 왼쪽, 위쪽에서 오른쪽, 아래쪽 pictureBox에서 시작할 때 시작점은 pictureBox의 구석에서 시작하지 않고 + x 및 + y 오프셋입니다. Panel의 전체 크기를 차지하도록 pictureBox를 확장하면 올바르게 정렬됩니다. 무슨 일이야?DrawLine : 위쪽과 왼쪽이 잘못되었습니다.

pictureBox는 위쪽, 아래쪽, 왼쪽 및 오른쪽에 앵커됩니다. 도킹 금지.

private void pictureBoxPlot_Paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.DrawLine(Pens.LightGray, 
     pictureBoxPlot.Left, pictureBoxPlot.Top, 
     pictureBoxPlot.Right, pictureBoxPlot.Bottom); 

    pictureBoxPlot.Invalidate(); 
} 
+0

패널의 Paint 이벤트를 사용할 수있는 경우 * 추가 ​​* 컨트롤을 사용하는 이유가 궁금합니다. 패널에서 0이 아닌 Location을 갖지 않는 컨트롤을 넘어 PictureBox는 e.Graphics 객체를 변경하여 SizeMode 속성을 구현합니다. 여기는 Location 속성입니다. PictureBox를 사용하면 DoubleBuffered 속성을 true로 설정하는 데 실제로 비용이 많이 듭니다. –

+0

부모의 영역 내에서 (그리고 그 이상으로) 드로잉을 할 때부터 다른 컨트롤을 가리고 있었고 OnPaint()가이를 업데이트 할 것이라고 생각했습니다 ... 처음으로 드로잉 코드를 작성했습니다 ... 감사합니다. – moose

답변

4

컨트롤이 자신에서 시작 좌표계가 (0, 0), 그래서 그런 식으로 그릴 : 그게 자신을 재귀 적으로 호출하는 원인이 있기 때문에

e.Graphics.DrawLine(Pens.LightGray, 
    0, 0, pictureBoxPlot.ClientSize.Width, pictureBoxPlit.ClientSize.Height); 

pictureBoxPlot.Invalidate() 제거해야합니다. 또한 base.OnPaint(e)은 페인트 방법을 재정의하지 않았으므로 불규칙하게 보입니다.

+0

나는 몇 시간 동안 벽에 머리를 때렸다! OnPaint() 및 Invalidate()를 제거했습니다. 예상대로 작동합니다 - 감사합니다! – moose

1

필자는 좌표가 그림 상자에 상대적이라고 생각합니다. 왼쪽 위와 실선을 원할 경우 다음과 같이 사용하십시오. 0, 0, pictureBoxPlot.height, pictureBoxPlot.Width

+0

완벽한 - 감사합니다! – moose

1

그리기는 캔버스를 기준으로합니다. 양식의 실제 위치가있는 곳을 그려야합니다. PictureBoxPlot.ClientSize

+0

이것은 아마도 내가 다른 컨트롤이 꽂혀있는 것을 보았던 이유 일 것입니다. 감사! – moose