8-4 ¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ

À̹ø¿¡´Â ¶È°°Àº ¿¹Á¦¸¦ ¸ðµ¨¸®½ºÇüÀ¸·Î ¸¸µé¾î º¸ÀÚ. ¸ðµ¨¸®½ºÇüÀº ´ëÈ­»óÀÚ¸¦ ¿­¾î³õÀº ä·Î ¸ÞÀÎ À©µµ¿ì¸¦ Á¶ÀÛÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸ð´ÞÇü ´ëÈ­»óÀÚº¸´Ù´Â ´õ º¹ÀâÇÏ¸ç »ç¿ëÇϱ⵵ ¾î·Æ´Ù. °ñÄ¡ ¾ÆÇ ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ ÀÖÀ¸¸ç °Ô´Ù°¡ ´ëÈ­»óÀÚ¸¦ ´ÝÁö ¾ÊÀº ä·Î °ªÀ» º¯°æÇÏ°í ¸ÞÀÎ À©µµ¿ì°¡ º¯°æµÈ °ªÀ» Áï°¢ ÀÎÁöÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÖ¾î¾ß ÇÏ´Â ºÎ´ã±îÁö Áö´Ï°í ÀÖ´Ù. ´ÙÀ½ ´Ü°è¸¦ µû¶ó InfoDlg ÇÁ·ÎÁ§Æ®¸¦ ¸ðµ¨¸®½ºÇüÀ¸·Î º¯°æÇØ º¸ÀÚ.

1ÀÏ´Ü Mless¶ó´Â À̸§À¸·Î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í ÀÌ ÇÁ·ÎÁ§Æ®¸¦ InfoDlg ÇÁ·ÎÁ§Æ®¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ±â´ÉÀ» °¡Áöµµ·Ï ¸¸µé¾î º¸ÀÚ. Mless ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç ÈÄ Mless µð·ºÅ丮·Î InfoDlg.cpp ¼Ò½º ÆÄÀÏ°ú InfoDlg.rc, resource.h ÆÄÀÏÀ» º¹»çÇÑ´Ù. ±×¸®°í InfoDlg.*¸¦ Mless.*·Î À̸§À» º¯°æÇÑ ÈÄ ÇÁ·ÎÁ§Æ®¿¡ Æ÷ÇÔ½ÃŲ´Ù. Mless.cppÀÇ ¼±µÎ¿¡ ÀÖ´Â ´ÙÀ½ ÇÑÁÙ¸¸ º¯°æÇÏ°í ³ª¸ÓÁö´Â ±×´ë·Î µÐ´Ù.

LPSTR lpszClass="Mless";

ÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÏ¿© ½ÇÇà½ÃÅ°¸é InfoDlg.exe¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÑ(ŸÀÌƲ ¹Ù¸¸ ´Ù¸£´Ù) ¿¹Á¦°¡ ¸¸µé¾îÁ³À» °ÍÀÌ´Ù. ÀÌ ¿¹Á¦¸¦ º¯ÇüÇÏ¿© ¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ¸¦ ¸¸µé¾î º¼ °ÍÀÌ´Ù.

2¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ¸¦ ¸¸µé±â À§Çؼ­´Â ¿ì¼± ´ëÈ­»óÀÚ¸¦ È£ÃâÇÏ´Â DialogBox ÇÔ¼ö¸¦ ¾ø¾Ö¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¸ð´ÞÇüÀÇ ´ëÈ­»óÀÚ¸¦ ¸¸µé°í ½ÇÇà½ÃÅ°´Â ¸ðµç ÀÏÀ» ´Ù ÇÏ¸ç ´ëÈ­»óÀÚ¸¦ Á¾·áÇϱâ Àü¿¡´Â ¸®ÅÏÇÏÁö ¾Ê´Â Ư¼ºÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇؼ­´Â ¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ¸¦ ¸¸µé ¼ö ¾ø´Ù. ´ëÈ­»óÀÚ¸¦ È£ÃâÇÏ´Â WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

case WM_LBUTTONDOWN:
	if (!IsWindow(hDlg)) {
	hDlg=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),
			hWnd,MlessDlgProc);
		ShowWindow(hDlg,SW_SHOW);
	}
	return 0;

DialogBox ÇÔ¼ö ´ë½Å CreateDialog ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ´ëÈ­»óÀÚ¸¦ ¸¸µé±â¸¸ ÇÏ¿´´Ù. CreateDialog ÇÔ¼ö´Â DialogBox ÇÔ¼ö¿Í µ¿ÀÏÇÑ Àμö¸¦ »ç¿ëÇ쵂 ´ëÈ­»óÀÚ¸¦ ¸¸µé±â¸¸ ÇÏ¸ç ¸¸µç Áï½Ã ´ëÈ­»óÀÚÀÇ Çڵ鰪À» ¸®ÅÏÇÑ´Ù. ÀÌ¿¡ ºñÇØ DialogBox ÇÔ¼ö´Â ´ëÈ­»óÀÚ¸¦ ¸¸µå´Â °ÍÀº ¹°·Ð ´ëÈ­»óÀÚ¸¦ ¿î¿ëÇÏ´Â ¸ðµç ÀÏÀ» ÁÖ°üÇÏ¸ç ´ëÈ­»óÀÚ°¡ ´ÝÈú ¶§±îÁö ¸®ÅÏÇÏÁö ¾Ê´Â´Ù. CreateDialog ÇÔ¼ö°¡ ´ëÈ­»óÀÚ¸¦ ¸¸µç Á÷ÈÄ ¹Ù·Î Á¾·áÇϱ⠶§¹®¿¡ ¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ°¡ µÇ´Â °ÍÀÌ´Ù. ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀúÀÇ À̸§Àº MlessDlgProcÀ¸·Î º¯°æÇÏ¿´´Ù.

´ëÈ­»óÀÚ¸¦ ¸¸µç ÈÄ °ð¹Ù·Î ShowWindow ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´ëÈ­»óÀÚ°¡ È­¸éÀ¸·Î ³ªÅ¸³ªµµ·Ï ÇÏ¿´´Ù. ´ëÈ­»óÀÚ¿¡ WS_VISIBLE ½ºÅ¸ÀÏÀ» ÁÖ¾ú´Ù¸é ShowWindow ÇÔ¼ö´Â È£ÃâÇØÁÖÁö ¾Ê¾Æµµ »ó°ü¾øÁö¸¸ µðÆúÆ®·Î ´ëÈ­»óÀÚ´Â WS_VISIBLE ½ºÅ¸ÀÏÀ» °¡ÁöÁö ¾ÊÀ¸¹Ç·Î ShowWindow ÇÔ¼ö¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö È£ÃâÀ» »ý·«ÇØ ¹ö¸®¸é ´ëÈ­»óÀÚ°¡ ¸¸µé¾îÁö±â¸¸ ÇÒ »Ó È­¸éÀ¸·Î´Â º¸ÀÌÁö ¾Ê°Ô µÈ´Ù.

¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ¸¦ ¸¸µé ¶§ ƯÈ÷ ÁÖÀÇÇØ¾ß ÇÒ Á¡Àº °°Àº ´ëÈ­»óÀÚ°¡ µÎ¹ø ¸¸µé¾îÁöÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¸ð´ÞÇüÀº ´ëÈ­»óÀÚ¸¦ ´Ý±â Àü¿¡´Â ¸ÞÀÎ À©µµ¿ì¸¦ Á¶ÀÛÇÒ ¼ö ¾øÀ¸¹Ç·Î ±×·± ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾ÊÁö¸¸ ¸ðµ¨¸®½ºÇüÀº ´ëÈ­»óÀÚ°¡ ¿­¸°Ã¤·Î ¸ÞÀÎ À©µµ¿ì¿¡ ¸í·ÉÀ» ³»¸± ¼ö ÀÖ´Ù. ´ëÈ­»óÀÚ°¡ ¿­·ÁÀÖ´Â »óÅ¿¡¼­ ¶Ç ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸£¸é ´ëÈ­»óÀÚ°¡ µÎ °³ ¸¸µé¾îÁö°Ô µÇ´Â ±âÇö»óÀÌ ¹ß»ýÇÏ°Ô µÇ¸ç ÀÌ´Â °ñÄ¡ ¾ÆÇ ¹®Á¦ÀÇ ¿øÀÎÀÌ µÈ´Ù. ±×·¡¼­ WM_LBUTTONDOWN ¸Þ½ÃÁö¿¡¼­´Â ´ëÈ­»óÀÚ¸¦ ¸¸µé±â Àü¿¡ hDlg, Áï ´ëÈ­»óÀÚÀÇ À©µµ¿ì ÇÚµéÀ» Á¶»çÇØ º¸°í ÀÌ ÇÚµéÀÌ À¯È¿ÇÑ À©µµ¿ì ÇÚµéÀÎÁö¸¦ ¸ÕÀú Á¶»çÇØ º»´Ù.

BOOL IsWindow( HWND hWnd );

IsWindow ÇÔ¼ö´Â hWnd°¡ À¯È¿ÇÑ À©µµ¿ì ÇÚµéÀÎÁö Á¶»çÇØ º¸°í À©µµ¿ì°¡ Á¸ÀçÇϸé TRUE¸¦ ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù. ±×·¡¼­ hDlg°¡ Á¸ÀçÇÏÁö ¾ÊÀº °æ¿ì¿¡ ÇÑÇؼ­¸¸ ´ëÈ­»óÀÚ¸¦ ¸¸µéµµ·Ï ÇÏ¿© ´ëÈ­»óÀÚ¸¦ µÎ¹ø ¸¸µéÁö ¾Êµµ·Ï ÇÑ´Ù. ´ëÈ­»óÀÚÀÇ Á¸Àç ¿©ºÎ¸¦ ÇÚµéÀÇ À¯È¿¼ºÀ¸·Î ÆǺ°ÇϹǷΠhDlg º¯¼ö´Â Àü¿ªÀ¸·Î ¼±¾ðÇØ¾ß ÇÑ´Ù.

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="Mless";
int x;
int y;
char str[128];
HWND hDlg;

3¸ð´ÞÇüÀÇ ´ëÈ­»óÀÚ´Â OK, Cancel ¹öÆ° µÎ °³°¡ ÁÖ·Î »ç¿ëµÈ´Ù. OK´Â ÀÔ·ÂÇÑ °ªµéÀ» ¹Þ¾ÆµéÀδٴ ¶æÀ̸ç CancelÀº ÀԷ°ªÀ» ¹ö¸®¶ó´Â ¸í·ÉÀÌµÇ µÎ ¹öÆ° ¸ðµÎ ´ëÈ­»óÀÚ¸¦ Á¾·á½ÃÅ°´Â °ÍÀº µ¿ÀÏÇÏ´Ù. ±×·±µ¥ ¸ðµ¨¸®½ºÇü ´ëÈ­»óÀÚ¿¡´Â Ç×»ó ¿­·ÁÀֱ⠶§¹®¿¡ OK, Cancel ¹öÆ°ÀÌ ³í¸®ÀûÀ¸·Î Àß ¾î¿ï¸®Áö ¾Ê´Â´Ù. ÀÌ ¹öÆ°º¸´Ù´Â ´ëÈ­»óÀÚ¸¦ ¿­¾î³õÀº ä·Î °ªÀ» ½ÇÁ¦·Î º¯°æ½ÃÅ°´Â Change ¹öÆ°°ú ´ëÈ­»óÀÚ¸¦ ´Ý´Â Close ¹öÆ°ÀÌ ¸ðµ¨¸®½ºÇü¿¡ ´õ ÀûÇÕÇÏ´Ù. ´ëÈ­»óÀÚ ÆíÁý±â¸¦ ¿­¾î µÎ ¹öÆ°ÀÇ ID¿Í ĸ¼ÇÀ» ´ÙÀ½°ú °°ÀÌ º¯°æÇÑ´Ù.

¹öÆ° ID Caption
OK ID_CHANGE Change
Cancel ID_CLOSE Close

4CreateDialog³ª DialogBox µîÀÇ ÇÔ¼öµéó·³ ù¹ø° Àμö·Î ÀνºÅϽº ÇÚµéÀ» ¿ä±¸ÇÏ´Â ÇÔ¼öµéÀÌ ¸¹ÀÌ ÀÖ´Ù. ±×·±µ¥ ÇÁ·Î±×·¥ÀÇ ÀνºÅϽº ÇÚµéÀº WinMainÀÇ Àμö·Î Àü´ÞµÇ´Â Áö¿ªº¯¼öÀ̱⠶§¹®¿¡ WinMain ¿ÜºÎÀÇ ´Ù¸¥ ÇÔ¼ö¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ º¸Åë g_hInst ³ª glohInstance µîÀÇ Àü¿ª º¯¼ö¸¦ ¼±¾ðÇÏ°í WinMain¿¡¼­ ÀÌ Àü¿ªº¯¼ö¿¡ ÀνºÅϽº Çڵ鰪À» ´ëÀÔÇØ ÁÖ´Â ¹æ¹ýÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù. InfoDlg ¿¹Á¦¿¡¼­µµ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¿´´Ù.

ÀÌ¿Í ¸¶Âù°¡Áö·Î ¸ÞÀÎ À©µµ¿ìÀÇ Çڵ鵵 ¿©·¯ °÷¿¡¼­ »ç¿ëµÇ´Âµ¥ WinMainÀ̳ª WndProc ÀÌ¿ÜÀÇ ÇÔ¼ö¿¡¼­´Â ÀÌ Çڵ鰪À» ¾Ë ¼ö ¾ø´Ù. ±×·¡¼­ ¸ÞÀÎ À©µµ¿ìÀÇ Çڵ鵵 ÀνºÅϽº ÇÚµé°ú ¸¶Âù°¡Áö·Î º°µµÀÇ Àü¿ª º¯¼ö¿¡ ´ëÀÔÇØ µÎ´Â ¹æ¹ýÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù. hMainWnd¶ó´Â À̸§ÀÇ Àü¿ª º¯¼ö¸¦ ¸¸µé°í WinMain¿¡¼­ À©µµ¿ì¸¦ ¸¸µç Á÷ÈÄ¿¡ ÀÌ º¯¼ö¿¡ ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» ´ëÀÔÇØ µÎµµ·Ï ÇÏÀÚ.

HWND hMainWnd;

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
		  ,LPSTR lpszCmdParam,int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst=hInstance;
	................
	
	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		  NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	hMainWnd=hWnd;

ÀÌ Çڵ鰪Àº Àá½Ã ÈÄ MlessDlgProc¿¡¼­ »ç¿ëµÈ´Ù.

5¸¶Áö¸·À¸·Î InfoDlgProc ÇÔ¼ö¸¦ MlessDlgProcÀ¸·Î À̸§À» ¹Ù²Û ÈÄ Äڵ带 ¾à°£ ¼öÁ¤ÇÑ´Ù. º¯°æÇÑ ÈÄÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. ¾îµð°¡ ¾î¶»°Ô º¯°æµÇ¾ú´ÂÁö InfoDlgProcÀÇ °æ¿ì¿Í ºñ±³ÇØ º¸µµ·Ï ÇÏÀÚ.

BOOL CALLBACK MlessDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_INITDIALOG:
		SetDlgItemText(hDlg,IDC_STR,str);
		SetDlgItemInt(hDlg,IDC_X,x,FALSE);
		SetDlgItemInt(hDlg,IDC_Y,y,FALSE);
		return TRUE;
	case WM_COMMAND:
		switch (wParam) {
		case ID_CHANGE:
			GetDlgItemText(hDlg,IDC_STR,str,128);
			x=GetDlgItemInt(hDlg,IDC_X,NULL,FALSE);
			y=GetDlgItemInt(hDlg,IDC_Y,NULL,FALSE);
			InvalidateRect(hMainWnd,NULL,TRUE);
			return TRUE;
		case ID_CLOSE:
			DestroyWindow(hDlg);
			hDlg=NULL;
			return TRUE;
		}
		break;
	}
return FALSE;
}

WM_INITDIALOG ¸Þ½ÃÁö ó¸® ºÎºÐÀº ÀüÇô º¯°æµÇÁö ¾Ê¾ÒÀ¸¸ç WM_COMMAND ¸Þ½ÃÁö ó¸® ºÎºÐÀÌ ¸¹ÀÌ º¯°æµÇ¾ú´Ù. ¿ì¼± ID_CHANGE ¹öÆ°ÀÌ ´­·¯Áø °æ¿ì¸¦ º¸¸é ´ëÈ­»óÀÚ ÄÁÆ®·Ñ¿¡¼­ °ªÀ» Àоî Àü¿ª º¯¼ö¿¡ ´ëÀÔÇØÁÖ´Â ºÎºÐÀº µ¿ÀÏÇ쵂 ´ëÈ­»óÀÚ¸¦ Á¾·áÇÏ´Â EndDialog ÇÔ¼ö°¡ »ç¶óÁ³´Ù. ¸ðµ¨¸®½ºÇüÀ̹ǷΠ°ª¸¸ º¯°æÇÒ »Ó ´ëÈ­»óÀÚ¸¦ Á¾·áÇÒ ÇÊ¿ä´Â ¾ø±â ¶§¹®ÀÌ´Ù. ´ë½Å º¯°æµÈ °ªÀ» ¸ÞÀÎ À©µµ¿ì¿¡ Áï°¢ ¹Ý¿µÇϱâ À§ÇØ InvalidateRect ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸ÞÀÎ À©µµ¿ì Àüü¸¦ ¹«È¿È­½ÃÄ×´Ù.

ID_CLOSE°¡ ´­·¯Áø °æ¿ì¿¡´Â ´ëÈ­»óÀÚ¸¦ Æı«ÇÑ´Ù. ´ëÈ­»óÀÚ¸¦ ¸¸µé ¶§ CreateDialog ÇÔ¼ö¸¦ »ç¿ëÇßÀ¸¹Ç·Î ´ëÈ­»óÀÚ¸¦ ´ÝÀ» ¶§´Â DestroyWindow ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ´ëÈ­»óÀÚ¸¦ Æı«ÇÑ ÈÄ ´ëÈ­»óÀÚÀÇ À©µµ¿ì ÇÚµéÀÎ hDlg¿¡ NULLÀ» ´ëÀÔÇÏ¿© ´Ù½Ã ´ëÈ­»óÀÚ¸¦ ¸¸µé¼ö ÀÖµµ·Ï ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

±×·³ ÀÌÁ¦ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ¿© ½ÇÇà½ÃÄÑ º¸ÀÚ. ½ÇÇà ÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

´ëÈ­»óÀÚ¸¦ ¿­¾î³õ°í ¸ÞÀÎ À©µµ¿ìÀÇ Å©±â¸¦ º¯°æÇϰųª À§Ä¡¸¦ ¿Å±æ ¼ö ÀÖ´Ù. ¸¸¾à ¸ÞÀÎ À©µµ¿ì¿¡ ¸Þ´º³ª Åø¹Ù µîÀÌ ÀÖ´Ù¸é ¼±ÅÃÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.


¸ñ·Ï º¸±â  ´ÙÀ½ °­Á            written by http://www.winapi.co.kr