삽질의 현장/- 윈도우 API

#013_WIndow_API_부모와 자식이 함께해요_자식 프로세스

shovelman 2015. 9. 16. 16:12


안녕하세요 삽잡이입니다.

이번 시간에는 몇가지 윈도우를 함께 다뤄보는 시간을 가지려 합니다.


대부분의 윈도우에는 메시지 루프, Dispatcher, CreateWindow, Proc가 있습니다.

그렇다면 여러 윈도우를 생성할 때를 생각해보도록 하지요...

윈도우 생성을 할 때에는 CreateWindow를 사용합니다.

또한, Window 생성 시 반드시 윈도우 클래스 이름이 필요합니다.


어플리케이션에서 메인 윈도우는 어딜 가나 하나입니다.

그리고 나머지는 모두 메인 윈도우의 자식 윈도우들이라고 할 수 있습니다.

(참고로, 팝업 윈도우는 메인 윈도우의 영역을 벗어날 수 있는 자식 윈도우를 말합니다. 뜬금...)


어찌됬건, 메인 윈도우는 단 하나입니다.

또한, 자식 윈도우는 메인 윈도우보다 먼저 만들어질 수 없습니다.


자... 그럼 정리는 됬고, 우선 윈도우를 나누기 위해서는 어떻게 해야할까요?

메인 윈도우가 없이는 자식 윈도우들이 존재할 수 없기 때문에

메인 윈도우의 CREATE에서 자식 윈도우가 만들어 집니다.



이와 같이 윈도우 생성을 위해 

부모 윈도우 및 자식 윈도우들의 이름 및 각 프로시저들을 등록합니다.

프로시저는 메인 윈도우와 달라야합니다.

왜냐하면, 자식 윈도우가 하는일과 메인 윈도우가 하는 일이 다르기 때문입니다.

따라서, 프로시저를 공유하기에는 좀 그래서... 자식에게 맞는 프로시저를 만들고 등록을 합니다.

추가적으로 이 말을 통해, 프로시저를 교체할 수 있다는 사실을 알게 되었군요...


참고로, 자식 프로시저에는 WM_DESTROY 메시지는 쓰지 않습니다.

메인 윈도우가 소멸을 담당하지 자식은 소멸을 담당하지 않기 때문입니다.


아무튼... 말을 이어서 설명하자면,

부모 윈도우가 만들어진 다음에 자식 윈도우가 만들어져야 하기 때문에

WM_CREATE 메시지가 발생할 때

즉, 부모 윈도우가 생성된 뒤 호출 되는 WM_CREATE가 발생할 때 자식 윈도우를 생성합니다.



이처럼 말입니다... 

이 때 알아두면 좋을 사항들에 대해서 몇가지 생각해보고 지나가보도록 하겠습니다.


우선 WS_VISIBLE은 유용한, 활용 가능하다는 의미를 가지고 있습니다. 

뭐.. 결국은 '처음부터 표시되는 창을 만들겠다.'라는 뜻을 가지고 있습니다.

이어서 WS_CHILD는 '자식 창을 만들겠다'는 의미를 가지고 있습니다.


이 외에 좌표, 폭, 높이와 부모 윈도우 핸들 등이 필요합니다.

'(HMENU)1', '(HMENU)2'와 같은 매개변수는 '메뉴 또는 자식 윈도우 식별자'를 말하는데,

메뉴의 핸들이자 윈도우의 ID가 됩니다.


자... 이와 같은 과정을 거치게 되면 귀여운 자식 윈도우들을 생성할 수 있게 됩니다.

이 자식 윈도우를 위한 프로시저는,

자식 윈도우들 끼리의 행동에 의해 프로시저를 같이 둘지, 따로 둘지에 대해 고민할 필요성을 던져줍니다.


물론, 프로시저를 같이 사용한다고 하더라도,

자식 프로세스들의 윈도우 핸들과 ID가 다르기 때문에 따로 실행할 수 있습니다.

따라서, 프로시저를 따로 둘지, 공유할지에 대해서는 

어느 것이 더 효율적인지를 판단하여 결정하는 것이 좋습니다.


예를 들자면,

자식 프로세스들 끼리 공유하는 것이 없다면 프로시저를 따로 두는 것이 좋습니다.

각 윈도우들이 하는 일들이 다르다면, 메시지 처리가 전혀 다르다는 것을 말하는 것입니다.

따라서 윈도우 프로시저를 분류하는 것이 효율적이다는 것입니다.

코드의 양은 분명 늘어 날 수 있으나, 독립적으로 분리하는 것이 훨씬 효율적입니다.

코드의 양을 걱정하는 미련한 생각을 하지 마시길...


프로시저가 어떤 역할을 하는지, 자식 윈도우들끼리 어떤 역할을 필요로 하는지 이해를 한다면

쉽게 결정할 수 있지 않을까요...


 

이와 같이 독립적인 프로시저를 가지고 있는 두 개의 자식 윈도우에서 

똑같은 동작을 하도록 하려면 어떻게 해야할까요?

즉, Left 측에서 마우스를 클릭하면 

오른쪽에서도 같은 효과를 내려면 어떻게 할지에 대해서 생각해보자는 것입니다.


똑같은 동작을 하되 #define 을 사용하여 사용자 정의 메시지를 만들 수 있습니다.

Left 프로시저에서 Right 프로시저의 버튼을 호출하면 되는 것입니다.


SendMessage를 통해 접근할 수 있는데... 

만약, Left에서 Right프로시저의 LBUTTONDOWN 메시지를 보내고

Right에서 Left 프로시저의 LBUTTONDOWN 메시지를 호출하도록 한다면,

무한 루프에 빠지는 결과를 초래하게 됩니다.


따라서, 위에서 언급한 사용자 정의 메시지를 만들면 이 문제를 해결할 수 있습니다.



그리고 추가적으로, 




LBUTTONDOWN 메시지와 동일한 기능을 하는 

WM_MYMSG 사용자 정의 메시지를 메시지를 만드는 것입니다.



이처럼 윈도우 메시지에는 각각 값들이 정해져있습니다.

따라서 사용자 정의 메시지의 ID 값을 define으로 정의하게 될 때,

중복될 수 있는 위험이 있습니다.


따라서 윈도우에서는 WM_USER를 제공해줍니다.



이 값 이후로 부터 사용자 정의 메시지의 값을 입력할 수 있도록 해주는 것입니다.

그렇다면 위에서 보여드렸듯이 WM_USER+1 과 같이 값을 지정해 줄 수 있습니다.


지금까지 자식 윈도우의 프로세스에 관하여

즉, 윈도우 간의 관계에 대해서 알아봤습니다.


다음 시간에 뵙겠습니다!

이상 삽잡이였습니다!