WM_ACTIVATE

인수

LOWORD(wParam) : 윈도우가 활성화되었는지 비활성화 되었는지를 표현한다.

설명

WA_ACTIVE

마우스 클릭 이외의 방법으로 활성화되었다. SetActiveWindow 함수를 호출했거나 Alt+Tab, Alt+Esc 등의 키보드 단축키로 활성화했을 때 이 인수가 전달된다.

WA_CLICKACTIVE

마우스 클릭에 의해 활성화되었다.

WA_INACTIVE

비활성화되었다.

HIWORD(wParam) : 윈도우의 최소화 상태를 전달하며 최소화되어 있으면 0 이외의 값을 가진다.

lParam : 활성화 상태가 변경된 다른 윈도의 핸들이 전달된다. 이 윈도우가 활성화되었다면 lParam은 비활성화된 윈도우의 핸들이 전달되며 이 윈도우가 비활성화되었다면 새로 활성화된 윈도우의 핸들이 전달된다. 즉 lParam은 활성화 상태가 바뀐 상대편 윈도우의 핸들값이다. 상대편 윈도우가 없을 수도 있으며 이때는 NULL이 전달된다.

설명

어떤 시점에서 활성화 상태의 윈도우는 오직 하나만 존재할 수 있다. 활성화되어 있다는 것은 현재 사용자가 사용하고 있는 윈도우라는 뜻이다. 탑 레벨(오버랩드, 팝업)윈도우만 활성화 될 수 있으며 차일드 윈도우는 활성화될 수 없다. 활성화된 부모 윈도우에 속한 차일드 윈도우는 포커스를 가질 수 있다. 이 메시지는 윈도우의 활성화 상태가 변경될 때 보내지는데 새로 활성화되는 윈도우와 활성 상태를 잃는 윈도우에게 동시에 보내진다. 예를 들어 A윈도우가 활성화된 상태에서 사용자가 B윈도우를 선택했다면 A윈도우에게는 비활성화된다는 메시지가 전달되며 B윈도우에게는 새로 활성화 된다는 메시지가 전달된다.

두 윈도우가 같은 스레드에 소속되어 있으면 즉, 동일한 메시지 큐를 사용하고 있으면 메시지는 동기적으로 전달된다. 비활성화되는 윈도우에게 메시지가 먼저 전달되고 이 메시지가 처리된 후 활성화된 윈도우에게 메시지가 이어서 전달된다. 따라서 비활성화되는 윈도우가 이 메시지에 늦게 응답하면 활성화되는 윈도우도 그만큼 늦게 활성화된다. 두 윈도우가 다른 메시지 큐를 사용하고 있으면 이 메시지는 비동기적으로 전달되므로 비활성화되는 윈도우의 응답 여부에 상관없이 새로 활성화 되는 윈도우는 윈도우는 즉시 사용 가능한 상태가 된다.

DefWindowProc은 최소화되지 않은 윈도우가 활성화될 때 키보드 포커스를 전달한다. 사용자가 마우스로 윈도우를 클릭하여 활성화했다면 WM_MOUSEACTIVATE 메시지가 먼저 전달되고 이 메시지의 응답 결과에 따라 활성화 여부가 결정된다.

리턴

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

예제

예제 1

다음 예제는 세 개의 팝업 윈도우를 가지는데 각 팝업은 활성화 상태일 때 파란색이 되며 비활성화 상태일 때는 빨간색이 된다. 각 팝업 윈도우는 자신의 배경 색상을 여분 메모리에 저장한다.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("WM_ACTIVATE");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
	  ,LPSTR lpszCmdParam,int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst=hInstance;
	
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=4;
	WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=(WNDPROC)WndProc;
	WndClass.lpszClassName=lpszClass;
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hbrBackground=NULL;
	WndClass.lpfnWndProc=(WNDPROC)ChildProc;
	WndClass.lpszClassName="ChildCls";
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	RegisterClass(&WndClass);

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		10,210,590,100,
		NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	hWndMain=hWnd;
	
	while(GetMessage(&Message,0,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR Mes[]="세 개의 팝업 윈도우가 있습니다. 각각을 선택해 봐";

	switch(iMessage) {
	case WM_CREATE:
		CreateWindow("ChildCls","팝업1",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			10,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		CreateWindow("ChildCls","팝업2",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			210,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		CreateWindow("ChildCls","팝업3",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			410,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT crt;
	HBRUSH hBrush,OldBrush;
	COLORREF back;

	switch(iMessage) {
	case WM_ACTIVATE:
		if (LOWORD(wParam) == WA_INACTIVE) {
			back=RGB(255,0,0);
		} else {
			back=RGB(0,0,255);
		}
		SetWindowLong(hWnd,0,(LONG)back);
		InvalidateRect(hWnd,NULL,FALSE);
		return 0;
	case WM_PAINT:
		GetClientRect(hWnd,&crt);
		hdc=BeginPaint(hWnd, &ps);
		back=GetWindowLong(hWnd,0);
		hBrush=CreateSolidBrush(back);
		OldBrush=(HBRUSH)SelectObject(hdc,hBrush);
		Rectangle(hdc,0,0,crt.right,crt.bottom);
		DeleteObject(SelectObject(hdc,OldBrush));
		EndPaint(hWnd, &ps);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

팝업 윈도우가 WM_ACTIVATE 메시지를 받았을 때 활성화 여부에 따라 배경 색상을 변경하도록 하였다.

 

플랫폼

95이상

참조

WM_ACTIVATEAPP


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