비주얼 객체들이 동시에 나타나지 않는 문제
윈도우즈에서 드로잉은 순서대로 처리되지 않는다.
Most drawing carried out during processing of the WM_PAINT message is asynchronous;
Synchronous and Asynchronous Drawing
예를 들어 폼이 처음 나타날 때 대이터 그리드 뷰 두 개를 동시에 보이게 하려 한다. 컨스트럭터에서 순서대로 출력 메떠드를 호출해도 이 순서는 보장되지 않는다. 먼저 연산을 마친 게 먼저 출력된다.
컨스트럭터가 실행되는 동안 대이터 그리드 뷰는 아직 없으므로 이를 출력하는 wm_paint 메시지는 큐에 저장되어 대이터 그리드 뷰 핸들이 생길 때를 기다린다. 두 개의 핸들들이 순서대로 생기면 큐에서 꺼내 처리를 하는데 이때 순서가 바뀔 수 있는 거다.
윈도우즈는 모든 메시지를 동등하게 취급하지 않고 우선 순위를 부여한다. 드로잉의 순위는 낮다. 예를 들어 무언가를 그리려면 그 바탕이 되는 객체의 크기나 위치를 먼저 연산해야 하기 때문이다.
따라서 폼의 컨스트럭트에 드로잉 작업을 두는 건 좋지 않다. 폼 로드 이벤트에 두는 게 낫다.
폼 로드 이벤트는 폼 안의 객체들을 만들어 핸들을 지정한 뒤 출력하기 전에 작동한다. 폼 생성 > 자식 객체(핸들) 생성 > 드로잉 > 폼 출력의 순서로 진행한다. 따라서 드로잉 단계에서 비동기 처리로 순서가 바뀌었어도 폼이 나타날 때에는 드로잉이 모두 끝난 상태이므로 한꺼번에 보인다.