4. 대화상자와 Resource 2006.10.10 최 영 석
Contents 대화상자 만들기 모달 대화상자와 모달리스 대화상자. FormView 버튼 리스트 상자 콤보 상자 공용 대화 상자
1. 대화 상자 만들기 대화 상자란? 사용자와 프로그램간의 정보교류수단의 독립된window.
1.1 대화상자 폼과 클래스 만들기 Insert의 Resource 항목 클릭! (Ctrl+1)
1.1 대화상자 폼과 클래스 만들기 Controls 도구바 사용
1.1 대화상자 폼과 클래스 만들기
1.1 대화상자 폼과 클래스 만들기 View의 ClassWizard 선택 (Ctrl+ W)
1.1 대화상자 폼과 클래스 만들기 Cdialog 클래스에 상속받은 새로운 클래스명 새로 만든 클래스 소스가 들어있는 파일명 베이스 클래스 대화상자 아이디 명
1.2 대화 상자 안의 컨트롤과의 연결 대화 상자 안의 컨트롤을 클래스와 연결 Ctrl키 누른 상태에서 더블클릭! 에디터 상자와 연결될 멤버명 에디터 상자와 연결되는 방법 에디터 상자와 연결되는 멤버형
1.2 대화 상자 안의 컨트롤과의 연결 Category Value : 컨트롤에 설정되어 있는 값만 연결. Control : 해당 컨트롤을 제어할 수 있는 컨트롤 클래스와 연결.
1.2 대화 상자 안의 컨트롤과의 연결 Variable type 에디터 상자와 연결되는 변수형을 의미
1.2 대화 상자 안의 컨트롤과의 연결 대화상자 클래스의 소스부분 DODataExchange 함수 Category : Control Category : Value
1.2 대화 상자 안의 컨트롤과의 연결 대화 상자 안의 데이터 입력 Control 형태 Value 형태 ComboBox의 데이터 입력하는 함수‘AddString’ m_combobox.AddString(“데이터1”); Value 형태 UpdateData(TRUE) 에디터 상자에 입력된 데이터를 가져오고자 한다면.. UpdateData(FALSE) 특정값을 입력하고 이 값을 그대로 에디터 상자에 전송하고자 한다면…
1.3 대화상자만 있는 프로그램 대화상자만 출력 대화상자 한 개만 설정, 대화상자 종료후 프로그램 종료. MFC구조에서 볼때 View와 프레임이 없이 단순하게 대화상자만 출력되는 형태.
1.3 대화상자만 있는 프로그램 AppWizard의 step1 항목에서 Dialog based 선택.
1.3 대화상자만 있는 프로그램 AppWizard의 step2 대화 상자의 시스템 메뉴에 본 프로그램에 대한 안내문이 있는 대화 상자를 출력할 것인가? 도움말 항목을 설정할 것인가? 대화 상자의 자원 형태를 3D 스타일로 설정할 것인가?
1.3 대화상자만 있는 프로그램
1.3 대화상자만 있는 프로그램 클래스명 Base 클래스 내용 CMyDialogApp CWinApp 애플리케이션 클래스 CMyDialogDlg CDialog 대화 상자 클래스 CAboutDlg 정보 설정 대화 상자 클래스 대화 상자 형태의 프로그램을 AppWizard로 만들면 애플리케이션 클래스와 CDialog 클래스만 생성. 이 대화 상자 형태의 프로그램이 실제 어떻게 구동되는가를 알고자 한다면 App 클래스의 InitInstance() 함수를 참조.
1.3 대화상자만 있는 프로그램
1.3 대화상자만 있는 프로그램 애플리케이션에 대화 상자를 만들고 이 대화 상자를 m_pMainWnd로 설정한 다음 DoModal() 함수를 이용하여 실행, 결국 대화 상자 한 개만 만드는 프로그램이나 내부에서 대화 상자를 출력할 때 대화 상자를 출력하는 방법은 같다. DoModal()이라는 함수를 실행하면 대화 상자가 종료되면서 종료값을 리턴. OK 버튼을 클릭하였을 경우 린턴값은 IDOK이며 Cancel 버튼을 클릭하였을 경우에는 IDCANCEL이 리턴
1.4 함수 OnInitDialog() 초기화하는 부분을 주로 기입하는 함수 클래스 위저드를 이용하여 메시지 항목에서 WM_INITDIALOG를 선택하여 만든다. 대화 상자가 출력될 경우 해당 항목에 어떤 값을 미리 입력하여 놓는다든지 해당 항목들을 활성/비활성한다든지 하는 것들은 모두 이 함수에서 하는 것이 좋다. 대화 상자만 출력되는 프로그램을 AppWizard를 이용하여 만들었을 경우 기본적인 초기화를 OnInitDialog에 해놓는다.
1.4 함수 OnInitDialog() OnInitialDialog()
1.5 컨트롤들의 이벤트 메시지 얻기 컨트롤들에서 어떤 이벤트가 발생되었을 때 구동되는 함수를 만드는 방법을 의미. 예를 들어 버튼이 눌려졌을 때, 리스트 상자에서 특정 항목을 선택하였을 때.
1.5 컨트롤들의 이벤트 메시지 얻기 ② 해당 컨트롤에서 발생되는 이벤트 메시지 리스트. ① 이벤트를 얻고자 하는 컨트롤 ID를 선택. ③ 리스트 상자에서 특정항목을 선택하였을때 수행되는 함수. 선택 항목이 변경되었을 경우(LBN_SELCHANGE), 더블 클릭했을 경우(LBN_DBLCLK), 포커스가 사라질 경우(LBN_KILLFOCUS) 등등의 메시지가 발생 ④OnSelchangeList1 함수가 만들어짐.
1.6 대화 상자 프로그램 예제 대화 상자용 프로그램을 만들고 버튼, 에디터 상자, 콤보 상자, 리스트 상자 등을 설정하고 해당 이벤트 메시지를 받아서 처리하는 예제. AppWizard의 Step1에서 Dialog based 항목을 선택
1.6 대화 상자 프로그램 예제 대화상자 폼과 클래스 연결 각 컨트롤에서 발생되는 메시지가 출력 체크버튼에 체크되면 에디트 상자에 문장 출력. 버튼을 클릭하면 에디트 상자에 문장 출력. 리스트상자에 새로운 항목이 선택되면 문장출력. 콤보상자에 새로운 항목이 선택되면 문장출력.
1.6 대화 상자 프로그램 예제 OnInitDialog() 함수 수정
1.6 대화 상자 프로그램 예제 실행화면
2. 모달 대화상자와 모달리스 대화상자. 모달 대화 상자 DoModal() 함수를 이용하여 대화 상자를 출력하는 방법. 2. 모달 대화상자와 모달리스 대화상자. 모달 대화 상자 DoModal() 함수를 이용하여 대화 상자를 출력하는 방법. 대화 상자가 실행되면 부모 윈도가 포커스를 갖지 못한다. 대화 상자를 실행한 후에 부모 윈도의 메뉴 항목을 클릭하거나 View 윈도 판을 마우스로 클릭하였을 때 “삑”하는 소리만 날 뿐 활성화가 되지 않는다. 즉 모든 포커스를 대화 상자가 갖는 형태.
2. 모달 대화상자와 모달리스 대화상자. 모달리스 대화 상자 모달 대화 상자와 반대로 부모 윈도에서 포커스를 가짐. 2. 모달 대화상자와 모달리스 대화상자. 모달리스 대화 상자 모달 대화 상자와 반대로 부모 윈도에서 포커스를 가짐. 즉 부모 윈도를 클릭하면 부모 윈도가 활성화되는 경우를 의미. 주로 현재 대화 상자가 가동되면서 동시에 부모 윈도의 여러 항목들이 동시에 가동될 때 사용. 예를 들어 한글 프로그램에서 찾기 항목을 실행시켰을 때 찾기 대화 상자가 가동되면서 에디터 윈도에서 글자를 수정할 때 사용하는 방법이 모달리스 대화 상자입니다.
2.1 모달리스 대화상자 출력방법 먼저 Create 함수를 이용하여 대화 상자를 만든 후 실행하고자 할 경우 ShowWindow라는 CWnd의 멤버 함수를 이용하여 화면에 출력. 모달리스 대화 상자는 일반적으로 대화 상자 클래스를 헤더에 설정하고 부모 윈도가 만들어지는 부분에서 미리 Creat 함수를 이용하여 윈도를 만들어 두었다가 대화 상자를 실행하고자 하는 부분에서 ShowWindow 함수를 이용. ① 윈도를 만든다. CmyDialog pDlg; pDlg.Create(IDD_Dialog1,this) ② 대화상자를 실행한다. pDlg.ShowWindow(SW_SHOW)
3. FormView FormView란? 대화 상자처럼 컨트롤을 포함한 윈도이면서 CView를 상속받은 형태를 의미.
3.1 FormView를 사용한 프로젝트 만들기 View 항목을 선택한 후에 Base Class 항목을 CFormView로 설정.
3.1 FormView를 사용한 프로젝트 만들기 View 윈도와 연결되어 있는 대화상자 대화상자를 선택한 상태에서 Alt+Enter 키를 누르면 속성대화상자가 나타낸다. Border가 없음. 대화상자일 경우에는 보통 Dialog Frame으로 설정. Child 형태임. 대화상자일 경우에는 Popup 형태임.
3.2 FormView를 이용한 예제 다음 예제는 AppWizard를 이용하여 SDI 형태로 만든 다음 Step6에서 CExFormViewView클래스는 CFormView 클래스를 상속받도록 한다. FORM의 형태
3.2 FormView를 이용한 예제 실제적으로 보면 전에 제작한 폼 형태와 같지만 차이점은 리스트 상자를 GetDlgItem을 이용하여 윈도 핸들을 얻었으나 본 예제에서는 DoDataExchange 함수를 이용하여 연결. 예제 클래스에서 각 항목을 핸들링하여 에디터 상자에 출력하는 내용은 비슷. OnInitDialog에서 작성한 부분이 OnInitialUpdate로 바뀐 것과 리스트 상자를 m_listBox라는 멤버 함수를 이용하여 컨트롤하는 것을 제외하면 모든 내용이 전과 같게 프로그램을 작성.
3.2 FormView를 이용한 예제 대화상자 폼에 컨트롤 설정과 멤버 연결 DoDataExchange를 이용하여 클래스 멤버와 연결 헤더부
3.2 FormView를 이용한 예제 대화상자 폼에 컨트롤 설정과 멤버 연결 DoDataExchange 함수
3.2 FormView를 이용한 예제 대화 상자 클래스 만들기 메뉴 항목에서 ‘모달 대화 상자’와 ‘모달리스 대화 상자’ 항목을 선택하였을 때 출력할 대화 상자 폼
3.2 FormView를 이용한 예제 View 클래스 헤더 상단부에 CMyDlg가 설정되어 있는 헤더를 #include한다.
OnInitialUpdate() 수정하기 3.2 FormView를 이용한 예제 OnInitialUpdate() 수정하기
3.2 FormView를 이용한 예제 모달 대화상자 선택시 함수 만들기 OnModaldlg()
3.2 FormView를 이용한 예제 모달리스 대화상자 선택시 함수 만들기 OnModalle()
3.2 FormView를 이용한 예제
4.버튼 일반적인 버튼 일반적인 버튼은 ExFormView나 ExDialog에서 사용한 버튼을 의미. 이 버튼은 대화 상자 폼을 선택하면 나타나는 컨트롤 도구바에서 버튼을 클릭. 이 때 설정되는 버튼은 기본적으로 CButton 클래스. 실제로 버튼을 사용할 때는 Create 함수를 이용하는 것보다 본 장에서 설명하는 방식으로 FormView나 Dialog에 설정하여 많이 사용. 일반적 형태의 버튼 외에 체크 버튼과 라디오 버튼, 그룹 상자 등등이 모두 버튼이다. 다만 스타일을 달리하여 형태가 바뀐 것 뿐.
4.1 일반적인 버튼 체크 버튼 체크 버튼은 클릭하면 좌측 사각 형태에 v자 형태로 표시되며 다시 누르면 해제되는 버튼. 이 버튼을 이용하면 어떤 옵션을 설정하거나 해제할 때 유용. 체크 버튼은 DoDataExchange 함수를 멤버와 연결하고자 할 때 Value 옵션을 이용하면 DDX_Check 함수로 연결되며 BOOL 형태와 연결. BOOL 형태는 1과 0을 가지는 정수형 변수. 즉 2진 값을 가지고 있기 때문에 체크 버튼이 체크되면 1로, 체크 버튼에서 해제되면 0으로 설정. Control로 연결될 때는 CButton으로 연결. DDX_Check로 연결하면 UpdateData 함수를 이용하여 현재 설정되어 있는 체크 버튼의 값을 얻을 수 있다.
4.1 일반적인 버튼 라디오 버튼 라디오 버튼은 여러 선택 사항에서 한 개를 선택하고자 할 때 주로 많이 사용하는 버튼. 여러 개의 선택 버튼이 있을 경우 한 개를 선택하면 나머지 항목들은 해제. 라디오 버튼은 DoDataExchange 함수를 이용하여 클래스 멤버와 연결하고자 할 때 지금까지 사용한 방법(대화 상자 해당 내용을 Ctrl 키를 누르고 있는 상태에서 마우스 좌측 버튼을 클릭하는 방법)으로는 연결되지 않는다. 이 라디오 버튼을 연결하고자 할 경우에는 직접 코딩을 해주어야 한다. 예를 들어서 IDC_RADIO1이라는 버튼이 있다고 가정했을 때 이 버튼을 BOOL형인 m_bRadio1과 연결하고자 한다면 먼저 헤더에 다음과 같이 m_bRadio1을 선언합니다.
4.1 일반적인 버튼 라디오 버튼 Group을 설정하면 각각 독립된 형태로 구동이 되나 문제가 생김. 문제는 한 번 라디오 버튼을 클릭하여 체크 상태로 놓게 되면 다시 해제가 안 된다는 것. 즉 라디오 버튼을 클릭하면 ON-OFF의 토글 형태가 되지 않는다. 이를 해결하기 위해서는 바로 DDX_Check를 사용하여 멤버와 연결. DDX_Check를 이용하여 m_bRadio1과 IDC_RADIO1을 연결시켰다고 가정한다면, 버튼을 클릭했을 때 함수에서 다음과 같이 설정하여 주면 라디오 버튼이 ON-OFF가 자동적으로 구동.
4.1 일반적인 버튼 그룹 상자와 Static 윈도 그룹 상자와 Static 윈도는 아무런 이벤트를 발생하지 않고 다만 대화 상자를 보기 좋게 장식하는 데 사용. 그룹 상자는 버튼 형태이며, Static 윈도는 그냥 Static 윈도라고 한다. 그룹 상자는 라디오 버튼을 그룹화할 때 주로 사용하며 static 윈도는 윈도 영역을 알고자 할 때나 상자를 칠할 때 주로 많이 사용.
4.2 비트맵 버튼 비트맵 버튼 만드는 방법 ① 자동으로 설정하는 방법. 버튼의 이름을 버튼이라고 하면 비트맵에서 들어간 그림은 BUTTOND로, 나온 그림은 BUTTONU로 찾아서 로드한다. 버튼 속성에서 Owner draw 항목 체크.
4.2 비트맵 버튼 비트맵 버튼 만드는 세가지 방법 ② 비트맵 버튼 클래스와 대화 상자 버튼을 DDX_Control로 연결시켜 주고 LoadBitmaps 함수를 이용하여 비트맵 버튼을 만드는 방법. LoadBitmaps를 사용하여 비트맵 버튼을 설정하면 네 가지 형태의 비트맵을 로드할 수 있습니다. 즉 나온 형태, 들어간 형태, 현재 포커스가 설정되어 있는 형태, 비활성화 되는 형태를 의미 버튼 속성에서 Owner draw 항목 체크.
4.3 트루컬러 비트맵 자원에서 비트맵을 설정할 때 최대 256컬러까지는 지원이 되나 트루 컬러는 지원이 되지 않는다. 지원되지 않는다는 의미는 그리소스 에디터에서 그릴 수 없다는 뜻. 트루컬러 비트맵 버튼을 설정하려면 사용자가 직접 비트맵을 그려주는 방법과 외부에서 그린 다음 비트맵에 등록하는 방법 있다. 트루컬러 비트맵은 만든다기보다 비트맵 버튼 만들기 세 번째 항목, 즉 프로그래머가 버튼 DC를 받아서 직접 그리는 것이다.
4.3 트루컬러 비트맵 대화상자 클래스에 WM_DRAWITEM 메시지를 받는 함수를 설정 버튼 속성에서 Owner draw 항목 체크.
4.3 트루컬러 비트맵 Dib를 출력하기 위해서는 BITMAPINFO 구조체를 이용하여 정보를 설정
4.3 트루컬러 비트맵 szBitmapInfo에 해당 raw 파일의 정보를 설정.
4.3 트루컬러 비트맵 수정된 OnDrawItem()
4.4 버튼위에 있을때 마우스 커서 바꾸기 ①클래스 위저드를 이용 Add Class 버튼을 클릭하여 new 항목을 선택.
4.4 버튼위에 있을때 마우스 커서 바꾸기 ②새로 만든 클래스명을 설정.(일반적으로 앞에 C를 설정하는것이 좋음) 4.4 버튼위에 있을때 마우스 커서 바꾸기 ②새로 만든 클래스명을 설정.(일반적으로 앞에 C를 설정하는것이 좋음) ③ 해당 클래스가 있는 소스 파일명. ④ base Clas를 설정. CButton을 상속받아 CMyButton을 만들 것이므로 Cbuttondmf 설정.
4.4 버튼위에 있을때 마우스 커서 바꾸기 ⑤ 만들어진 클래스(CMyButton)에서 WM_MOUSEMOVE 함수를 만든다.
4.5 버튼 예제 Dialog based 프로젝트 만들기 AppWizard를 이용하여 프로젝트를 Dialog based 형태로 만든다. 프로젝트를 ExButton으로 설정하면 IDD_EXBUTTON _DIALOG라는 대화 상자 폼이 나타난다. 이 폼에 대화 상자를 설정. 선택사항 항목은 Group 속성을 설정. 비트맵,트루맵 버튼은 Owner draw를 설정.
4.5 버튼 예제 대화 상자 컨트롤과 클래스 멤버와의 연결 DoDataExchange 안에 DDX_Text나 DDX_Control, DDX_Check를 이용하여 대화 상자의 컨트롤과 클래스 멤버를 연결 ExButtonDlg 헤더부
4.5 버튼 예제 대화 상자 컨트롤과 클래스 멤버와의 연결 DoDataExchange()
4.5 버튼 예제 비트맵 버튼 설정 OnInitDialog()
4.5 버튼 예제 트루컬러 이미지 만들고 로드하기 들어 형태의 이미지를 설정하기 위해서는 m_pDibd에, 나온 형태 이미지는 m_pDibu에 설정 두 개의 멤버에 Dib를 연결. ExButtonDlg 헤더부
4.5 버튼 예제 초기화 부분에서 두 개의 멤버에 Dib를 로드하는 부분을 설정
4.5 버튼 예제 Owner Draw에서 트루 컬러 버튼 설정
4.5 버튼 예제 일반 버튼을 클릭하면 비트맵 버튼이 활성/비활성이 토글화 일반 버튼이 클릭되었을 때의 함수를 클래스 위저드로 생성, 대화 상자에서 일반 버튼 ID를 선택한 다음 BN_CLICKED 함수를 만들면 된다. 만든 함수에 다음과 같이 수정 IsWindowEnabled 함수는 활성화일 경우에는 1, 그렇지 않을 경우에는 0을 리턴
4.5 버튼 예제 라디오 버튼 토글 설정 라디오 버튼을 토글하기 위해서 m_bRadio1의 값을 토글시키고 이것을 라디오 버튼에 설정 라디오 버튼이 클릭되었을 때의 함수를 만든 다음 이 함수를 다음과 같이 수정
4.5 버튼 예제 실행 화면
5. 리스트 상자 수정 모드가 있는 리스트 상자. Insert키와 Delete 키에 대응하는 리스트상자. 사용자 그리기 리스트 상자.
6. 콤보 상자 7. 공용 대화 상자 문자입력 콤보 상자. 컨트롤 색상 바꾸기 파일 대화상자 폰트 대화상자 컬러 대화상자 프린트 대화상자 7. 공용 대화 상자
Q & A Thankyou !