대화상자 생성
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 | 
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
		
		
		
		
		
		
		
	
댓글