WM_COMMAND

인수

LOWORD(wParam) : 통지 메시지를 보낸 항목의 ID이다. 메뉴의 ID, 액셀러레이터의 ID 또는 컨트롤의 ID가 전달된다.

HIWORD(wParam) : 컨트롤이 이 메시지를 보낼 때는 통지 코드가 전달된다. 통지 코드의 종류는 에디트, 리스트 박스 등의 컨트롤에 따라 다양하다. 메뉴 항목이 선택된 경우 이 값은 0이며 액셀러레이터가 선택된 경우 이 값은 1이다.

lParam : 통지 메시지를 보낸 컨트롤의 윈도우 핸들이 전달된다. 메뉴나 액셀러레이터로부터 이 메시지가 전달된 경우 이 값은 NULL이다.

설명

메뉴, 액셀러레이터를 선택했을 때 이 메시지가 전달되며 차일드 컨트롤이 부모 윈도우로 통지 메시지를 전달할 때도 이 메시지 형태로 전달된다. 각종 컨트롤로부터 값이 전달되며 또한 각 컨트롤은 다양한 통지 메시지를 보내므로 이 메시지는 일반적으로 다음과 같은 이중 switch문으로 작성된다.

switch (LOWORD(wParam)) { 
case ID: 
	switch (HIWORD(wParam)) 
	case code: ........ 

컨트롤(또는 메뉴 항목의 ID)에 따라 먼저 분기를 하고 통지 메시지 별로 다시 분기를 한다. 메뉴와 액셀러레이터는 보통 같은 명령에 대해 같은 ID로 한쌍이 정의되며 둘 중 어떤 항목을 선택하더라도 프로그램의 동작은 동일하다. 그러나 만약 이 둘을 굳이 구분하려면 HIWORD(wParam)값을 참조하면 된다. 메뉴 항목과 대응되는 액셀러레이터는 윈도우가 최소화되어 있을 때는 사용 금지되지만 메뉴 항목과 무관하게 단독으로 정의된 액셀러레이터는 최소화 상태에서도 전달된다.

리턴

이 메시지를 처리했으면 0을 리턴한다.

예제

예제 1

다음 예제는 메뉴, 액셀러레이터, 에디트 컨트롤로부터 전달되는 통지 메시지를 WM_COMMAND 메시지로 처리한다.

HWND hEdit;
#define ID_EDIT 0
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	char buf[128];

	switch(iMessage) {
	case WM_CREATE:
		hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
		return 0;
	case WM_COMMAND:
		switch(LOWORD(wParam)) {
		case IDM_ITEM1:
			if (HIWORD(wParam) == 0) {
				MessageBox(hWnd,"첫번째 메뉴 항목 선택","알림",MB_OK);
			} else {
				MessageBox(hWnd,"첫번째 액셀러레이터 선택","알림",MB_OK);
			}
			break;
		case IDM_ITEM2:
			MessageBox(hWnd,"두번째 메뉴 항목 선택","알림",MB_OK);
			break;
		case IDM_ITEM3:
			MessageBox(hWnd,"액셀러레이터 선택","알림",MB_OK);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		case ID_EDIT:
			switch(HIWORD(wParam)) {
			case EN_CHANGE:
				GetWindowText((HWND)lParam,buf,128);
				SetWindowText(hWnd,buf);
				break;
			}
			break;
		}
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

IDM_ITEM1, IDM_ITEM2는 메뉴와 액셀러레이터에 모두 정의되어 있으므로 메뉴 항목을 선택해서 명령을 내릴 수도 있고 액셀러레이터(Ctrl+1, Ctrl+2)를 선택해서 명령을 내릴 수도 있다. 이때 굳이 어떤 항목으로부터 명령이 전달되었는지를 구분하고자 한다면 HIWORD(wParam)값으로부터 조사할 수 있으다. IDM_ITEM1 항목은 액셀러레이터를 선택한 경우와 메뉴를 선택한 경우 각각 다른 메시지를 보여주도록 하였으며 IDM_ITEM2항목은 항상 같은 메시지를 보여준다. IDM_ITEM3은 메뉴에는 정의되어 있지 않고 액셀러레이터에만 정의되어 있으므로 액셀러레이터로만 명령을 내릴 수 있다. 이 명령은 메뉴 항목과 대응되어 있지 않으므로 윈도우가 최소화되어 있어도 명령을 내릴 수 있다.

ID_EDIT컨트롤은 자신에게 변화가 있을 때 부모 윈도우에게 WM_COMMAND 메시지로 통지 메시지를 보내는데 이때 어떤 이유로 통지 메시지를 보냈는지는 HIWORD(wParam)으로 전달되는 통지 코드를 보면 알 수 있다. 이 예제의 경우 에디트의 텍스트가 변경되면 메인 윈도우의 타이틀 바 캡션도 변경하도록 하였다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr