4. 4
PostQuitMessage 함수 때문에 “나죽네” 출력 후 프로그램 종료
그럼 검은색 윈도우는 어떻게 되나? 프로그램은 종료되었는데
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
case WM_DESTROY :
MessageBox(hWnd, "나죽네", "", MB_OK);
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
흰색 윈도우의 파괴버튼 눌렀을 때
자동으로 파괴될 것 같기도 하고… 잘 모르겠다
5. 5
검은 윈도우도 사라진다
하지만 “나죽어?” 대화상자는 안 나온다
그래서, 명시적으로 파괴하는 것이 좋다
BOOL DestroyWindow(HWND hWnd)
윈도우 파괴
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
case WM_DESTROY :
MessageBox(hWnd, "나죽네", "", MB_OK);
DestroyWindow(_hWnd2);
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
전역변수이기에 가능
검은 윈도우의 파괴에 대한 메시지 박스 문구
6. 6
윈도우간의 부모 자식 관계
검은색 윈도우를 흰색 윈도우의 자식 윈도우로 설정
윈도우간의 서열관계 형성
부모 윈도우를 황제라고 생각,
황제가 죽으면 신하들도 매장
내가 죽을 것 같으면 너부터 죽이고 나서 죽을래
프로그래머가 신경 쓰지 않아도 운영체제가 알아서 처리 해줌
8. 8
_hWnd2 = CreateWindow(
"WND2",
"WORLD",
WS_OVERLAPPEDWINDOW,
320, 0, 320, 240,
hWnd,NULL, hInstance, NULL
);
윈도우 초기 위치 및 크기
LRESULT CALLBACK WndProc2(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{ switch(mesg)
{
case WM_DESTROY:
MessageBox(hWnd, "나죽어?", "", MB_OK);
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
자식 윈도우가 파괴될 때 프로그램까지 죽을 필요는 없으니까
자식 윈도우 프로시저의 PostQuitMessage 함수 호출은 생략
9. 9
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
case WM_DESTROY:
MessageBox(hWnd, "나죽네", "", MB_OK);
DestroyWindow(_hWnd2);
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
자식 윈도우의 WM_DESTROY 먼저 처리
그래서 화면에 메시지 박스 나오는 순서는
진짜 자동으로 자식 윈도우 파괴해 주는구나
10. 10
자식 윈도우는
자식 윈도우는 부모 윈도우의 필요에 의해 생성하는 것이므로
부모 윈도우 프로시저에서 사용할 터
부모 윈도우 프로시저에서 생성한다
그런데 프로시저 어디에 코드를 넣나 ?
11. 11
부모 윈도우가 생성 될 때
어디서 ?
무슨 이벤트 일 때 생성 ?
부모 윈도우가 생성 될 때 발생하는 메시지
WM_CREATE
응애응애~
12. 12
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
HWND hWnd2;
switch(mesg)
{
case WM_CREATE:
hWnd2 = CreateWindow(
"WND2",
"World",
WS_OVERLAPPEDWINDOW,
320, 0, 320, 240,
hWnd, NULL,
hInstance,
NULL
);
ShowWindow(hWnd2, SW_SHOW);
break;
}
}
지역변수로 선언
부모 윈도우 프로시저니까
부모 윈도우 핸들
여기서 에러, 원래 WinMain 파라미터
hWnd 윈도우가 만들어 질 때
발생하는 이벤트
14. 14
부모 윈도우 프로시저에 다음 코드를 넣고 테스트
WndProc(…)
{
switch(mesg)
{
case WM_CREATE:
hWnd2 = CreateWindow(…, _hInstance, …);
break;
case WM_LBUTTONDOWN:
SetWindowText(hWnd2, "Black");
break;
…
}
}
자식 윈도우 타이틀이 Black 으로 바뀌지 않는다
왜 그럴까 ?
15. 15
WndProc 도
이벤트가 발생할 때 마다 호출되는 함수
WM_CREATE로 호출되었을 때 선언된 지역변수는
WM_LBUTTONDOWN로 호출될 때 다시 할당된다
HWND hWnd2
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg)
{
case WM_CREATE:
hWnd2 = CreateWindow(…)
}
…
}
프로그램 수행 중에
메모리가 유지되도록
얘도 그냥 함수래
16. 16
윈도우 두 개 이상 생성할 때
상황에 맞게 부모-자식 관계 생성
자식 윈도우 생성은 부모 윈도우
프로시저의
WM_CREATE 메시지에서 처리
정리하면