CreateDialog

원형 HWND CreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);
원형 해당 함수 없음
인수

▶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를 리턴하는데 이 경우 시스템은 탭 순서가 가장 빠른 컨트롤에게 포커스를 준다.

리턴 성공하면 생성한 윈도우의 핸들을 리턴하며 실패시 0을 리턴한다.
설명

lpTemplate 인수가 지정하는 템플리트로 대화상자를 생성하며 대화상자 프로시저로 WM_INITDIALOG메시지를 보내 초기화를 하도록 한다. 대화상자 템플리트가 WS_VISIBLE 스타일을 가지고 있으면 대화상자를 화면으로 출력하나 이 스타일이 없으면 ShowWindow 함수를 호출하기 전에는 대화상자가 보이지 않는다. 이 함수는 대화상자 생성 후 곧바로 대화상자 핸들을 리턴한다.

주로 모델리스 대화상자를 생성할 때 이 함수를 사용한다. 이 함수를 호출하기 전에 반드시 이 대화상자가 이미 생성되어 있는지를 점검해 보아야 한다. 메인 윈도우는 이 함수로 모델리스 대화상자를 생성한 후 메시지로 상호 작용을 하며 대화상자가 필요없을 때 DestroyWindow 함수로 대화상자를 파괴힌다.

예제 1

다음 예제는 메인 윈도우의 색상을 변경하는 모델리스 대화상자를 보여준다. 모델리스 대화상자이므로 이 대화상자를 열어 놓은 상태에서도 메인 윈도우를 사용할 수 있다. 마우스 왼쪽 버튼을 대화상자를 호출하며 오른쪽 버튼으로 대화상자를 닫는다.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("CreateDialog");
#include "resource.h"
HWND hDlg;
COLORREF cBack=RGB(255,255,255);

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=0;
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	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);

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	hWndMain=hWnd;
	
	while(GetMessage(&Message,0,0,0)) {
		if (!IsWindow(hDlg) || !IsDialogMessage(hDlg,&Message)) {
			TranslateMessage(&Message);
			DispatchMessage(&Message);
		}
	}
	return Message.wParam;
}

BOOL CALLBACK ColorDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_INITDIALOG:
		return TRUE;
	case WM_COMMAND:
		switch (wParam) {
		case IDC_RED:
			cBack=RGB(255,0,0);
			break;
		case IDC_GREEN:
			cBack=RGB(0,255,0);
			break;
		case IDC_BLUE:
			cBack=RGB(0,0,255);
			break;
		case IDC_YELLOW:
			cBack=RGB(255,255,0);
			break;
		case IDC_CLOSE:
			DestroyWindow(hDlg);
			hDlg=NULL;
			return TRUE;
		}
		InvalidateRect(hWndMain,NULL,FALSE);
		return TRUE;
	}
return FALSE;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="왼쪽 버튼 = 모델리스 대화상자 호출, 오른쪽 버튼 = 대화상자 닫음";
	RECT rt;
	HBRUSH brush,oldbrush;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		if (!IsWindow(hDlg)) {
			hDlg=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),
				hWnd,ColorDlgProc);
			ShowWindow(hDlg,SW_SHOW);
		}
		return 0;
	case WM_RBUTTONDOWN:
		if (IsWindow(hDlg)) {
			DestroyWindow(hDlg);
			hDlg=NULL;
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		GetClientRect(hWnd,&rt);
		brush=CreateSolidBrush(cBack);
		oldbrush=(HBRUSH)SelectObject(hdc,brush);
		FillRect(hdc,&rt,brush);
		DeleteObject(SelectObject(hdc,oldbrush));
		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));
}

메인 윈도우의 배경 색상값을 가지는 cBack과 모델리스 대화상자의 핸들을 가지는 hDlg가 전역 변수로 선언되어 있다. 모델리스 대화상자의 핸들은 반드시 전역 변수로 선언해야 한다. 대화상자를 생성할 때는 IsWindow 함수로 대화상자 핸들이 현재 유효한지를 반드시 점검해 보고 대화상자가 생성되어 있지 않을 때만 CreateDialog 함수를 호출해야 한다. 그렇지 않으면 두개의 모델리스 대화상자가 실행될 수도 있다.

대화상자 프로시저에서는 눌러진 버튼에 따라 전역 변수 cBack을 변경하고 InvalidateRect 함수를 호출하여 메인 윈도우를 다시 그리도록 한다. 만약 메인 윈도우에게 작업 지시를 하고자 한다면 사용자 정의 메시지를 사용해야 한다. 대화상자를 종료할 때는 반드시 DestroyWindow 함수로 대화상자 윈도우를 파괴해야 하며 EndDialog를 사용해서는 안된다.

모델리스 대화상자를 사용하는 프로그램의 메시지 루프에는 반드시 IsDialogMessage 함수를 포함하여 대화상자를 위한 메시지를 대화상자에게 보내 주어야 한다. 그렇지 않으면 Tab키 처리 등 기본적인 대화상자 기능이 제대로 수행되지 않는다.

참고함수 DialogBox : 모달 대화상자를 생성하고 실행한다.
플렛폼 95이상
참조  

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