.NET 5의 Windows Forms은 .NET Framework 때와 많이 보완 된 것으로 보입니다. 닷넷데브에서도 한번 소개된 적이 있는데요,
Windows Forms has always been known as a managed wrapper around the Win32 API set. As such, Windows Forms has always depended heavily on an interop layer to communicate with the unmanaged Windows components. The top priority from the early days of .NET Core has been the optimising of our interop layer, making structs blittable, explicitly opting for more efficient “W”-functions, and using “unsafe” code where possible. All these changes are what we call “peanut butter changes”, in a sense that each of these are tiny and hardly observable, but over a lifetime of an application these changes add up to a substantial performance gains.
Windows Forms 개발을 주로 하시는 분들도 .NET 5로 넘어오시는게 이롭다는 것을 이 문서만 봐도 대략 느끼실 수 있을 것 같습니다.
이 문서의 내용 중 흥미로운 점은 GDI+ 를 GDI로 부분 교체해서 성능 향상을 얻었다는 내용입니다. 그래서 성능 또는 동작성에 대한 어떤 차이가 생겼는지 차트를 만들면서 비교해 볼 생각입니다.
먼저 값입니다. 값은 바로 앞전에서 분석한대로 시고저종 입니다. 4가지의 값이 있으면 하나의 봉을 표현할 수 있는데요, 가운데 봉의 색은 Close > Open일 때 녹색, Close < Open일 때 빨강색으로 표현하면 됩니다.
값의 다양한 형식을 수용하고 싶은데요, 하나의 봉의 구조는 그래서 다음과 같이 정의 합니다.
public interface IQuote<T>
{
T Open { get; }
T High { get; }
T Low { get; }
T Close { get; }
}
자 그럼 표현은 이렇게 정의했으니, 위의 하나의 봉을 어떻게 표현할까를 생각해 봅시다.
우리가 바라보고있는 모니터는 픽셀로 이루어진 해상도를 지니고 있습니다. 즉, Y의 단위는 픽셀, X의 단위도 픽셀입니다. 요즘 노트북을 사용하고 있는 대부분의 해상도는 1920x1080일 텐데요, Y축이 1080개의 픽셀로, X축이 1920개의 픽셀로 이루어졌다는 의미입니다.
그런데, 캔들스틱차트의 좌표 단위는 어떨까요? Y축은 가격, X축은 시간입니다. 즉,
(시간,가격) 좌표계를 (픽셀, 픽셀)로 변환해야 합니다.
시간과 가격은 픽셀로 변환할 수 있는 근거가 없습니다. 약속이 필요하는데요, 이런 식입니다.
값의 (X, Y)축의 최대, 최소 값을 구한 후 변환해야 할 화면 (X, Y) 최대, 최소(0)에 맞게 비율로 조정한다.
화면 (X, Y) 좌표계의 최대, 최소(0)를 구한 후 변환비를 통해 값를 조정한다.
이때, (X, Y)를 같은 1:1비율로 조정할 것이냐, 화면에 맞게 비율비를 다르게 할것이냐를 결정하면 원하는 최종 픽셀로 이루어진 좌표 단위로 변환할 수 있게 됩니다.
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
var clip = e.ClipRectangle;
var rec = ClientRectangle;
// 검정색 배경을 그립니다.
g.FillRectangle(Brushes.Black, rec);
}
컴파일을 하면 MainForm에 이미 적용된 CandlestickChartControl에도 반영이 됩니다.