2008-11-13 7 views
2

내 응용 프로그램이 기본 폼의 하위 폼을 팝합니다. 양식은
그래픽이 렌더링되는 패널에서의 사용자 정의 컨트롤입니다. 디버그 모드에서 Visual Studio의 을 실행하면 도면이 예상대로 렌더링되는 경우가 종종 있는데, 단순한 XY 그래프를 상상해보십시오. 패널의 그래픽이 그려지지 않은 경우 일반적으로 두 개 또는 세 개의 중단 점을 드로잉 루틴에 추가하면 문제가 해결됩니다.사용자 컨트롤에 그래픽 그리기 문제가 발생했습니다.

해제 모드에서 Visual Studio 내에서 또는 모든 모드에서 the.exe에서 실행될 때 사용자 컨트롤의 Paint 메서드가 이라고해도 그래픽이 렌더링되지 않습니다. 양식의 크기를 조절하면 다시 칠하기 때문에 이미지가 올바르게 렌더링됩니다.

누구나 내게 왜 동작 차이가 있는지에 대한 통찰력을 줄 수 있습니까? 디버그 모드와 릴리스 모드 사이, VS 내외부 VS 어떤 점에서 문제를 해결할 때가 있습니까? 그리고 어떻게하면 그래픽이 일관성있게 보이게 할 수 있습니까?

감사합니다, 나는 당신이 행동의 차이를보고있는 이유를 확실히 말할 수 없습니다 자세한 내용은없이

alt text http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.pngalt text http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

답변

1

(난 당신이 같은 문제 이후를보고있는 제안 디버그 버전이 항상 작동하지는 않는다는 것을 인정합니다.하지만 Visual Studio로 다시 전환하면 결국 작은 부분이 아닌 전체 페인트 표면이 무효화되기 때문에 중단 점은 종종 페인트 문제를 "수정"한다는 것을 알 수 있습니다. 따라서 응용 프로그램을 가져 와서 제대로 그리지 않으면 Visual Studio에서 중단 점을 맞추고 일부 변수를 전환 한 다음 응용 프로그램으로 돌아가서 OnPaint가 적절한 표면을 다시 그리기 위해 적절한 클리핑 사각형으로 호출 되었기 때문에 올바르게 그려집니다. (그리고 OnPaintBackground도 보통 호출됩니다, 아래 참조).

이 경우 응용 프로그램을 최소화하고 복원하여 릴리스 버전에서 복제 할 수 있어야합니다. 컨트롤의 표시를 "수정"하면 전체 컨트롤을 페인트하지 않을 때 페인트하는 것으로 가정하여 페인트 메서드의 문제로 인해 발생할 수 있습니다.

PaintBackground를보고 컨트롤 표면을 올바르게 지울 수도 있습니다. "오래된"캔버스에서 시작하는 대신 오래된 디스플레이를 떠나서 그 위에 다시 칠할 가능성이 있습니다.

진행 상황에 대한 설명과 다시 그리는 방법을 기반으로 한 것이 내 제안입니다. 좀 더 정확한 도움말을 제공하기 위해 좀 더 구체적인 세부 정보 (그림판 코드, 발생 상황에 대한 구체적인 설명 - 컨트롤이 그려지지 않았거나 부품 만 표시하는 등)가 필요했습니다.

1

방금이 소용돌이를 주었고 릴리스 모드에서 예상 한대로 작동했습니다. . . 그것은 파란 색과 큰 노란 타원으로 패널을 채 웁니다. 문제를 재현하는 데 필요한 최소한의 예제 코드를 게시하십시오. . . 아마 아래 MyPanel 구축.

타이머의 역할은 너무 자주 다시 그리지 않도록하는 것입니다. 이것은 전체 컨트롤의 다시 칠을 강제하는 자체 종결 타이머입니다. 컨트롤을 사용하여 사용자 정의 그려진 내용 크기가 필요하기 때문에이 작업이 필요합니다.

public class MyPanel : Panel 
    { 
     Timer _resizeRedrawDelayTimer = new Timer(); 
     public MyPanel() 
     { 
      _resizeRedrawDelayTimer.Interval=50; 
      _resizeRedrawDelayTimer.Tick += new EventHandler(_resizeRedrawDelayTimer_Tick); 
     } 

     void _resizeRedrawDelayTimer_Tick(object sender, EventArgs e) 
     { 
      Invalidate(); 
      _resizeRedrawDelayTimer.Stop(); 
     } 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      // don't redraw if still resizing. 
      if (!_resizeRedrawDelayTimer.Enabled) 
      { 
       e.Graphics.FillRectangle(Brushes.Blue, this.ClientRectangle); 
       e.Graphics.FillEllipse(Brushes.Yellow, this.ClientRectangle); 
      } 
      base.OnPaint(e); 
     } 

     protected override void OnResize(EventArgs eventargs) 
     { 
      if (_resizeRedrawDelayTimer.Enabled) 
       _resizeRedrawDelayTimer.Stop(); 
      // restart the timer. 
      _resizeRedrawDelayTimer.Start(); 
      base.OnResize(eventargs); 
     } 
    }