ݺߣ

ݺߣShare a Scribd company logo
CHAP. 10
컨트롤 윈도우
1
2
버튼 윈도우
동일한 기능인데 매번 윈도우 클래스 정의, 등록, 프로시저
구현 귀찮다
그래서 미리 다 만들어 두었다.
프로그래머는 윈도우 클래스 이름만 알면 생성 가능
대신, 메시지 처리 유형 세 가지가 추가된다
WM_LBUTTONDOWN, WM_LBUTTONUP에 대해
각각 윈도우 들어간 느낌, 튀어나온 느낌 표현 처리
이미 준비된 윈도우: 컨트롤윈도우
메시지 처리 유형 Ⅱ
유형 Ⅱ부터 컨트롤 윈도우 때문에 생긴 것
3
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hBtn1;
switch(mesg) {
case WM_CREATE:
hBtn1 = CreateWindow("BUTTON", "click",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
0,0,100,100,hWnd,NULL,_hInstance,NULL);
break;
} …
}
버튼 클래스 이름
버튼 윈도우의 클래스 이름: “button”
버튼 윈도우 스타일
button 클래스 정의 및 등록할 필요 없다
버튼 윈도우에 대한 프로시저도 구현할 필요 없다
윈도우 클래스 이름은 대소문자 구분 안 함
4
버튼 클릭 이벤트 처리
버튼을 클릭했을 때 메시지 박스 출력한다
문제는 버튼 윈도우에 대한
프로시저 소스코드가 없다는 것
5
컨트롤 윈도우에서 사건 발생하면
부모 윈도우가 처리
사건 발생 알림 메시지: WM_COMMAND
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hBtn1;
switch(mesg) {
case WM_CREATE: …;
case WM_COMMAND:
MessageBox(hWnd, "안녕하세요", "알림", MB_OK);
break;
} …
}
6
버튼 두 개 이상 일 때
두 개 생성하는 것은 문제 없다
클릭할 때 어느 버튼 윈도우인지 구분 필요
case WM_CREATE:
hBtn1 = CreateWindow("BUTTON", "click",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
0, 0,100,100, hWnd, NULL, _hInstance, NULL);
hBtn2 = CreateWindow("BUTTON", "click",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
100, 0,100,100, hWnd, NULL, _hInstance, NULL);
break;
7
사건발생 컨트롤 윈도우 구분
어디에서 사건이 발생하더라도 WM_COMMAND 발생하니까
이 메시지의 부가정보에 뭔가 있을 듯
메뉴항목 선택
컨트롤 윈도우에서 부모 윈도우에 알림 코드 보낼 때
단축키 눌렸을 때
WM_COMMAND 메시지 발생하는 세 가지 경우
int wNofifyCode = HIWORD(wParam)
int wID = LOWORD(wParam);
HWND hWndCtrl = (HWND)lParam;
WM_COMMAND 부가정보
Notification Code
8
윈도우 구분 정보 부여
CreateWindow(…, HMENU hMenu,…)
윈도우 생성 함수: 9번째 인자
윈도우를 생성할 때 윈도우의 식별 번호 할당
숫자 맘대로 지정하는데 HMENU로 타입 캐스팅 주의
9
case WM_CREATE:
hBtn1 = CreateWindow("BUTTON", ...
(HMENU)888,
_hInstance, NULL);
hBtn2 = CreateWindow("BUTTON“, ...
(HMENU)999,
_hInstance, NULL);
case WM_COMMAND:
id = LOWORD(wParam);
if (id == 888)
MessageBox(hWnd, "안녕하세요 ", "알림 ", MB_OK);
else if (id == 999)
MessageBox(hWnd, "홍길동입니다 ", "알림 ", MB_OK);
윈도우 식별 번호 부여
888, 999 기억하기 쉬워서
윈도우 식별 번호 추출
10
편집 윈도우 테스트
키보드에서 문자를 입력할 수 있는 컨트롤
11
편집 윈도우의 클래스 이름: “edit”
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hBtn1;
static HWND hEdt1;
switch(mesg) {
case WM_CREATE:
…
hEdt1 = CreateWindow("EDIT", "Hello",
WS_VISIBLE|WS_CHILD|WS_BORDER,
102, 0, 200, 100, hWnd, (HMENU)999,
_hInstance, NULL);
break;
편집 윈도우 클래스 이름
편집 창에 쓰여지는 문자열
윈도우 타이틀이 창에 출력되는 문자열
12
ES_AUTOHSCROLL 자동 수평 스크롤
ES_AUTOVSCROLL 자동 수직 스크롤
ES_MULTILINE 다중라인 지원
ES_NUMBER 숫자만 입력 설정
ES_READONLY 편집 불가능 설정
편집 윈도우만의 스타일
WS_VISIBLE|WS_CHILD|WS_BORDER|
ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE
13
편집 윈도우 연습
버튼 누르면, 편집 창의 내용이 하단에
출력되도록 구현
그냥 화면 출력으로 하면 줄 바뀜 처리
가 안돼요. 이상한 글자 들어 감
14
왼쪽과 같이 꼼수를 쓰면 쉽습니다
테두리, 또 다른 편집 윈도우를 의미
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hBtn1, hEdt1, hEdt2;
switch (mesg)
{
case WM_CREATE:
hBtn1 = CreateWindow("BUTTON","button",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
0, 0,100,100, hWnd,(HMENU)888, _hInstance, NULL);
hEdt1 = CreateWindow("EDIT", "Hello", WS_VISIBLE|WS_CHILD|
WS_BORDER|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE,
102, 0, 200,100, hWnd,(HMENU)999, _hInstance, NULL);
15
hEdt2 = CreateWindow("EDIT","",
WS_VISIBLE|WS_CHILD|
ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE,
0, 102, 302, 100, hWnd,(HMENU)777,_hInstance, NULL);
break;
case WM_COMMAND:
int id;
id = LOWORD(wParam);
if (id == 888)
{
char szMsg[1024];
GetWindowText(hEdt1, szMsg, 1024);
SetWindowText(hEdt2, szMsg);
}
break;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
버튼 윈도우에서 사건 발생하면
편집 윈도우 1에서 읽어서
편집 윈도우 2에 출력
WS_BORDER 스타일 없음

More Related Content

10 컨트롤윈도우

  • 2. 2 버튼 윈도우 동일한 기능인데 매번 윈도우 클래스 정의, 등록, 프로시저 구현 귀찮다 그래서 미리 다 만들어 두었다. 프로그래머는 윈도우 클래스 이름만 알면 생성 가능 대신, 메시지 처리 유형 세 가지가 추가된다 WM_LBUTTONDOWN, WM_LBUTTONUP에 대해 각각 윈도우 들어간 느낌, 튀어나온 느낌 표현 처리 이미 준비된 윈도우: 컨트롤윈도우 메시지 처리 유형 Ⅱ 유형 Ⅱ부터 컨트롤 윈도우 때문에 생긴 것
  • 3. 3 LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hBtn1; switch(mesg) { case WM_CREATE: hBtn1 = CreateWindow("BUTTON", "click", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 0,0,100,100,hWnd,NULL,_hInstance,NULL); break; } … } 버튼 클래스 이름 버튼 윈도우의 클래스 이름: “button” 버튼 윈도우 스타일 button 클래스 정의 및 등록할 필요 없다 버튼 윈도우에 대한 프로시저도 구현할 필요 없다 윈도우 클래스 이름은 대소문자 구분 안 함
  • 4. 4 버튼 클릭 이벤트 처리 버튼을 클릭했을 때 메시지 박스 출력한다 문제는 버튼 윈도우에 대한 프로시저 소스코드가 없다는 것
  • 5. 5 컨트롤 윈도우에서 사건 발생하면 부모 윈도우가 처리 사건 발생 알림 메시지: WM_COMMAND LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hBtn1; switch(mesg) { case WM_CREATE: …; case WM_COMMAND: MessageBox(hWnd, "안녕하세요", "알림", MB_OK); break; } … }
  • 6. 6 버튼 두 개 이상 일 때 두 개 생성하는 것은 문제 없다 클릭할 때 어느 버튼 윈도우인지 구분 필요 case WM_CREATE: hBtn1 = CreateWindow("BUTTON", "click", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 0, 0,100,100, hWnd, NULL, _hInstance, NULL); hBtn2 = CreateWindow("BUTTON", "click", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 100, 0,100,100, hWnd, NULL, _hInstance, NULL); break;
  • 7. 7 사건발생 컨트롤 윈도우 구분 어디에서 사건이 발생하더라도 WM_COMMAND 발생하니까 이 메시지의 부가정보에 뭔가 있을 듯 메뉴항목 선택 컨트롤 윈도우에서 부모 윈도우에 알림 코드 보낼 때 단축키 눌렸을 때 WM_COMMAND 메시지 발생하는 세 가지 경우 int wNofifyCode = HIWORD(wParam) int wID = LOWORD(wParam); HWND hWndCtrl = (HWND)lParam; WM_COMMAND 부가정보 Notification Code
  • 8. 8 윈도우 구분 정보 부여 CreateWindow(…, HMENU hMenu,…) 윈도우 생성 함수: 9번째 인자 윈도우를 생성할 때 윈도우의 식별 번호 할당 숫자 맘대로 지정하는데 HMENU로 타입 캐스팅 주의
  • 9. 9 case WM_CREATE: hBtn1 = CreateWindow("BUTTON", ... (HMENU)888, _hInstance, NULL); hBtn2 = CreateWindow("BUTTON“, ... (HMENU)999, _hInstance, NULL); case WM_COMMAND: id = LOWORD(wParam); if (id == 888) MessageBox(hWnd, "안녕하세요 ", "알림 ", MB_OK); else if (id == 999) MessageBox(hWnd, "홍길동입니다 ", "알림 ", MB_OK); 윈도우 식별 번호 부여 888, 999 기억하기 쉬워서 윈도우 식별 번호 추출
  • 10. 10 편집 윈도우 테스트 키보드에서 문자를 입력할 수 있는 컨트롤
  • 11. 11 편집 윈도우의 클래스 이름: “edit” LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hBtn1; static HWND hEdt1; switch(mesg) { case WM_CREATE: … hEdt1 = CreateWindow("EDIT", "Hello", WS_VISIBLE|WS_CHILD|WS_BORDER, 102, 0, 200, 100, hWnd, (HMENU)999, _hInstance, NULL); break; 편집 윈도우 클래스 이름 편집 창에 쓰여지는 문자열 윈도우 타이틀이 창에 출력되는 문자열
  • 12. 12 ES_AUTOHSCROLL 자동 수평 스크롤 ES_AUTOVSCROLL 자동 수직 스크롤 ES_MULTILINE 다중라인 지원 ES_NUMBER 숫자만 입력 설정 ES_READONLY 편집 불가능 설정 편집 윈도우만의 스타일 WS_VISIBLE|WS_CHILD|WS_BORDER| ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE
  • 13. 13 편집 윈도우 연습 버튼 누르면, 편집 창의 내용이 하단에 출력되도록 구현 그냥 화면 출력으로 하면 줄 바뀜 처리 가 안돼요. 이상한 글자 들어 감
  • 14. 14 왼쪽과 같이 꼼수를 쓰면 쉽습니다 테두리, 또 다른 편집 윈도우를 의미 LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hBtn1, hEdt1, hEdt2; switch (mesg) { case WM_CREATE: hBtn1 = CreateWindow("BUTTON","button", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 0, 0,100,100, hWnd,(HMENU)888, _hInstance, NULL); hEdt1 = CreateWindow("EDIT", "Hello", WS_VISIBLE|WS_CHILD| WS_BORDER|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE, 102, 0, 200,100, hWnd,(HMENU)999, _hInstance, NULL);
  • 15. 15 hEdt2 = CreateWindow("EDIT","", WS_VISIBLE|WS_CHILD| ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE, 0, 102, 302, 100, hWnd,(HMENU)777,_hInstance, NULL); break; case WM_COMMAND: int id; id = LOWORD(wParam); if (id == 888) { char szMsg[1024]; GetWindowText(hEdt1, szMsg, 1024); SetWindowText(hEdt2, szMsg); } break; case WM_DESTROY : PostQuitMessage(0); return FALSE; } return DefWindowProc(hWnd, mesg, wParam, lParam); } 버튼 윈도우에서 사건 발생하면 편집 윈도우 1에서 읽어서 편집 윈도우 2에 출력 WS_BORDER 스타일 없음