티스토리 뷰
자식윈도우에서 발생한 이벤트는 부모 윈도우에 WM_COMMAND 메시지로 전달하고
wParam, lParam 에 정보도 같이 전달한다.
<메뉴 메시지와 컨트롤 메시지 구분 방법>
항목 |
자식윈도우 |
메뉴 |
LOWORD(wParam) |
자식윈도우ID |
메뉴ID |
HIWORD(wParam) |
이벤트 메시지 |
0 |
lParam |
윈도우 핸들 |
0 |
그래서, 자식윈도우ID와 메뉴ID가 같으면 안된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
CreateWindow(TEXT("button"), TEXT("버튼1"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)100, hInst, NULL);
CreateWindow(TEXT("button"), TEXT("버튼2"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 60, 100, 25, hWnd, (HMENU)200, hInst, NULL);
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 메뉴 선택을 구문 분석합니다.
switch (wmId)
{
case 100: // 컨트롤 ID
MessageBox(hWnd, TEXT("버튼1 클릭"), TEXT("Button"), MB_OK);
break;
case 200:
MessageBox(hWnd, TEXT("버튼2 클릭"), TEXT("Button"), MB_OK);
break; |
cs |
CreateWindow() 인수 중에 HMENU 변수는 메뉴 핸들값을 가지나 윈도우ID를 등록해서 메시지가 전달되면 어느 윈도우에서 보낸건지 ID구분자로 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 |
case WM_CREATE:
CreateWindow(TEXT("button"), TEXT("버튼1"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 20, 20, 100, 25, hWnd, (HMENU)100, hInst, NULL);
CreateWindow(TEXT("button"), TEXT("버튼2"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 20, 60, 100, 25, hWnd, (HMENU)200, hInst, NULL);
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 메뉴 선택을 구문 분석합니다.
switch (wmId)
{
case 100:
MessageBox(hWnd, TEXT("버튼1 이벤트"), TEXT("Button"), MB_OK);
switch (HIWORD(wParam))
{
case BN_CLICKED:
MessageBox(hWnd, TEXT("버튼1 클릭"), TEXT("Button"), MB_OK);
break;
case BN_SETFOCUS:
MessageBox(hWnd, TEXT("버튼1 포커스 얻음"), TEXT("Button"), MB_OK);
break;
}
break;
case 200:
MessageBox(hWnd, TEXT("버튼2 이벤트"), TEXT("Button"), MB_OK);
break; |
cs |
자식윈도우(컨트롤) 메시지는 HIWORD(wParam)로 이벤트 메시지 구분을 한다.