DialogBox

원형 int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc );
MFC 원형 virtual int CDialong::DoModal( );
인수

▶hInstance : 대화상자 템플리트를 가진 인스턴스 핸들. 이 함수를 호출하는 프로세스에 리소스가 정의되어 있으면 WinMain으로 전달된 hInstance값을 넘겨준다. 다른 DLL이나 실행 파일에 리스스가 있을 경우 해당 모듈의 인스턴스 핸들을 넘겨준다.

▶lpTemplate : 대화상자 템플리트의 ID이다. 널종료 문자열로 정의된 템플리트의 이름이거나 정수형의 ID이다. 만약 대화상자 템플리트가 정수형으로 정의되어 있을 경우 MAKEINTRESOURCE 매크로 함수로 ID를 지정해 준다.

▶hWndParent : 이 대화상자를 소유하는 오너 윈도우의 핸들이다. 이 핸들이 지정하는 윈도우는 모달 대화상자가 실행중인 동안에 사용 금지된다.

▶lpDialogFunc : 대화상자로 전달되는 메시지를 처리하는 메시지 처리 함수의 포인터를 지정한다. 이 함수는 반드시 다음과 같은 원형으로 선언되어야 한다.

BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

윈도우의 메시지를 처리하는 윈도우 프로시저와 동일한 원형을 가진다. 이 함수에서는 메시지를 처리했을 경우 TRUE를 리턴하며 메시지를 처리하지 않았으면 FALSE를 리턴한다. 단 예외적으로 WM_INITDIALOG 메시지의 리턴값은 어떤 컨트롤에 포커스를 줄 것인가를 지정한다. WM_INITDIALOG에서 SetFocus 함수로 특정 컨트롤에 포커스를 주었을 경우 TRUE를 리턴하며 그렇지 않을 경우 FALSE를 리턴하는데 이 경우 시스템은 탭 순서가 가장 빠른 컨트롤에게 포커스를 준다.

리턴 EndDialog 함수의 인수를 리턴하며 이 값은 대화상자의 결과값으로 사용된다. 에러 발생시 -1을 리턴한다.
설명

이 함수는 모달 대화상자를 실행한다. lpTemplate가 지정하는 대화상자를 생성하여 화면으로 출력하며(WS_VISIBLE 스타일이 없어도 화면에 보인다) 소유자 윈도우를 사용 금지시키고 lpDialogFunc 인수가 지정하는 메시지 처리 함수로 메시지를 보내주어 대화상자를 실행한다. 모달 대화상자는 EndDialog가 호출될 때까지 실행을 계속하며 이 함수는 대화상자가 완전히 종료되어야 리턴한다.

예제 1

다음 예제는 마우스 왼쪽 버튼을 누르면 간단한 소개 대화상자를 보여준다. 리소스에 대화상자 템플리트를 먼저 정의해야 하며 대화상자 프로시저에서는 WM_INITDIALOG, WM_COMMAND 메시지를 처리한다.

#include "resource.h"
BOOL CALLBACK DialogBoxProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage)
	{
	case WM_INITDIALOG:
		return TRUE;
	case WM_COMMAND:
		switch (wParam)
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg,0);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_LBUTTONDOWN:
		DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DialogBoxProc);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

예제 1

다음 예제는 대화상자 기반의 프로젝트이다. 별도의 메인 윈도우를 만들지 않고 DoModal 함수 호출만으로 모달 대화상자를 호출하여 이 대화상자가 곧 프로세스의 메인 윈도우가 된다. 간단한 형태의 프로젝트인 경우 이런 형태로 프로젝트를 작성할 수 있다. 그러나 대화상자 기반의 프로젝트는 윈도우 프로시저가 시스템 내부에 숨겨져 있기 때문에 여러 가지 제약 사항이 있으며 복잡한 형태의 프로젝트에는 적합하지 않다.

#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_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg,0);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

참고함수

EndDialog : 대화상자를 종료한다.

CreateDialog : 모델리스 대화상자를 생성한다.

DialogBoxParam, DialogBoxIndirect

플렛폼 95이상
참조  

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