Programming Language/Windows API

대화상자 생성

D4tai1 2018. 12. 9.

1. 대화상자 만들기

1) 대화상자

▶ 메뉴리소스 생성한 방식과 유사하게 생성할 수 있다.

▶ 다양한 동작에 배치할 수 있다. (동작 시 대화상자 발생)


2) 동작방식

 [1] 리소스에서 새로운 대화상자를 생성한다.

 [2] 대화상자에 대한 메세지처리함수를 작성한다.

 [3] 대화상자를 호출한다.


 

3) 리소스파일

[1] 리소스파일 추가

  ▶ [리소스파일(우클릭) - 추가 - 리소스] 를 클릭한다.


 [2] Dialog 생성

  ▶ Dialog 리소스를 클릭하고 새로만들기를 누른다.


 [3] 현재 프로젝트의 리소스 뷰에 접근

  ▶ 리소스 뷰를 누르고 IDD_DIALOG1을 확인한다.


 [4] 다이얼로그 제작

  ▶ [3]에서 IDD_DIALOG1을 더블클릭한다.

  ▶ 현재 대화상자가 기본상태이다.

  ▶ 확인(IDOK)와, 취소(IDCANCEL)은 WinUser.h에 정의되어 있다.


 [5] Resource.h

  ▶ IDD_DIALOG1라는 다이얼로그박스를 Resource.h에서 정의한다.

  ▶ [4]저장 시 자동으로 생성되지만 생성되지 않을경우 직접 적어주어도 무방하다.


 

2) 소스파일

 [1] resource.h 파일추가

  ▶ [프로젝트명.h] 파일에 resoure.h파일을 추가한다.

  ▶ include해주지 않을 경우 대화상자에 해당하는 번호를 직접 입력해주어야하고 내용이 길어질 경우 편의성이 떨어진다. 


 [2] 소스파일 작성(.cpp)

  ▶ [BOOL CALLBACK Dlg1_Proc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);] 를 작성한다.

  ▶ 대화상자 함수의 이름은 [Dlg1_Proc]으로 지정하였다.

  ▶ 대화상자 함수의 원형은 WndProc함수와 동일하다.

  ▶ hDlg는 대화상자의 핸들 값을 의미한다.

  ▶ Msg는 대화상자에서 발생한 메세지 값을 의미한다.

  ▶ wParam, lParam의 정보를 이용해서 메세지처리함수와 동일하게 대화상자에서 발생하는 메세지를 처리한다. 


 [3] 대화상자 함수의 소스

BOOL CALLBACK Dlg1_Proc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) {
	switch (Msg) {
	case WM_INITDIALOG:
		//대화상자가 처음 실행될 때 발생하는 메세지
		return 1;
		//아무 것도 하지않고 함수 종료

	case WM_COMMAND:
		//조작 중일 경우 WM_COMMAND메세지가 발생
		switch (LOWORD(wParam)) {
		case IDOK:
			EndDialog(hDlg, 0);
			break;
			
		case IDCANCEL:
			EndDialog(hDlg, 0);
			break;
		}
		break;
	}
	return 0;
}

  ▶ 전역변수에 [HINSTANCE hInst; ]를 추가로 작성해 주었다.

  ▶ WinMain( ) 함수에 [hInst = hInstance; ]를 추가로 작성해 주었다.

  ▶ 대화상자 함수를 호출하려면 WinMain( )함수의 첫 번째 인자인 hInstance가 필요하다.

  ▶ 그래서 WinMain( )함수의 hInstance를 전역변수인 hInst에 복사해 둔다.

  ▶ 그래야 메세지 처리함수에서 대화상자를 띄울 수 있다.

  ▶ wParam의 하위 2바이트에는 컨트롤한 ID값이 들어있다.



[3] 메세지처리함수의 소스

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
	case WM_LBUTTONDOWN:
		DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dlg1_Proc);
		break;

    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 메뉴 선택을 구문 분석합니다:
            switch (wmId)
            {
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

  ▶ [DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dlg1_Proc); ]는 왼쪽 마우스버튼을 눌렀을 때 동작하며 다이얼로그박스를 호출한다.

  ▶ [IDD_DIALOG1]의 ID값을 가진 대화상자를 띄우고 여기서 발생하는 메세지는 Dlg1_Proc함수에서 처리한다.

  ▶ 첫 번쨰 파라미터인 hInst는 WinMain( )함수에서 알고 있는 hInstance값을 전역변수에 저장해서 사용한 것이다.

 

3) 시연


  ▶ 마우스 왼쪽버튼을 클릭한다.


  ▶ 대화상자가 나오는 것을 확인한다.

  ▶ 확인 및 취소 후 반복해본다.

 


'Programming Language > Windows API' 카테고리의 다른 글

C로 작성한 실행파일(exe)에 음악넣기  (1) 2019.07.27
리소스파일  (0) 2018.12.09
메뉴 및 공용대화상자  (0) 2018.10.09
지렁이게임  (0) 2018.09.30
두더지잡기 게임  (0) 2018.09.30

댓글