이제 프로젝트 세팅이 끝났으면 이전에 했던(두 번째 포스트) 기본 API 코드를 활용해 DirectX의 기반 코드를 넣어보자
여기 나오는 모든 코드는 MSDN의 아래 링크에서 따온 것이며 이 코드를 시작 코드로 삼을 것이다.
프로젝트에 파일 추가
이전 포스팅에 의해 Main.cpp 파일이 프로젝트에 추가되어 있고 엔트리 포인트 함수인 wWinMain() 함수가 존재하고 있다.
헤더 파일 Main.h 를 하나 더 추가하자

화면 오른쪽 프로젝트 탐색기 영역에 -> 프로젝트명 오른 클릭 -> 추가 -> 새 항목 -> 헤더 파일
추가하고 나면 아래와 같은 모습이다.

DirectX 기본 코드 기입
기본 사각형과 격자를 그려주는 DirectX의 샘플 코드를 넣어보자.
Main.h에 아래와 같은 코드를 넣어주면 된다. 참고로 이 코드들은 앞으로 설명할 코드들이기에 모두 이해가 가지는 않을 것이다.
현재로선 Main.cpp 파일의 코드가 지난 포스팅에서 설명했던 WinAPI 기본 코드들을 바탕으로 하고 있다는 것만 알아채면 된다.
DirectX 역시 Windows에 기반을 둔 API이며, 그래서 프로그램을 작성할 때 대부분의 경우가 그렇듯 이 기본 Windows API코드를 바탕으로 하고 있다.


39라인을 제외하면 모두 위의 MSDN 링크에서 가져온 코드이다.
Main.cpp의 모든 코드는 아래와 같다. 라인 넘버를 보면 알겠지만 처음부터 끝까지의 통짜 코드이다.






Main.cpp 코드에서는 원본 코드와 달리 3라인과 206라인, 214라인 등에 변수명(StaticObject)이 바뀌어 있다.
라인 60 – 64 라인 206, 222 이 코드에서 가장 중요한 커스터마이징이라고 할 수 있다. 라인 60부분에서 이 어플리케이션에 대한 윈도우 창을 생성할때 생성하는 함수의(CreateWindow())인자중 하나로 this가 들어가고 있다. 이는 Windows로부터 올라오는 (어플리케이션쪽으로 던져지는) 이벤트를 받기 위한 콜백함수인 WndProc에 역시 인자로 넘어온다. 윈도우가 이제 생성되었다는 이 윈도우에 해당하는 메인클레스로서 WM_CREATE 이벤트 메시지에 lparam 인자에 담겨 오는것. 이 메인 클래스 캑체를 스테틱 변수인 StaticObject에 담아두자. 이는 싱글톤이라는 기법을 사용하는 배경이 된다.
원본 코드에서는 SetWindowLongPtrW() 함수와 GetWindowsLongW() 함수를 이용해 미리 할당된 프로세스의 유저 공간(애플리케이션 개발자가 자유롭게 프로세스 관련 정보를 기록할 수 있는 소량의 공간)에 DempApp 클래스(현재 메인 클래스)의 객체 포인터를 저장해주고 있다.
64Bit 개발 환경에서는 이 두 함수에 버그가 있다. 이는 개발자들 사이에 잘 알려진 버그로서 DirectX 외적인 버그이다.
굳이 이 함수들을(SetWindowLongPtrW(), GetWindowsLongW()) 쓸 필요가 없으며 여기에 넣으려는 작고 중요한 정보를 기록하는 방법은 많이 있다. 해당 변경 사항은 그중 한 가지 방법으로 바꾼 것이다.
결과물 확인
만들고 나면 아래와 같은 격자 모양과 사각형이 보인다. 창의 프레임을 움직여서 창 크기를 바꿔보면 알겠지만 격자와 사각형의 움직임이 매우 부드럽다.
기본 GDI를 활용한 WinAPI 애플리케이션도 상당히 부드럽지만, 이 정도까지 부드러움을 주진 않는다. 실제로 DirectX의 처리속도가 얼마나 빠른지를 느낄 수 있는 점이다.
해당 코드는 Github 등으로 소스 공유하지 않는다.
이미 위의 MSDN 링크에 가보면 긁어 붙일 수 있도록 대부분의 코드가 있으며, 그렇게라도 본인이 직접 만들어봐야 그것을 다음 과정의 기반으로 삼을 수 있어 보이기 때문.