WM_NEXTDLGCTL

인수

wParam : 다음 포커스를 옮길 컨트롤을 지정한다. lParam이 TRUE일 경우 포커스를 받을 컨트롤의 핸들값을 지정하며 lParam이 FALSE일 경우 이전, 또는 다음 컨트롤을 지정한다. wParam이 0이면 다음 컨트롤로 포커스가 이동되며 0이외의 값이면 이전 컨트롤로 포커스를 이동한다. 포커스를 받을 컨트롤은 WS_TABSTOP 스타일을 가지고 있어야 한다.

lParam : 포커스를 이동시킬 방법을 지정한다. 이 값이 TRUE이면 wParam은 포커스를 받을 윈도우 핸들을 가리키며 FALSE이면 wParam값에 따라 이전/다음 컨트롤로 포커스를 옮긴다.

설명

대화상자 컨트롤의 포커스를 이동시킨다. 어떤 컨트롤이 다음 포커스를 받을 것인가는 wParam와 lParam값에 따라 달라진다. 만약 포커스를 받을 컨트롤의 핸들을 알고 있다면 lParam에 TRUE를 주고 wParam에 컨트롤의 핸들값을 전달하면 된다. 현재 포커스를 가진 컨트롤의 이전 또는 다음 컨트롤로 이동하려면 lParam에 FALSE를 주고 wParam으로 이전(0이외) 또는 다음(0)을 지정한다.

이 메시지는 SetFocus로 단순히 입력 포커스를 옮기는 것보다 훨씬 더 많은 일을 한다. 새로 포커스를 받은 컨트롤이 디폴트 버튼일 경우 경계선을 두껍게 바꾸고 에디트 컨트롤이면 텍스트를 선택해 준다. 다른 작업을 하던 중에 포커스를 변경하고자 한다면 SendMessage 함수로 이 메시지를 보내서는 안되며 반드시 PostMessage 함수로 메시지를 붙여야 한다.

리턴

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

예제

예제 1

다음 예제는 이 메시지로 포커스를 이동시킨다. 마우스 좌우 버튼을 누르면 포커스가 이동된다.

#include 
#include "resource.h"

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);
HINSTANCE g_hInst;
HWND hDlgMain;

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
	,LPSTR lpszCmdParam,int nCmdShow)
{
	g_hInst=hInstance;
	
	DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, MainDlgProc);
	
	return 0;
}

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_INITDIALOG:
		hDlgMain = hDlg;
		return TRUE;
	case WM_LBUTTONDOWN:
		PostMessage(hDlg,WM_NEXTDLGCTL,0,(LPARAM)FALSE);
		return 0;
	case WM_RBUTTONDOWN:
		PostMessage(hDlg,WM_NEXTDLGCTL,(WPARAM)GetDlgItem(hDlg,IDC_BUTTON3),
			(LPARAM)TRUE);
		return 0;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			EndDialog(hDlg,IDOK);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,IDCANCEL);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

왼쪽 버튼을 누르면 현재 포커스를 가진 컨트롤의 다음 컨트롤로 포커스를 이동시킨다. 오른쪽 버튼을 누르면 무조건 Button3으로 포커스를 이동시킨다.

플랫폼

95이상

참조

 


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