728x90
'나우캠퍼스X아워즈팜'유튜브의 'Win32 API 7강. 다이얼로그 (1/4)'영상을 보고 정리한 내용입니다.
다이얼로그
다이얼로그도 하나의 윈도우라고 할 수 있고 다이얼로그는 모달형 다이얼로그와 모달리스형 다이얼로그로 나누어집니다.
많은 응용프로그램이 다이얼로그 형태 위에 여러 형태를 처리하는 방식을 사용합니다.
모달형 다이얼로그
- 그 창이 띄워졌을 때 다른 창을 실행할 수 없다.
- 한 개의 윈도우를 띄우고 집중한 하나의 일을 할 때 사용한다.
- ex: 파일을 열거나 저장할 때 사용.
모달리스형 다이얼로그
- 그 창이 띄워졌을 때 다른 창도 실행할 수 있다.
- 여러개의 윈도우를 띄우고 다양한 멀티태스킹 작업을 할 때 사용한다.
- ex: 포토샵처럼 여러 창을 띄우며 사용.
다이얼로그를 생성할 때 생기는 메시지
- WM_INITDIALOG
- 다이얼로그를 처음 생성하면 생기는 메시지이다.
- 이 메시지가 발생하였을 때 다이얼로그의 프로시저에서 처리를 할 수 있도록 해 줄 수 있다.
모달형 다이얼로그
모달형 다이얼로그가 띄워지면 다른 창은 제어권이 없어지고 실행된 그 다이얼로그만 제어권이 생기게 됩니다.
우리가 전에 알아보았던 MessageBox()로 띄워지는 창의 형태가 대표적인 다이얼로그의 형태입니다.
모달형 다이얼로그를 만들기 위해서는 폼이라는 형태를 주어서 다이얼로그를 만들 수 있고 다이얼로그를 생성하는 함수를 이용합니다.
다이얼로그 생성 함수
- DialogBox()
- INT_PTR DialogBox(
HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc ); - hInstance : 인스턴스
- lpTemplate : 폼을 아이디 형태로 지정(리소스에서 컨트롤들을 올려놓을 수 있는 폼을 만든 후)
- hWndParent : 이 다이얼로그를 실행시키는 윈도우의 핸들(메뉴에 의해 다이얼로그가 떴다면 메뉴를 가지고 있는 윈도우가 부모 윈도우)
- lpDialogFunc : 다이얼로그의 프로시저. 이 프로시저로 윈도우에 들어오는 모든 메시지를 처리할 수 있도록 한다.
- 다이얼로그를 생성함과 동시에 다이얼로그의 안을 구성하는 폼이라는 것을 리소스와 함께 연결시켜줌.
- 윈도우 프로시저에서 발생하는 모든 메시지가 다이얼로그의 프로시저로 들어갈 수 있도록 해줌.
- 폼은 리소스에서 만든다.
- 다이얼로그의 프로시저는 자동생성된 코드를 이용하여 해결한다.
다이얼로그의 폼
- 리소스에서 폼을 만드는 법
- 솔루션 탐색기 -> 리소스 파일 -> 프로젝트명.rc -> Dialog -> 리소스 추가 -> Dialog -> 새로 만들기
- 이렇게 하면 폼이 생성이 되며 이렇게 만들어진 폼을 우클릭해서 속성을 누르면 그곳에서 다이얼로그의 폼을 편집할 수 있다.
- 다이얼로그를 생성하기 위해서 위와 같이 폼을 생성해야하고 위와 같이 폼을 생성하면 'IDD_'로 시작하는 폼 아이디가 생긴다.
- 다이얼로그를 생성할 때는 폼 아이디를 변환하여야 한다.
- 폼 아이디를 변환하는 메크로 함수: MAKEINTRESOURCE()
- 위와 같이 폼의 아이디를 변환하여서 폼을 lpTemplate에 지정하면 된다.
다이얼로그의 프로시저
- 일반 윈도우 프로시저와 동일한 역할을 함.
- 콜백함수의 형식
- INT_PTR CALLBACK DialogProg(
HWND hWndDlg, //
UINT uMsg, //메시지
WPARAM wParam,
LPARAM lParam );
- INT_PTR CALLBACK DialogProg(
- WndProc의 메시지 처리 -> 아무 메시지에 대한 처리가 없다면 기본적인 메시지에 대한 처리를 DefWindowProc이 한다.
- DialogProc의 메시지 처리 -> 아무 메시지에 대한 처리가 없어도 기본적인 메시지에 대한 처리를 하지 않고 메시지를 처리를 했다면 TRUE, 아니면 FALSE만 보내준다.
다이얼로그 해제
- EndDialg()
- BOOL WINAPI EndDialog(
HWND hDlg,
INT_PTR nResult ); - hDlg : 핸들
- nResult
- 부모 윈도우로 어떤 값을 보내줄 것인지를 설정한다.
- 다이얼로그에서 입력값을 받고서 그 값의 일부를 부모 윈도우로 보낼때 사용한다.
- 정수값을 쓰는데, 하나의 값밖에 받지 못한다.
- 이렇게 다이얼로그를 해제할 때 값을 전달하는 방법 말고 전역변수로 받아오는 방법을 쓸 수도 있기 때문에 대부분 전역변수를 사용한다. 사용하지 않으려면 0으로 설정해주면 된다.
- 창 닫기 버튼을 클릭하면 WM_CLOSE 메시지가 발생한다. 그때 EndDialg() 함수를 호출하여서 모달형 다이얼로그가 해제가 되고 부모 윈도우가 나온다.
관련 코드입니다! -> 클릭
오류가 있다면 말해주세요! 그럼 감사하겠습니다!
'무작정 따라해보기(정리, 문제풀기) > Win32API' 카테고리의 다른 글
23. WIN32API 프로그래밍 - 폼 기반의 윈도우 생성하기 (0) | 2021.09.06 |
---|---|
22. WIN32API 프로그래밍 - 모달리스형 다이얼로그 (0) | 2021.09.06 |
20. WIN32API 프로그래밍 - 타이머 관련 (0) | 2021.09.02 |
19. WIN32API 프로그래밍 - 마우스 관련 (0) | 2021.08.31 |
18. Win32API 프로그래밍 - 키보드 입력 (0) | 2021.08.30 |