3D 그래픽을 화면에 나타내기 전에 만들어야 할 일이 있다. 바로 '창(window)'를 만드는 것이다. 예를 들어 응용 프로그램의 주된 창(main window)과 메뉴, 도구 모음, 스크롤바, 버튼 등등은 모두 창이다.
일반적으로 Windows 응용 프로그램은 아무 일도 하지 않고 어떤 '사건(event)'이 일어나길 기다린다. 사건을 발생시키는 경우는, 예를 들어 사용자가 키를 누르거나, 마우스 클릭, 창이 생성되거나, 창의 크기가 변하거나 등등이 있다. 사건이 발생하면 Windows는 그 사건의 대상이 되는 응용 프로그램에서 메시지(message)를 보낸다. 그 메시지는 응용 프로그램의 메시지 대기열(message queue)에 추가된다. 응용 프로그램은 메시지 루프(message loop)를 돌리면서 메시지가 새로 도착했는지를 계속 점검한다. 도착한 메시지가 있으면 메시지의 수신 대상인 창의 창 프로시저(window precedure)에 그 메시지를 보낸다. 이러한 작업을 메시지 배분(dispatch)이라 부른다. 특정한 메시지에 반응해서 실행할 코드는 개발자가 구현해야 한다. 예를 들어, ESC로 창을 파괴하는 코드는 다음과 같이 만들면 된다. 이는 창 프로시저 안에 적어야 한다.
case WM_KEYDOWN:
if(wParam == VK_ESCAPE)
DestroyWindow(ghMainWnd);
return 0;
만약 현재 창 프로시저가 메시지를 직접 처리하지 않는다면, 기본 창 프로시저로 전달해서 반드시 처리해야 한다. DefWindowProc 함수가 그 역할을 한다.
GUI(Graphical User Interface, 그래픽 사용자 인터페이스)는 창 메뉴, 버튼과 같이 사용자가 원하는 작업을 할 수 있게 해주는 인터페이스이다.