자료 저장소

# 대화상자 스타일

대화상자의 스타일은 리소스에 기록되며 속성 편집기에서 대화상자의 스타일을 지정할 수 있기 때문에
리소스 스크립트를 직접 편집할 필요는 없다. 속성 편집기의 도움을 받으면 훨씬 더 편리하게 편집이 가능하다.


# 대화상자 파라미터

일부분만 조금 다른 대화상자가 여러 개 필요한 경우 하나의 대화상자만 만들어 두고 필요할 때마다 대화상자의
동작방법을 조금씩 바꿔가며 사용할 수 있다.
전역 변수를 사용하는것도 문제가 없지만 대화상자 파라미터를 이용하는 것이 바람직 하다.

INT_PTR DialogBoxParam(HINSTANCE hInstance,LPCWSTR lpTemplateName,HWND hWndParent,
        DLGPROC lpDialogFunc,LPARAM dwInitParam);

함수 원형은 DialogBox와 거의 유사하되 제일 뒤에 dwInitParam이라는 인수가 하나 더 추가되어 있다.
이 값은 대화상자를 생성할때 WM_INITDIALOG의 lParam으로 전달된다. 파라미터는 32비트의 정수값이지만
포인터를 전달할 수도 있으므로 구조체나 메모리 핸들같은 큰 데이터도 얼마든지 전달할 수 있다.


# 대화상자 프로시저

대화상자도 일종의 윈도우이다. 그래서 ShowWindow, MoveWindow, SetWindowText 등의 윈도우 핸들을
취하는 모든 함수를 다 사용 할 수 있다.
일단 대화상자의 윈도우 클래스는#32770이라는 특별한 이름의 시스템 전역 윈도우 클래스 이다.
이 윈도우 클래스는 운영체제가 정의한 것이며 따라서 대화상자의 윈도우 프로시저는 운영체제 내부에 있고
이 숨겨진 윈도우 프로시저가 대화상자의 모든 메시지를 처리한다.

우리가 작성한 대화상자 프로시저는 숨겨진 윈도우 프로시저가 호출하는 콜백함수에 불과하며 진정한 의미의
윈도우 프로시저는 아니다. 대화상자로 보내지는 모든 메시지는 #32770 윈도우 클래스가 정의하는 윈도우
프로시저가 먼저 받아 처리하고 그 중 일부는 대화상자 프로시저에게 전달된다. 대화상자의 윈도우 프로시저는
운영체제 내부에 있으므로 프로그래밍 대상이 아니며 응용프로그램이 정의하는 대화상자 프로시저가 프로그래밍
대상이다.

대화상자 프로시저는 메시지 루프와 직접 통신하는 윈도우 프로시저가 아니므로 일반적인 메시지 처리 함수와는
성격이 다소 다르다. 그중 가장 큰 차이점은 리턴값의 타입인데 윈도우 프로시저가 LRESULT(long) 타입이고
메시지를 처리했을 때 0을 리턴하는 반면 대화상자 프로시저는 메시지 처리 여부를 BOOL형으로 리턴한다.
또한 대화상자 프로시저는 숨겨진 윈도우 프로시저의 지원을 받으므로 자신이 처리하지 못한 메시지이 대해
DefWinodwProc을 호출할 필요가 없으며 FALSE만 리턴하면 나머지는 내부에서 디폴트 처리하도록 되어 있다.

댓글 로드 중…

최근에 게시된 글