C# WPF ZedGraph를 사용한 그래프를 작성해 볼 것이다.
NuGet으로 ZedGraph를 다운받으면 된다.

먼저, 전반적인 UI이다.
ZedGraph와 Button, Label을 배치하여 X축은 시간(60초), Y축은 Random클래스를 사용하여 난수를
집어넣어 Value값 3개(Data A, B, C)를 표시할 것이다.
아래 Panel에는 그래프에 대한 설정을 변경할 수 있는 기능들을 추가해줬다.
실시간으로 받아온다했으면서 Time Cycle을 작성한 이유는,
1초마다 실시간으로 받아온 Value를 그래프로 표기하게 되면,

이렇게 어지러운 그래프가 생성되기 때문에, TimeCycle로 적당한 주기를 잡아준 후 그래프를 그릴 것이다.

변수 선언 부이다.
다른 클래스는 다 써봤고, GraphPane은 zedGraph 객체를 생성하기 위한 것인데
LineItem, RollingPointPairList 이 두개의 클래스가 생소했다.
구글링을 해보니, LineItem은 Line Graph(라인 그래프)를 생성하기 위한 객체를 뜻한다.
이 클래스에서 각각의 라인에 색상, 두께, 심볼 타입 등을 정의할 수 있는 것이다.
RollingPointPairList는 PointPairList의 확장 클래스라는데, 데이터 개수를 제한하여 최신 데이터만
유지하면서 오래된 데이터는 자동으로 삭제한다. 실시간 데이터를 받아오는 그래프에서 유용하게 사용된다.


전반적으로 정의를 해둔 부분이다.
뭔가 되게 많아보이지만 막상 보면 어렵지 않다. 윗줄 부터 설명하자면,
그래프의 전체적인 제목, X축, Y축에 대한 제목을 선언했다.
X축과 Y축의 최소값과 최대값, 작은 칸과 큰 칸의 간격을 설정해주고,
실시간으로 받을 데이터를 객체로 생성해준 다음 LineItem 클래스로 선언했던 선 들의 색상, 심볼 등을
정의해주었다.
타이머를 생성해주고, 1초마다 움직이게 한 다음 1초씩 움직일때마다 실행할 메서드를
타이머 이벤트에 연결해주었다. 나머지는 그냥 comboBox에 아이템들(색상, 시간 주기, 심볼 타입)을
넣은 것이다.


위 부터 순서대로 Start, Pause, Stop, All Clear 버튼이다.
[Start 버튼]
StateGraph(그래프 동작 상태)가 false 상태이면 ResetData를 호출하여 데이터를 초기화하고
타이머를 실행한다.
StateGraph를 선언한 이유는 Pause상태와 Stop상태를 구별하기 위해서라고 생각하면 된다.
[Pause 버튼]
타이머를 멈추고, Log 파일에 "PAUSE"를 작성한다.
StateGraph는 true 상태로 만든다.
[Stop 버튼]
타이머 메모리를 삭제하고, 로그에 "STOP"을 작성하고, 데이터를 초기화 한 다음 StateGraph를
false상태로 만든다.
[All Clear 버튼]
Configuration 부분에서 사용자가 바꿔놓은 설정값을 초기화하는 버튼이다.
코드에서 나온 메서드들은 바로 아래에서 후술하겠다.
메서드들이 어떤 역할을 하는지 알고 싶다면 Ctrl + F를 누르고 메서드 이름을 넣으면 찾을 수 있다.

먼저 1초마다 실행 할 메서드이다. (타이머 이벤트에 연결해두었음.)
전반적인 흐름 자체는, 60초까지 동작하며 1초, 설정해둔 시간 주기마다 그래프를 그린다.
60초가 지나면 메세지박스를 팝업하고, 로그를 작성하게 한다. 각 버튼을 비활성화 시키게 해놓고,
Graph상태를 false로 내려둔다.

[ShowMsgBox]
메세지박스를 팝업시키는 메서드이며, 매개변수가 true일때와 false일때 메세지박스를 서로 다르게
팝업하게 만들었다.
[ButtonEnabled]
Start, Pause, Stop 버튼을 활성화하거나 비활성화하는 메서드이다.
이미 그래프가 그려져있는 상태에서 Start버튼을 누르거나, 이미 Pause 버튼을 누른 상태에서
또 Pause버튼을 누르는 등 정상적이지 않은 이벤트가 발생되는 것을 방지하기 위함이다.

[WriteLog]
데이터를 받아오는대로 Log를 작성하기 위한 메서드이다.

[ResetData]
Stop 버튼을 눌렀을 때 처음 상태로 되돌리기 위해 데이터들을 초기화한다.
여기서 계속 나오는 zedGraphControl1.AxisChange와 Refresh가 있는데,
AxisChange는 호출할때마다 축을 업데이트한다고 생각하면 된다.
그래프의 범위에 따라 축의 최소값, 최대값, 간격 등을 자동으로 재계산한다.
Refresh는 그 즉시 다시 그래프를 그리게 하는 메서드이다.

[ClearTextFields]
Stop버튼을 눌렀을 때 호출되는 메서드이며, Configuration 부분에서 사용자가 설정해놓은
컴포넌트들을 초기화하는 메서드이다.
일단 이 글에서는 Button과 그 Button에 사용되는 메서드까지만 설명하도록 하고
나머지 기능들과 최종 동작 부분은 다음글에서 후술하도록 하겠다.
'IT > C# Windows Form(.NET Framework)' 카테고리의 다른 글
| ZedGraph를 이용한 시간별 Value 측정(2) (0) | 2025.01.24 |
|---|---|
| OpenFileDialog / SaveFileDialog (0) | 2025.01.16 |
| PictureBox (0) | 2025.01.16 |
| UserControl(사용자 정의 컨트롤) (0) | 2025.01.16 |
| DLL(Dynamic Link Library) (1) | 2025.01.16 |