SlideShare 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

What's hot

09 윈도우스타일
09 윈도우스타일09 윈도우스타일
09 윈도우스타일
jaypi Ko
 
03 첫번째프로그램
03 첫번째프로그램03 첫번째프로그램
03 첫번째프로그램
jaypi Ko
 
Cours CSS feuilles de style en cascade- mars 2015
Cours CSS feuilles de style en cascade- mars 2015Cours CSS feuilles de style en cascade- mars 2015
Cours CSS feuilles de style en cascade- mars 2015
Abdoulaye Dieng
 
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specificationImplementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
Neeraj Kaushik
 
types of events in JS
types of events in JS types of events in JS
types of events in JS
chauhankapil
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
chomas kandar
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
JavaScript - Chapter 11 - Events
 JavaScript - Chapter 11 - Events  JavaScript - Chapter 11 - Events
JavaScript - Chapter 11 - Events
WebStackAcademy
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기OnGameServer
 
JavaScript: Events Handling
JavaScript: Events HandlingJavaScript: Events Handling
JavaScript: Events Handling
Yuriy Bezgachnyuk
 
Introduction to the DOM
Introduction to the DOMIntroduction to the DOM
Introduction to the DOM
tharaa abu ashour
 
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
The innerHTML Apocalypse
The innerHTML ApocalypseThe innerHTML Apocalypse
The innerHTML Apocalypse
Mario Heiderich
 
Excel shortcut and function keys hindi notes
Excel shortcut and function keys hindi notesExcel shortcut and function keys hindi notes
Excel shortcut and function keys hindi notes
SirajRock
 
Pros & cons of svelte
Pros & cons of sveltePros & cons of svelte
Pros & cons of svelte
ElenorWisozk
 
DNS exfiltration using sqlmap
DNS exfiltration using sqlmapDNS exfiltration using sqlmap
DNS exfiltration using sqlmap
Miroslav Stampar
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
Aziz Darouichi
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
ENSET, Université Hassan II Casablanca
 
OWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript ApplicationsOWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript Applications
Lewis Ardern
 

What's hot (20)

09 윈도우스타일
09 윈도우스타일09 윈도우스타일
09 윈도우스타일
 
03 첫번째프로그램
03 첫번째프로그램03 첫번째프로그램
03 첫번째프로그램
 
Cours CSS feuilles de style en cascade- mars 2015
Cours CSS feuilles de style en cascade- mars 2015Cours CSS feuilles de style en cascade- mars 2015
Cours CSS feuilles de style en cascade- mars 2015
 
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specificationImplementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
Implementation of fix messages for fix 5.0 sp2 and fixt1.1 specification
 
types of events in JS
types of events in JS types of events in JS
types of events in JS
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
 
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
(C#, WPF강좌)WPF, XAML 데이터바인딩이란? Data Binding 개요 및 예제_WPF학원/WPF교육
 
JavaScript - Chapter 11 - Events
 JavaScript - Chapter 11 - Events  JavaScript - Chapter 11 - Events
JavaScript - Chapter 11 - Events
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
JavaScript: Events Handling
JavaScript: Events HandlingJavaScript: Events Handling
JavaScript: Events Handling
 
Introduction to the DOM
Introduction to the DOMIntroduction to the DOM
Introduction to the DOM
 
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
(WPF교육,WPF강좌)WPF이벤트라우팅, 버블링이벤트, 터널링이벤트, 다이렉트이벤트_W
 
The innerHTML Apocalypse
The innerHTML ApocalypseThe innerHTML Apocalypse
The innerHTML Apocalypse
 
Excel shortcut and function keys hindi notes
Excel shortcut and function keys hindi notesExcel shortcut and function keys hindi notes
Excel shortcut and function keys hindi notes
 
Pros & cons of svelte
Pros & cons of sveltePros & cons of svelte
Pros & cons of svelte
 
DNS exfiltration using sqlmap
DNS exfiltration using sqlmapDNS exfiltration using sqlmap
DNS exfiltration using sqlmap
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
OWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript ApplicationsOWASP SF - Reviewing Modern JavaScript Applications
OWASP SF - Reviewing Modern JavaScript Applications
 

More from jaypi Ko

CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic ModelCVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
jaypi Ko
 
개념 이해가 쉬운 Variational Autoencoder (VAE)
개념 이해가 쉬운 Variational Autoencoder (VAE)개념 이해가 쉬운 Variational Autoencoder (VAE)
개념 이해가 쉬운 Variational Autoencoder (VAE)
jaypi Ko
 
[신경망기초]오류역전파알고리즘구현
[신경망기초]오류역전파알고리즘구현[신경망기초]오류역전파알고리즘구현
[신경망기초]오류역전파알고리즘구현
jaypi Ko
 
파이썬설치
파이썬설치파이썬설치
파이썬설치
jaypi Ko
 
객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것
jaypi Ko
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
jaypi Ko
 
C언어 연산자에 대해 간과한 것
C언어 연산자에 대해 간과한 것C언어 연산자에 대해 간과한 것
C언어 연산자에 대해 간과한 것
jaypi Ko
 
[확률통계]04모수추정
[확률통계]04모수추정[확률통계]04모수추정
[확률통계]04모수추정
jaypi Ko
 
MFC 프로젝트 시작하기
MFC 프로젝트 시작하기MFC 프로젝트 시작하기
MFC 프로젝트 시작하기
jaypi Ko
 
01 윈도우프로그램 들어가기
01 윈도우프로그램 들어가기01 윈도우프로그램 들어가기
01 윈도우프로그램 들어가기
jaypi Ko
 
[신경망기초] 신경망학습
[신경망기초] 신경망학습[신경망기초] 신경망학습
[신경망기초] 신경망학습
jaypi Ko
 
[신경망기초] 합성곱신경망
[신경망기초] 합성곱신경망[신경망기초] 합성곱신경망
[신경망기초] 합성곱신경망
jaypi Ko
 
[신경망기초] 퍼셉트론구현
[신경망기초] 퍼셉트론구현[신경망기초] 퍼셉트론구현
[신경망기초] 퍼셉트론구현
jaypi Ko
 
interface
interfaceinterface
interface
jaypi Ko
 
com architecture
com architecturecom architecture
com architecture
jaypi Ko
 
[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석
jaypi Ko
 
[신경망기초] 심층신경망개요
[신경망기초] 심층신경망개요[신경망기초] 심층신경망개요
[신경망기초] 심층신경망개요
jaypi Ko
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석
jaypi Ko
 
[신경망기초] 오류역전파알고리즘
[신경망기초] 오류역전파알고리즘[신경망기초] 오류역전파알고리즘
[신경망기초] 오류역전파알고리즘
jaypi Ko
 
[신경망기초] 멀티레이어퍼셉트론
[신경망기초] 멀티레이어퍼셉트론[신경망기초] 멀티레이어퍼셉트론
[신경망기초] 멀티레이어퍼셉트론
jaypi Ko
 

More from jaypi Ko (20)

CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic ModelCVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
 
개념 이해가 쉬운 Variational Autoencoder (VAE)
개념 이해가 쉬운 Variational Autoencoder (VAE)개념 이해가 쉬운 Variational Autoencoder (VAE)
개념 이해가 쉬운 Variational Autoencoder (VAE)
 
[신경망기초]오류역전파알고리즘구현
[신경망기초]오류역전파알고리즘구현[신경망기초]오류역전파알고리즘구현
[신경망기초]오류역전파알고리즘구현
 
파이썬설치
파이썬설치파이썬설치
파이썬설치
 
객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것객체지향 단어가 의미하는 것
객체지향 단어가 의미하는 것
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
C언어 연산자에 대해 간과한 것
C언어 연산자에 대해 간과한 것C언어 연산자에 대해 간과한 것
C언어 연산자에 대해 간과한 것
 
[확률통계]04모수추정
[확률통계]04모수추정[확률통계]04모수추정
[확률통계]04모수추정
 
MFC 프로젝트 시작하기
MFC 프로젝트 시작하기MFC 프로젝트 시작하기
MFC 프로젝트 시작하기
 
01 윈도우프로그램 들어가기
01 윈도우프로그램 들어가기01 윈도우프로그램 들어가기
01 윈도우프로그램 들어가기
 
[신경망기초] 신경망학습
[신경망기초] 신경망학습[신경망기초] 신경망학습
[신경망기초] 신경망학습
 
[신경망기초] 합성곱신경망
[신경망기초] 합성곱신경망[신경망기초] 합성곱신경망
[신경망기초] 합성곱신경망
 
[신경망기초] 퍼셉트론구현
[신경망기초] 퍼셉트론구현[신경망기초] 퍼셉트론구현
[신경망기초] 퍼셉트론구현
 
interface
interfaceinterface
interface
 
com architecture
com architecturecom architecture
com architecture
 
[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석
 
[신경망기초] 심층신경망개요
[신경망기초] 심층신경망개요[신경망기초] 심층신경망개요
[신경망기초] 심층신경망개요
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석
 
[신경망기초] 오류역전파알고리즘
[신경망기초] 오류역전파알고리즘[신경망기초] 오류역전파알고리즘
[신경망기초] 오류역전파알고리즘
 
[신경망기초] 멀티레이어퍼셉트론
[신경망기초] 멀티레이어퍼셉트론[신경망기초] 멀티레이어퍼셉트론
[신경망기초] 멀티레이어퍼셉트론
 

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 메시지에서 처리 정리하면