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