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