2010-03-04 7 views
22

C# WinForms - 저는 500ms마다 직렬 포트를 통해받은 데이터를 기반으로하는 선형 차트를 실시간으로 그립니다.강제로 다시 그리시겠습니까?

e.Graphics.DrawLine 논리는 양식의 OnPaint 처리기 내에 있습니다.

일단 직렬 포트에서 데이터를 수신하면 양식을 다시 그리게하여 무언가를 호출하여 OnPaint 처리기가 호출되도록해야합니다. 나는 이것을 시도했다. 새로 고침과 이것. 무효화하고, 이전에 그 양식에 그려져 있던 것이 무엇이든 잃어 버리게된다.

양식에 표시된 내용을 잃지 않고이를 수행 할 수있는 또 다른 방법이 있습니까?

답변

20

요점은 드로잉 데이터를 어딘가에 저장하는 것이 좋습니다. 이미 말했듯이, 버퍼 비트 맵은 해결책입니다. 그러나 그다지 드로잉 할 필요가 없으면 드로잉 데이터를 변수 또는 배열에 저장하고 OnPaint 이벤트의 모든 내용을 다시 그리는 것이 더 쉽고 더 좋습니다.

차트에 추가해야하는 일부 포인트 데이터를받는다고 가정 해보십시오.

List<Point> points = new List<Point>(); 

그런 다음 새 점을 얻을 때마다 당신이 목록에 추가하고 양식을 새로 고침 : 모든 전나무는 점 목록을 작성하는 OnPaint 이벤트에서

points.Add(newPoint); 
this.Refresh(); 

다음 코드를 넣어 :

private void Form_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLines(Pens.Red, points); 
} 

이것은 100,000 포인트까지 상당히 빠르게 작동하며 버퍼 비트 맵 솔루션보다 훨씬 적은 메모리를 사용합니다. 그러나 드로잉의 복잡성에 따라 사용할 방법을 결정해야합니다.

+0

일 수 있습니다. 빠른 질문 -이 선형 차트를 실시간으로 그리는 중입니다. 결국 화면에서 최대 너비를 초과 할 것이므로 양식에 그린 선을 약간 왼쪽으로 이동하여 새 좌표가 그려지는 공간을 만드십시오. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까? 기본적으로 간단한 EKG 유형 응용 프로그램을 개발 중입니다. – Chris

+2

이렇게하는 방법은 다양합니다. 예를 들어, e.Graphics.TranslateTransform (-x, 0); 이렇게하면 모든 그래픽이 x 픽셀 씩 왼쪽으로 그려집니다. – Zenya

0

기본 처리 방법은 메모리 비트 맵을 만든 다음 그 위에 그리면 그림 상자의 이미지 속성을 메모리 비트 맵으로 설정하는 것입니다.

5

다시 실행하면 폼을 버퍼링해야합니다 (그리면 데이터를 삭제 한 것으로 보입니다). 말했다

private Bitmap buffer; 

// When drawing the data: 
if (this.buffer == null) 
{ 
    this.buffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); 
} 

// then draw on buffer 
// then refresh the form 
this.Refresh(); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (this.buffer != null) 
    { 
     e.Graphics.DrawImage(this.buffer); 
    } 
} 

, 당신은 아마 폼 크기 변경 후 이전 데이터를 다시 그릴 때 버퍼의 크기를 변경할 수 있도록 데이터를 캐시하려면 :

내가 그것을 얼마나 기본적으로 그 위에.

0

어딘가에서 기록 데이터를 저장하고 다시 칠해야합니다.

캐시 및 비트 맵 클리핑보다 훨씬 쉬울 것입니다.

1

해결책은 this.Invalidate()

관련 문제