3. 3
실습
동일한 크기의 윈도우를 두 개 만들고,
부모 윈도우에서 마우스 움직이면
자식 윈도우의 동일한 위치에 X 표시
이때 부모 윈도우 프로시저에서는
마우스 움직임 이벤트만 처리하고,
X 표시는 자식 윈도우 프로시저에서 처리
그냥 부모 윈도우 프로시저에서 처리하면 간단한데
4. LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg) {
case WM_CREATE:
hWnd2 = CreateWindow("WND2", "자식윈도우 ",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
320,0,320,240, hWnd, NULL, _hInstance, NULL);
break;
case WM_MOUSEMOVE:
int x, y;
HDC hdc;
x = LOWORD(lParam);
y = HIWORD(lParam);
hdc = GetDC(hWnd2);
TextOut(hdc, x, y, "X", 1);
ReleaseDC(hWnd2, hdc);
break;
case WM_DESTROY: PostQuitMessage(0); return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
4
일단 자식 윈도우 만들고
부모 윈도우 프로시저에서 그냥 처리
자식 윈도우 핸들만 주의하만 돼
5. 5
LRESULT CALLBACK WndProc2(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
물론 자식 윈도우 프로시저에는 아무 처리 안 해
동작을 야기시키는 것은 부모에 있지만,
처리 내용은 자식 윈도우 프로시저에 있다
자식 윈도우에서 일어나는 일이니까 코드도 여기 넣어볼까
부모 윈도우가 자식 윈도우 프로시저에 적절한 메시지 날려
(자식 윈도우 프로시저 호출)
윈도우 프로시저는 프로그래머가 직접 호출 할 수 없는데
7. 7
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg) {
case WM_CREATE:
hWnd2 = CreateWindow("WND2", "자식윈도우 ",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
320,0,320,240, hWnd, NULL, _hInstance, NULL);
break;
case WM_MOUSEMOVE:
SendMessage(hWnd2, 2000, wParam, lParam);
break;
case WM_DESTROY: PostQuitMessage(0); return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
맘대로 정한 것
부모 윈도우에서 화면 출력 부분 제거
SendMessage 함수로 대치
부모 윈도우 프로시저
8. 8
LRESULT CALLBACK WndProc2(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg) {
case 2000:
int x, y;
HDC hdc;
x = LOWORD(lParam);
y = HIWORD(lParam);
hdc = GetDC(hWnd);
TextOut(hdc, x, y, "X", 1);
ReleaseDC(hWnd, hdc);
break;
case WM_DESTROY: PostQuitMessage(0); return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
메시지 번호로 2000 사용,
임의로 정한 것이지만 아무거나 하면 안돼요
실제로 1000으로 바꾸면 동작 안 해
자식 윈도우 프로시저
9. 9
사용자 메시지 정의
#define WM_MYMOVE WM_USER+1
윈도우가 사용하는 마지막 메시지 상수
사용자가 임의로 정한 이름
메시지를 정의할 때 마다 WM_USER에 적당한 숫자
더해서 정의
이제 2000 대신 WM_MYMOVE를 사용
10. 10
사용자 부가정보 활용
SendMessage(HWND hWnd, UINT Msg,
WPARAM wParam,LPARAM lParam)
이번엔 여기에 원하는 값 넣어보자
부모 윈도우에서 마우스 움직이면 이와는
직각 방향으로 자식 윈도우에 X 표시
(X 방향 움직임은 Y 방향으로, Y 방향 움직임은 X 방향으로)
물론 출력 단계에서 x, y를 뒤 바꾸면 간단하긴 하다
TextOut(hdc, x, y, "X", 1);
TextOut(hdc, y, x, "X", 1);
11. 11
WM_MOUSEMOVE: LPARAM lParam
031 16 15
X 좌표 값Y 좌표 값
SendMessage(hWnd2, WM_MYMOVE, wParam, lParam)
031 16 15
Y 좌표 값X 좌표 값
lParam 값을 다음과 같이 바꾸어야 한다
12. 12
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg) {
case WM_CREATE:
hWnd2 = CreateWindow("WND2", "자식윈도우 ",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
320,0,320,240, hWnd, NULL, _hInstance, NULL);
break;
case WM_MOUSEMOVE:
int x, y;
x = LOWORD(lParam);
y = HIWORD(lParam);
lParam = (x << 16) | y;
SendMessage(hWnd2, WM_MYMOVE, wParam, lParam);
break;
case WM_DESTROY: PostQuitMessage(0); return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
비트 연산
13. 13
윈도우 프로시저 간접 호출
PostMessage(HWND hWnd, UINT Msg,
WPARAM wParam,
LPARAM lParam
)
파라미터는 윈도우 프로시저와 같다
큐 상태에 따라 메시지 처리가 지연될 수 있다
SendMessage(HWND, UINT, WPARAM, LPARAM)
해당 윈도우 프로시저를 직접 호출하므로
메시지가 곧 바로 처리된다
14. 14
지금까지
윈도우 생성과 메시지 처리 유형 5가지를 모
두 살펴 보았습니다
이벤트 기반 프로그래밍이 머리 속에 들어왔습니까 ?
꼬집어서 설명할 수는 없지만
지금까지 학습한 개념으로 인터넷상의 유용한 자료
를 쉽게 여러분의 것으로 만들 수 있을 것입니다
http://www.winapi.co.kr/
http://www.codeguru.com/
http://www.codeproject.com/
http://hdi.kumoh.ac.kr/winapp
이상으로 Win32 API (with C)를 이용한 윈도우 프로그래밍 입문을 마칩니다
짝 짝 짝~