본문 바로가기
IT창고/API

지역변수나 전역변수 없이 다이얼로그박스의 값을 가져옮

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    #include<windows.h>
    #include<stdio.h>
    #include"resource.h"
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
    //사용자가 만드는 다이얼로그 메시지 처리 함수
    BOOL CALLBACK DlgProc(HWND hDlg , UINT msg, WPARAM wParam, LPARAM lParam);
    //dialogBoxParam()을 쓰기 위해서는 구조체가 필요하다.
    typedef struct _DLGDATA
    {
    	int x;
    	int y;
    }DLGDATA, *PDLGDATA;
    
    
    
    TCHAR lpszClass[] = TEXT("first");
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrev,
    				   LPSTR lpCmdLine,
    				   int nShowCmd)
    {
    	AllocConsole();	//	콘솔창 생성
    
    	freopen("CONOUT$",	//콘솔을
    		"wt",			//text write모드로
    		stdout);		//stdoutrhk 연결
    //	EnumFiles("C:\\");
    	MSG Message;
    	//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
    	WNDCLASS wc;		//미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground	=	(HBRUSH)GetStockObject(	WHITE_BRUSH);
    
    	wc.hCursor		=	LoadCursor	(	0, IDC_CROSS);
    	wc.hIcon		=	LoadIcon	(	0, IDI_WINLOGO	);
    	wc.hInstance	=	hInstance;
    	wc.lpfnWndProc	=	WndProc;	//<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다.	메시지 함수등록
    	wc.lpszClassName=	lpszClass;
    	wc.lpszMenuName	=	0;
    	wc.style		=	0;
    
    	//2. 윈도우 클래스 등록하기.
    	RegisterClass( & wc	);	// 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
    	//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록
    
    	//3. 등록된 클래스를 사용해서 윈도우 만들기.
    	// typedef long HWND;	//	윈도우의 번호를 담을때 사용
    	HWND hwnd	=	CreateWindowEx(0 ,			// 확장 윈도우 스타일
    									lpszClass,				// 윈도우 클래스 이름
    									TEXT("첫시작"),					// 창이름
    									WS_OVERLAPPEDWINDOW,	// 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
    															// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
    									20,	20,	839,	660,	// X,Y,W,H
    									0,						// 부모 윈도우 핸들( 번호 )
    									0,						// 메뉴 핸들( 번호 )
    									hInstance,				// 인스턴스 핸들
    									0);						// 생성인자.( MDI 만들때 사용 )
    	
    	//4. 윈도우 보여주기
    	ShowWindow(hwnd, nShowCmd);
    
    	while(GetMessage(&Message,0,0,0))	//메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
    	{
    		//여기서 메시지를 처리하면 부모뿐 아니라 모든 자식윈도우로 전달되는 메시지도 먼저 처리할 수 있다.
    
    		TranslateMessage(&Message);
    		if (Message.message	==	WM_SYSKEYDOWN && Message.wParam == 'X')
    		{
    			PostQuitMessage(0);
    			MessageBox(hwnd, "종료","질문",MB_OK);
    			//SendMessage(hwnd, WM_CLOSE,0,0);
    			continue;
    		}
    
    		//PreTranslateMessae(&Message);
    		DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
    	}
    	
    	//MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
    	return 0;
    }
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    {
    	static HWND hTree;
    	static int xPos = 0 , yPos = 0 ;
    	switch(iMessage){
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0 ;
    	case WM_CREATE:
    		return 0 ;
    	case WM_LBUTTONDOWN:
    		{
    			//다이얼로그박스를 나타내기 전에 구조체를 생성해서 스태틱 변수값으로 초기화
    			DLGDATA data;
    			data.x = xPos;
    			data.y = yPos;
    
    
    			//다이얼로그 나타내기
    			UINT ret = DialogBoxParam(GetModuleHandle(0),//hInstance
    				MAKEINTRESOURCE(IDD_DIALOG1),//리소스 아이디
    				hwnd,		//소유자 핸들
    				DlgProc,	//다이얼로그 프로시저
    				(LPARAM)&data);	//	WM_INITDIALOG의 lParam으로 전달.
    
    			if(ret == IDOK)
    			{
    				//Dialog에 입력한 값은구조체에 있다.
    				//Static변수에 옮겨 담고 무효화
    				xPos = data.x;
    				yPos = data.y;
    
    				InvalidateRect(hwnd, 0, TRUE);
    			}
    		}
    		return 0;
    	case WM_PAINT:
    		{
    			PAINTSTRUCT ps;
    			HDC hdc = BeginPaint(hwnd, &ps);
    			char s[256];
    			wsprintf(s,"%d, %d",xPos, yPos);
    
    			TextOut(hdc, 10,10,s,lstrlen(s));
    			EndPaint(hwnd,&ps);
    		}
    		return 0;
    	}
    	//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
    	return(DefWindowProc(hwnd,iMessage,wParam,lParam));
    }
    BOOL CALLBACK DlgProc(HWND hDlg , UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	static DLGDATA *pData;
    	switch(msg)
    	{
    	case WM_INITDIALOG:
    		pData = (DLGDATA *)lParam;	//DialogBoxPrarm()의 마지막인자.
    
    		//구조체의 내용으로 control을 초기화한다.
    
    		SetDlgItemInt(hDlg, IDC_EDIT1, pData->x,0);
    		SetDlgItemInt(hDlg, IDC_EDIT2, pData->y,0);
    		return TRUE;
    	case WM_COMMAND:
    		switch(LOWORD( wParam ) )
    		{
    		case IDOK:
    			{
    			//	char s[256];   // -> 이방법은 전역변수로 빼야한다. 하지만 에디트박스가 10개라면 10개를 다 만들것인가?
    				// 아니다. DialogBoxParam()을 쓰면 된다.
    			//	char B[256];
    				//10 - > HWND를 얻는다.
    			//	HWND hEdit = GetDlgItem(hDlg, IDC_EDIT1);
    			//	GetWindowText(hEdit, s, 256);
    				//위 2줄대신 아래 한줄로도 가능
    				//GetDlgItemText(hDlg, IDC_EDIT1,s,256);
    				//GetDlgItemText(hDlg, IDC_EDIT2,B,256);
    			
    				//MessageBox(0,s,B,MB_OK);
    				BOOL b;
    				//cotrol의 값을 구조체로...!!
    
    				pData->x = GetDlgItemInt(hDlg, IDC_EDIT1,&b,0);
    				pData->y = GetDlgItemInt(hDlg, IDC_EDIT2,&b,0);
    
    				EndDialog(hDlg, IDOK);	break;
    			}
    		case IDCANCEL:	EndDialog(hDlg, IDCANCEL);	break;
    		}
    		return TRUE;
    	}
    	return FALSE; //메시지를 처리하지 않은 경우
    }
    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."