Windows 프로그램을 하다 보면 Z order라는 말을 종종 접한다. 하지만, 그 의미가 무엇인지를 정확하게 아는 사람이 별로 없는 것 같아서 이렇게 소개한다.
"Z Order"는 어떤 창들이 다른 창들 뒤에 가려져야 하는지를 결정하는 방법이다. 좀더 자세하게 이야기하면 "A 윈도우의 Z Order"는 겹쳐서 쌓아 올려진 윈도우들 중에서 A 윈도우의 위치라고 할 수 있다.
![사용자 삽입 이미지](https://t1.daumcdn.net/tistoryfile/fs3/6_12_16_8_blog18337_attach_0_4.bmp?original)
우리가 보는 화면은 2차원적이다. 따라서 X축과 Y축으로 모든 것을 표현한다. 하지만 개념적으로 볼 때, 겹쳐진 윈도우들은 3차원적인 의미를 가지고 있다. 따라서 가상의 축(Imaginary Axis)을 하나 더 생각해야 한다. 이 측을 Z축이라고 하면 아래와 같이 표현될 것이다.
![사용자 삽입 이미지](https://t1.daumcdn.net/tistoryfile/fs2/6_12_16_8_blog18337_attach_0_3.bmp?original)
위 그림을 보면 알 수 있듯이 Z 축의 값이 겹쳐진 순서의 위치 임을 알 수 있다. 이것을 보면 왜 Z Order라는 용어를 사용하는 그 이유를 알 수 있을 것이다.
Windows는 기본적으로 Single List를 이용하여 Z Order를 관리한다. 그리고 Windows는 이 윈도우들이 topmost(top-level) 윈도우인지 또는 child 윈도우인지를 고려한 Z Order를 추가적으로 관리한다.
Topmost 윈도우들은 모든 non-topmost 윈도우들보다 더 위쪽에 출력된다. 이때, non-topmost 윈도우가 활성화되어 있다든지 가장 앞쪽에 있다는 것과 같은 상황은 무시된다. 이런 Topmost 윈도우들은 자신의 확장속성에 WS_EX_TOPMOST라는 속성을 가지고 있다. 그리고 child 윈도우들은 그것의 Parent 윈도우의 Z Order에 의해서 그룹 지어진다.
응용 프로그램에서 새로운 윈도우를 하나 생성시키면 Windows 시스템은 동일한 형태(topmost이든지 non-topmost)의 윈도우들이 가지는 Z Order에서 가장 위쪽의 값을 부여한다. 그리고 동일한 형태의 윈도우들간에 Z Order를 가장 높이고 싶다면 BringWindowToTop이라는 함수를 이용하면 된다.
SetWindowPos 와 DeferWindowPos 함수를 이용하여 윈도우의 Z Order를 재정렬 할 수도 있다.