2012-03-19 2 views
2

현재 스마트 장치 프로젝트에서 곡선 진행률 막대를 작업 중입니다. OnPaint 함수를 재정의합니다.WinForm의 OnPaint - .NET Compact Framework 3.5

오버플로 OnPaint() 함수에서 나는 진한 회색으로 곡선 진행률 막대를 그리고 진행률 표시 줄의 변경 값 (예 : 30 %)을 반영하기 위해 진행률 표시 줄의 일부를 노란색으로 그립니다. 그러나 값이 계속 변경되면 진행률 표시 줄의 일부가 노란색으로 바뀌는 것을 볼 수 있습니다. 그러나 곡선 진행률 표시 줄 자체도 다시 그려집니다. 누구든지 값이 변경되는 동안 원래 곡선 진행률 표시 막대를 다시 그리지 않는 방법을 알고 있습니까? 따라서 값이 변경되면 진행률 막대의 일부만을 회색으로 표시하고 원본 진행률 표시 줄은 회색으로 표시하지 않습니다. 다음은 OnPaint 함수에서 사용하는 코드입니다.

protected override void OnPaint(PaintEventArgs e) 
     { 
      gx = e.Graphics; 
// Draw the original curved progress bar 
      int intPosition1 = m_NumberOfSpoke; 

      for (int intCounter1 = 0; intCounter1 < m_NumberOfSpoke; intCounter1++) 
      { 
       intPosition1 = intPosition1 % m_NumberOfSpoke; 
       DrawLine(e.Graphics, 
         GetCoordinate(m_CenterPoint, m_InnerCircleRadius, m_Angles[intPosition1]), 
         GetCoordinate(m_CenterPoint, m_OuterCircleRadius, m_Angles[intPosition1]), 
         Color.DarkGray, m_SpokeThickness); 
       intPosition1++; 
      } 

    // Draw a part of the progress bar to reflect the changing current value(such as 30%) 
    int intPosition = CurrentValue; 

       for (int intCounter1 = 0; intCounter1 < CurrentValue; intCounter1++) 
       { 
        intPosition = intPosition % CurrentValue; 
        DrawLine(gx, 
          GetCoordinate(m_CenterPoint, m_InnerCircleRadius, m_Angles[intPosition]), 
          GetCoordinate(m_CenterPoint, m_OuterCircleRadius, m_Angles[intPosition]), 
          Color.Yellow, m_SpokeThickness); 
        intPosition++; 
       } 

     base.OnPaint(e); 



     } 

나는 OnPaint를 다시 그것을 다시 그리기 피하기 위해 배경으로 orginal 한 곡선 진행률 표시 줄을 끌기 위해 재정의 OnBackgroundPaint를 사용하는 것을 시도했다, 그러나 그것은 작동하지 않습니다. 양식이로드 될 때 어떤 것도 볼 수 없습니다. 어떤 아이디어?

사전에 도움을 주셔서 감사합니다.

감사 DrawLine의 부하가 실제 화면으로 호출하고, 매우 가능성이 깜박 거림이 발생할 것입니다

답변

3

합니다. 당신은 당신이 그것을 드로잉 모두, 다음이 라인을 따라 DrawBitmap 단일 호출로 화면에 그 블럭 전송 마십시오 백 버퍼를 생성하여 버퍼를 두 배로해야합니다

protected override void OnPaint(PaintEventArgs e) 
{ 
    using(var buffer = new Bitmap(this.Width, this.Height)) 
    using(var gx = Graphics.FromImage(buffer)) 
    { 
     // for loops to draw to gx 
     .... 

     e.Graphics.DrawBitmap(buffer, ...); 
    } 

} 

내가도하지하는 것이 매우 경사 것 위에 무엇이 있는지 정확히 알려주고 모든 호출에서 비트 맵의 ​​가비지 생성을 막기 위해 버퍼를 캐시합니다.

Bitmap m_buffer; 
Gramphic m_gx; 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if(m_buffer == null) 
    { 
     m_buffer = new Bitmap(this.Width, this.Height)) 
     m_gx = Graphics.FromImage(buffer)) 
    } 

    // clear the backbuffer with a FillRect 

    // for loops to draw to m_gx 
    .... 

    e.Graphics.DrawBitmap(m_buffer, ...); 
} 

나는 아마 다음, 그려진 회색 이미지의 캐시 된 버전을 유지, 컨트롤의 회색 부분은 항상 같은 경우, 한 단계 더이 걸릴하고 "트리플 버퍼를"할 것 OnPaint에서 블리치를 그래픽에 표시하고 노랑색을 그린 다음 화면에 블리트를 지정합니다.

Bitmap m_buffer; 
Bitmap m_backimage; 
Gramphic m_gx; 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if(m_buffer == null) 
    { 
     m_backimage = new Bitmap(this.Width, this.Height); 
     var g = Graphics.FromImage(m_backImage); 
     // for loop to draw the grey stuff to g 
     .... 

     m_buffer = new Bitmap(this.Width, this.Height)) 
     m_gx = Graphics.FromImage(buffer)) 
    } 

    m_gx.DrawImage(m_backImage); 

    // for loop to draw *just the yellow* to m_gx 
    .... 

    e.Graphics.DrawBitmap(m_buffer, ...); 
} 

당신은 아마 너무하여 onResize과 다른 물건을 무시, 플러스 이러한 회원 레벨 GDI 개체를 정리하는 폐기를 확장해야 할거야,하지만 반환 한이 방법이 더 좋을 것입니다 그것은 깜박 않을거야.

+0

크리스, 도와 줘서 고마워. 결국, 나는 그것을 해결했다. Compact Framework에서 스레딩을 알고 있는지 물어볼 수 있습니까? 나는 그 순간에 문제가 있기 때문에. –

관련 문제