2011년9월27일_winAPI_대화상자이론, 모달형 대화상자 예제, 대화상자기반의 프로그램(Dialog Base)
● 대화상자란?
[스크린샷] 비주얼 스튜디오 6.0의 Option 대화상자
대화상자(Dialog Box)는 프로그램과 사용자간의 대화, 곧 명령 및 정보 전달을 위한 특별한 윈도우이다.
대화상자에는 버튼, 에디트 등의 컨트롤들이 배치되는데 그래서 대화상자를 컨트롤의 컨테이너라고도 한다.
상기의 스크린샷과 같이 대화상자는 여러 가지 컨트롤이 배치되어 있어 마치 종합선물세트와 같다.
이런 컨트롤들을 메인 윈도우에서 따로따로 배치하여 관리한다면 프로그래밍도 불편하고 사용자도 불편할 것이다.
대화상자를 이용하면 보기 좋게 사용자 인터페이스를 만들 수 있다.
● 동작방식에 따른 분류
① 모달형
모달(Modal)형은 대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 확인(또는 OK)버튼이나 취소(또는 Cancel)버튼을 눌러,
대화상자를 닫아야 다른 윈도우로 전환할 수 있다. 비주얼 스튜디오 6.0의 Option대화상자도 모달 대화상자이다.
② 모달리스형
모달리스(Modaless)형은 대화상자를 열러 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자이다.
일반적으로 많이 사용되지는 않지만 메모장의 찾기 대화상자가 모달리스형이다.
[스크린샷] 찾기 대화상자가 포커스를 얻은 상태 [스크린샷] 메인 윈도우인 메모장이 포커스를 얻은 상태
메모장(notepad)에서 Ctrl + F키를 눌러 일치하는 단어를 찾은 후 마우스를 클릭하여 메인윈도우를 선택하면,
편집창에서 수정도 가능하고 찾기 대화상자도 사라지지 않는다.
이렇게 메인윈도우의 내용과 대화상자의 내용을 동시에 보고자 할 때 모달리스형을 사용하면 되겠다.
● 대화상자를 만들기 위해 필요한 구성요소
① 대화상자 템플릿
대화상자의 모양과 대화상자 내의 컨트롤 배치 상태가 저장되는 이진 정보이며 리소스로 작성된다.
개발자 스튜디오에 별도의 대화상자 편집기가 제공되므로 어렵지 않게 디자인 할 수 있다.
② 대화상자 프로시저
윈도우 프로시저가 윈도우에서 발생하는 메시지를 처리하는 것과 마찬가지로 대화상자 프로시저는,
대화상자에서 발생하는 메시지를 처리한다. WndProc()에서 처리하는 것이 아니다. 따로 콜백함수를 정의해서 사용한다.
● windows API정복 page.226 예제: About (핵심코드만 미리보기)
▷ 메시지맵
▷ 다이어로그박스 메시지 처리함수
▷ MsgProc.cpp
<간단 소스코드 설명>
g_hInst는 대화상자 리소스를 가진 인스턴스의 핸들이고 WinMain( ) 호출시 hInstance라는 첫 번째 인자로 받는다.
MAKEINTRESOURCE( ) 매크로함수는 다들 아시다시피 정수로 된 ID를 문자열로 형변환하는 함수이다.
hWnd는 부모윈도우의 핸들이고, AboutDlgProc는 대화상자에서 발생하는 메시지를 처리하는 콜백함수의 이름으로 시작주소다.
즉, 이 프로그램의 리소스를 사용해 IDD_DIALOG1이라는 대화상자를 생성하고,
이 대화상자의 메시지는 AboutDlgProc( )가 도맡아 처리한다.
대화상자가 열려 있을 때는 DialogBox( )에서 블로킹되어 프로그램이 다음으로 진행되지 못 하는 모달방식이고,
대화상자를 EndDialog( )로 닫으면 DialogBox( )가 리턴되어 iResult에 EndDialog( )의 두 번째 인자가 저장된다.
▷ 리소스
ID는 IDD_DIALOG1
<실행결과>
[스크린샷] 메인 윈도우 [스크린샷] 배고파 대화상자 [스크린샷] OK버튼을 누를 경우 결과
● 윈도우 프로시저의 리턴값 ┬ 메시지처리 O → 0을 리턴
└ 메시지처리 X → DefWindowProc( )로 보냄
● 대화상자 프로시저의 리턴값 ┬ 메시지처리 O → TRUE리턴
└ 메시지처리 X → FALSE리턴
● 대화상자 프로시저는 WM_CREATE대신 WM_INITDIALOG메시지를 받아 들이고,
일반 윈도우와 마찬가지로 LOWORD(wParam)에 메시지를 보낸 컨트롤의 ID가 전달되며,
HIWORD(wParam)에 통지코드가 전달된다.
● windows API정복 page.230 대화상자 프로젝트
[스크린샷] 윈도우에서 유용한 프로그램인 계산기
상기와 같이 대화상자가 메인 윈도우가 되는 형태의 프로그램을 대화상자 기반의 프로그램(Dialog Base)이라고 하며,
컨트롤을 많이 사용하는 프로그램들이 주로 대화상자 기반으로 만들어진다.
● 예제: DlgBase
▷ main.cpp
<소스코드설명>
WinMain( )에는 24행의 DialogBox( )호출문 밖에 없다. 매우 간단한데;;;
첫 번째 인자는 인스턴스의 핸들로 다들 아실테고,
두 번째 인자도 리소스ID로 다들 아실거고,
세 번째 인자는 HWND_DESKTOP으로 NULL을 의미한다. 즉, 부모 윈도우자리에 NULL을 넣으니 부모가 없다는 것. 독립했삼.
네 번째 인자는 대화상자 메시지 처리함수이다.
▷ 리소스
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년9월28일_winAPI_대화상자_컨트롤과의 통신 (0) | 2011.09.28 |
---|---|
2011년9월27일_pcap_패킷 캡쳐 라이브러리를 사용하여 FTP서버에 로그인시 송신되는 패킷을 캡쳐해보자. (2) | 2011.09.28 |
2011년9월26일_pcap_패킷 캡쳐 라이브러리를 사용하여 랜카드이름을 알아보자. (0) | 2011.09.26 |
2011년9월26일_ARM_온습도센서(SHT75), TWI, UART, SPI, 프로토콜 모두 이론만 (0) | 2011.09.26 |
2011년9월26일_winAPI_스크롤 바(Scroll Bar) (0) | 2011.09.26 |