SlideShare a Scribd company logo
1 of 16
Download to read offline
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

03 첫번째프로그램
03 첫번째프로그램03 첫번째프로그램
03 첫번째프로그램jaypi Ko
 
07 윈도우 핸들
07 윈도우 핸들07 윈도우 핸들
07 윈도우 핸들jaypi Ko
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeurAbdelwahab Naji
 
Plsql
PlsqlPlsql
PlsqlAz Za
 
Applications Android - cours 3 : Android Studio (Outil de développement)
Applications Android - cours 3 : Android Studio (Outil de développement)Applications Android - cours 3 : Android Studio (Outil de développement)
Applications Android - cours 3 : Android Studio (Outil de développement)Ahmed-Chawki Chaouche
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java IntroductionMouna Torjmen
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeAmir Souissi
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptxYaminaGh1
 
Cours : les arbres Prof. KHALIFA MANSOURI
Cours : les arbres Prof. KHALIFA MANSOURI Cours : les arbres Prof. KHALIFA MANSOURI
Cours : les arbres Prof. KHALIFA MANSOURI Mansouri Khalifa
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To ClosureRobert Nyman
 

What's hot (20)

03 첫번째프로그램
03 첫번째프로그램03 첫번째프로그램
03 첫번째프로그램
 
07 윈도우 핸들
07 윈도우 핸들07 윈도우 핸들
07 윈도우 핸들
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeur
 
Plsql
PlsqlPlsql
Plsql
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
PL/SQL:les curseurs
PL/SQL:les curseursPL/SQL:les curseurs
PL/SQL:les curseurs
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Applications Android - cours 3 : Android Studio (Outil de développement)
Applications Android - cours 3 : Android Studio (Outil de développement)Applications Android - cours 3 : Android Studio (Outil de développement)
Applications Android - cours 3 : Android Studio (Outil de développement)
 
Examen 2011 exo 4
Examen 2011 exo 4Examen 2011 exo 4
Examen 2011 exo 4
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Svelte
SvelteSvelte
Svelte
 
Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)
 
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
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Plsql
PlsqlPlsql
Plsql
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptx
 
Cours : les arbres Prof. KHALIFA MANSOURI
Cours : les arbres Prof. KHALIFA MANSOURI Cours : les arbres Prof. KHALIFA MANSOURI
Cours : les arbres Prof. KHALIFA MANSOURI
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To Closure
 

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 Modeljaypi 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
 
com architecture
com architecturecom architecture
com architecturejaypi 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 메시지에서 처리 정리하면