본문 바로가기
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; //메시지를 처리하지 않은 경우
}
반응형

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