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 기억하기 쉬워서
윈도우 식별 번호 추출
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 스타일 없음