본문 바로가기

Papyrus/Dizzy Report

GDI, GDI+, WPF

고전적인 윈도우 프로그래밍은 곧 이벤트 핸들러를 작성하는 것이었고, WinMain()과 WndProc()를 작성하는 것이다. 사실, 이 방법론은 여러번 변경되어왔다. SDK를 사용한 Win32 API를 직접 사용하는 방법에서 MFC를 사용한 C++ 클래스 라이브러리를 사용하는 방법으로, 최근에는 Windows Forms을 사용하는 것으로 변경되어 왔는데, 숱하게 많은 방법론이 등장했음에도 불구하고 상대적으로 느린 변화를 보였던 것이 바로 윈도우 프리젠테이션 엔진이었다.

윈도우 프리젠테이션 엔진은 전통적으로 GDI라는 2D 클리핑 기반 엔진인데, 사실 MFC 시절까지도 이것은 큰 변화가 없었다. 이것이 .NET이 등장하면서 GDI+라는 것으로 재작성되어 나타났다. 그러나 근본적인 면에서 GDI+ 역시 2D 클리핑 기반 프리젠테이션 엔진이라는 점은 변함이 없었다. .NET 프레임워크에서는 System.Drawing라는 네임스페이스에 GDI+ 기능들이 구현되어 있고, 윈도우 프로그래머들이 흔히 말하는, '윈도우질'이라는 기능들은 System.Windows.Forms 네임스페이스에 구현되어 있다. GDI와 GDI+가 조금 다른 점이라면, GDI+는 상태없는 머신이라는 점이랄까. 그래서 GDI에서는 디바이스 컨텍스트에 뭔가를 지정하면, 지정한 속성이 그대로 유지되었지만, GDI+에서는 항상 메서드를 호출하는데 속성들을 지정해줘야 한다. 물론, GDI+에도 몇몇 속성들이 있기 때문에 완전한 상태없는 머신은 아니다. 여튼, 둘은 큰 차이가 있는 것은 아니다.

그런데, 이제는 WPF라는 좀 더 근본적인 변화가 발생했다. 물론 윈도우 프로그래머로서는 뭔가를 새로 배워야 한다는게 달갑지는 않지만, WPF는 2D 클리핑 기반 엔진이 아니라, 3D 벡터 기반 엔진이라는 점에서 뭔가를 새로 배워야한다는 짜증보다 호기심을 자아낸다. 그리고 사실, 윈도우 프리젠테이션 엔진은 GDI, DX로 분명히 나뉘어져 있어서 다양한 화면 효과를 주기에는 사용하기 좀 골치아픈 점도 있는게 사실이었다. 할 수 있는 것도 그렇게 많지도 않았고.

그런데, WPF라는 것은 정말 잘만 연구하면 놀라운 UI를 구성할 수 있을 뿐만 아니라, 2D와 3D를 혼합하여 쓰기도 편리하며(물론 고속의 3D 출력을 얻기위해서는 DX를 사용해야 한다), 프로그래밍하기도 쉬워보인다.

요즘 들어 C#에 관심을 기울이는 것도, .NET 환경에서는 어차피 어떤 언어로 작성하던지 MSIL로 컴파일되기 때문에 성능상의 대단한 차이가 없으며, 오히려 Visual C++은 억지로 .NET 프레임워크에 맞추어 자체 기능 확장을 하다 보니 이건 C++도 아니고 괴물같이 느껴지는 이유도 있기 때문이다. .NET 프레임워크에 가장 잘 맞는 언어는 확실히 C#이다. C++은, 그냥 MFC의 발전만 기다리는게 제일 좋을 것 같다(그런 의미에서 Feature Pack에서 대량의 기능 업데이트는 무척 환영할만하다. 다만 자체 개발 클래스들이 아니란 점이 좀 아쉽기는 하지만).


GDI+를 연구해봤자 .NET 프레임워크 3.5가 등장했고, WPF가 아주 놀라운 기능을 제공하기 때문에 어차피 큰 쓸모는 없겠지만, WPF도 당장 많은 기능들을 제공하는게 아닌 만큼 Windows Forms를 연구하는 것도 헛수고는 아닐 것이다.