ݺߣ

ݺߣShare a Scribd company logo
CHAP. 8
부모윈도우와 자식윈도우
1
2
이전 프로그램 실행 테스트
6장의 프로그램에서
각 윈도우의 윈도우 파괴버튼을 눌러보면
어떻게 되나 ?
코드는 다음과 같다
3
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);
}
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);
}
흰색 배경 윈도우
검은색 배경 윈도우
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
검은 윈도우도 사라진다
하지만 “나죽어?” 대화상자는 안 나온다
그래서, 명시적으로 파괴하는 것이 좋다
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
윈도우간의 부모 자식 관계
검은색 윈도우를 흰색 윈도우의 자식 윈도우로 설정
윈도우간의 서열관계 형성
부모 윈도우를 황제라고 생각,
황제가 죽으면 신하들도 매장
내가 죽을 것 같으면 너부터 죽이고 나서 죽을래
프로그래머가 신경 쓰지 않아도 운영체제가 알아서 처리 해줌
7
CreateWindow(…,HWND hParent,…)
자식 윈도우 생성
윈도우 생성 함수: 8번째 인자
여기에 들어가는 윈도우가
만들어 지는 윈도우의 부모 윈도우로 설정
NULL이면 부모 윈도우는 바탕화면
얘도 윈도우다
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
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
자식 윈도우는
자식 윈도우는 부모 윈도우의 필요에 의해 생성하는 것이므로
부모 윈도우 프로시저에서 사용할 터
부모 윈도우 프로시저에서 생성한다
그런데 프로시저 어디에 코드를 넣나 ?
11
부모 윈도우가 생성 될 때
어디서 ?
무슨 이벤트 일 때 생성 ?
부모 윈도우가 생성 될 때 발생하는 메시지
WM_CREATE
응애응애~
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 윈도우가 만들어 질 때
발생하는 이벤트
13
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
HWND _hWnd2;
HINSTANCE _hInstance;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpszArg, int nCmdShow)
{
…
if(!RegisterClass(&WndClass)) return NULL;
_hInstance = hInstance;
…
}
전역변수 _hWnd2 생략
_hInstance 전역변수 선언 (추후 지역변수 가능)
14
부모 윈도우 프로시저에 다음 코드를 넣고 테스트
WndProc(…)
{
switch(mesg)
{
case WM_CREATE:
hWnd2 = CreateWindow(…, _hInstance, …);
break;
case WM_LBUTTONDOWN:
SetWindowText(hWnd2, "Black");
break;
…
}
}
자식 윈도우 타이틀이 Black 으로 바뀌지 않는다
왜 그럴까 ?
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
윈도우 두 개 이상 생성할 때
상황에 맞게 부모-자식 관계 생성
자식 윈도우 생성은 부모 윈도우
프로시저의
WM_CREATE 메시지에서 처리
정리하면

More Related Content

08 부모윈도우 자식윈도우

  • 2. 2 이전 프로그램 실행 테스트 6장의 프로그램에서 각 윈도우의 윈도우 파괴버튼을 눌러보면 어떻게 되나 ? 코드는 다음과 같다
  • 3. 3 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); } 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); } 흰색 배경 윈도우 검은색 배경 윈도우
  • 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 윈도우간의 부모 자식 관계 검은색 윈도우를 흰색 윈도우의 자식 윈도우로 설정 윈도우간의 서열관계 형성 부모 윈도우를 황제라고 생각, 황제가 죽으면 신하들도 매장 내가 죽을 것 같으면 너부터 죽이고 나서 죽을래 프로그래머가 신경 쓰지 않아도 운영체제가 알아서 처리 해줌
  • 7. 7 CreateWindow(…,HWND hParent,…) 자식 윈도우 생성 윈도우 생성 함수: 8번째 인자 여기에 들어가는 윈도우가 만들어 지는 윈도우의 부모 윈도우로 설정 NULL이면 부모 윈도우는 바탕화면 얘도 윈도우다
  • 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 윈도우가 만들어 질 때 발생하는 이벤트
  • 13. 13 #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM); HWND _hWnd2; HINSTANCE _hInstance; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArg, int nCmdShow) { … if(!RegisterClass(&WndClass)) return NULL; _hInstance = hInstance; … } 전역변수 _hWnd2 생략 _hInstance 전역변수 선언 (추후 지역변수 가능)
  • 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 메시지에서 처리 정리하면