티스토리 뷰

[Win32] Modal dialog Modeless 대화상자(생성 및 사용법)

 윈도우에서 생성할 수 있는 다이얼로그(대화상자) 종류에는 모달 다이얼로그와 모달리스 다이얼로그가 있다.

모달 다이얼로그는 다른 곳으로 포커스가 가지 않으며 예시로는 메모장에서 다른이름으로 저장하기를 눌렀을때, 포커스가 다른이름으로저장하는 윈도우에 맞추어지며 메모장으로 포커스를 돌릴 수 없다. 반드시 저장이나 취소를 해주어야 다시 부모윈도우로 돌아온다.

다이얼로그(대화상자)

Modal dialog 생성방법

모달 다이얼로그는 DialogBox 함수로 생성할 수 있다.

첫번째 인자 : 커널이 윈메인에 부여해준 hInstance
두번째 인자 : 생성하려는 다이얼로그의 ID를 MAKEINTRESOURCE로 생성해준다.
세번째 인자 : 부모 핸들
네번째 인자 : 다이얼로그 프로시저

Modal dialog 생성방법

모달 다이얼로그 프로시저는 위와 같은 예시로 생성해 줄 수 있다.

 OK버튼이나 취소 버튼을 누르게되면, EndDialog()로 윈도우를 끝내 준다.

모달리스(Modeless dialog) 대화상자 생성방법

Modeless dialog

그와 반대로 모달리스 대화상자는 모달리스의 부모윈도를 번갈아 가며 자유롭게 포커싱을 바꿔줄 수 있다.

예를 들어서 메모장의 찾기 메뉴를 클릭하면 찾는 것과 동시에 메모장에있는 데이터 수정이 가능하다.

생성할 때는 위 사진과 같이 CreateDialog()함수를 사용해서 만들어준다.

사진의 코드에서 hDlg는 HWND형 전역변수이며, 모달다이얼로그와는 다르게 반환값을 받아주고있다.

CreateDialog가 반환해주는 값은 만들어준 다이얼로그의 핸들 값이며 이것을 왜 받아주냐면, 모달상자와는 달리 모달리스다이얼로그 에서는 쉽게말해서 두개의 윈도우 창을 번갈아가며 쓸 수 있도록 하게 하기 위함이다.

이때 hDlg를 스테틱변수로 WndProc에 만들어주어 생성되지 않았다면 최초 한 번 생성해주고, 생성이 되었는데 또 메뉴를 이용해 선택한다면, 포커싱만 맞추어 주도록 한 코드가 위 코드이다.

CreateDialog

위 사진은 모달리스 다이얼로그의 예시 프로시저이다.

모달리스의 경우에는 보통 OK버튼이나 CANCEL버튼이 없으므로 CLOSE버튼(엑스버튼) 을 눌러줬을 때만 종료할 수 있도록 설정해주는 모습이다. 종료는 DestroyWindow()함수로 해주면된다.

위에서 언급을 하지 않은 것이 있는데 모달이나 모달리스 대화상자의 프로시저 함수에서는 꼭 FALSE를 반환해 주어야한다. (기본 처리를 위해서)

댓글
댓글쓰기 폼