제 10 장다양한뷰클래스 10.1 도큐먼트 10.2 파일입출력 10.3 다양한뷰클래스 실습 10-1 Formview를이용한문자를출력하고파일입출력 10.4 분할윈도우 실습 10-2 정적분할윈도우를이용한학생정보프로그램 10.5 다중뷰 실습 10-3 다중뷰만들기
도큐먼트 CDocument 클래스 데이터를관리하는클래스 OnNewDocument() 함수 새로운도큐먼트를만드는기능 Serialize() 함수 도큐먼트의내용을디스크로부터읽어오고, 저장하는기능 OnSaveDocument() 함수 OnOpenDocument() 함수
도큐먼트 CArchive 클래스 표준 C++ 라이브러리 iostream 과유사 도큐먼트의데이터를읽고쓰는이진삽입및추출연산자를정의 CArchive & operator << (CArchive &, Type &); 저장 CArchive & operator >> (CArchive &, Type &); 읽기 IsStoring() 함수 현재데이터를저장하고있는중인지, 데이터를읽고오고있는중인지알아내는함수 데이터를저장중이면 TRUE, 읽어오고있는중이면 FALSE 를반환
도큐먼트 Serialize() 함수 직렬화 (Serialization) 란하드디스크와같은저장매체에데이터를저장하고읽어들이는과정 기본적인기능은 CObject클래스의 Serialize() 함수에정의 도큐먼트클래스가자기자신의데이터를관리하므로도큐먼트클래스에 Serialize() 함수를오버라이딩하여사용한다.
도큐먼트 Serialize( ) 함수 void CPractice10_1Doc::Serialize(Carchive& ar) { if (ar.isstoring()) { ar << m_strid // 파일에데이터를저장 } else { ar >> m_strid // 파일로부터데이터를읽음 } }
파일입출력 데이터를저장할때 OnSaveDocument() 함수가실행 CFile 클래스를이용하여해당하는파일을열어 CArchive 클래스를통로로데이터를저장 데이터를읽어올때 OnOpenDocument() 함수가실행 CFile 클래스를이용하여해당하는파일을열어 CArchive 클래스를통로로데이터를읽어옴 Serialize() 함수 파일을저장하거나읽어올경우최후에데이터를저장하거나읽어오는함수
다양한뷰클래스 CView 클래스에서파생된클래스 CCtrlView 클래스와 CScrollView 클래스로나뉜다. CCtrlView : 뷰에서컨트롤의기능을지원 CScrollView: 일반적인뷰클래스의속성 +AddOn
다양한뷰클래스 다양한뷰클래스의종류와기능 클래스이름 CView CCtrlView CEditView CListView CRichEditView CTreeView CScrollView CFormView CDaoRecordView CHtmlView COleDBRecordView CRecordView 기능모든뷰클래스의기저클래스컨트롤기능뷰클래스의기저클래스에디트관련기능을구현하는뷰클래스리스트컨트롤의기능을구현하는뷰클래스리치에디트컨트롤의기능을구현하는뷰클래스트리컨트롤의기능을구현하는뷰클래스스크롤이가능한뷰클래스대화상자기반의문서 / 뷰구조를갖는뷰클래스 DAO를지원하는뷰클래스 HTML을지원하는뷰클래스 OLE DB를지원하는뷰클래스 ODBC를지원하는뷰클래스
다양한뷰클래스 폼뷰 (FormView) SDI 형태의프로그램구조를가지면서컨트롤을사용할수있는형태 CView 클래스에서상속받은형태이기때문에 CMainFrame의자식윈도우로서동작 대화상자처럼컨트롤을사용할수있다는점을제외하고는 CView 클래스에서상속받은 View와다른점은없다.
실습 10-1 FormView 를이용한문자출력및입출력 이번실습은폼뷰클래스내에서각컨트롤들을배치하고각컨트롤들을조작하여 Edit Control 에입력된글자를화면에출력하고, 출력된문자의위치와문자의색을바꾸는프로그램을작성하는것이다. 또한문자의위치, 색상, 내용을파일에저장하고여는기능을구현한다. 이번실습을통해폼뷰를이용한프로그램작성법및파일입출력을익힐수있다.
실습 10-1 프로그램작성순서 1) SDI 기반의프로젝트를생성한다. 마지막단계에서 View 클래스의기저클래스를 CFormView 로선택한다. 2) FormView 대화상자에컨트롤을배치하고속성을설정한다. Group Box, Edit Box, Button, Static Text 등 3) 컨트롤들을멤버변수에연결한다. 4) 필요한멤버변수를추가하고초기화한다. 입력한문자열의위치와색상을저장하는변수
실습 10-1 5) Button 에대한메시지를처리한다. 입력한문자열을출력하는메시지함수 글자색상을변경하는메시지함수 글자를지우는메시지함수 글자의위치를변경하는메시지함수들 6) 윈도우에문자열을출력하게한다. OnDraw( ) 함수에서문자열을출력한다. 7) Serialize() 함수를구현한다. 8) 프로그램을실행시킨다.
실습 10-1 실행결과
분할윈도우 분할윈도우 프레임의뷰영역을두개이상의영역으로나누어서보는것 동적분할윈도우 처음에는하나의뷰영역을나타내지만사용자가원하면뷰영역을나눌수있는것 정적분할윈도우 프로그램실행처음부터뷰영역이나누어져있는것 프로그램실행도중윈도우의영역을나눌수없다.
분할윈도우 동적윈도우생성방법 응용프로그램마법사에서자동생성 [ 사용자인터페이스기능 ] 단계의 [ 주프레임스타일 ] 항목에서 [ 분할창 ] 항목을체크한다. 자동생성된소스 CSplitterWnd 클래스의객체를멤버변수로선언 CSplitterWnd m_wndsplitter; OnCreateClient() 함수 return m_wndsplitter.create(this, 2, 2, CSize(10, 10), pcontext);
분할윈도우 정적윈도우생성방법 메인프레임클래스에 CSplitterWnd 클래스의객체를멤버변수로등록 클래스마법사에서 OnCreateClient() 함수를추가하고, CSplitterWnd 클래스의멤버함수인 CreateStatic() 함수를이용하여정적분할윈도우를생성한다. 각영역의특정뷰를설정하기위해서는 CreateView() 함수를이용한다.
실습 10-2 정적분할윈도우를이용한학생정보프로그램만들기 이번실습은정적분할윈도우를이용하여한쪽은리스트뷰, 다른한쪽은폼뷰를배치한다. 그리고폼뷰에서학생정보를입력하고리스트뷰에서보여주는프로그램이다. 입력한학생정보를수정, 삭제할수있도록한다.
실습 10-2 프로그램작성순서 1) SDI 기반의프로젝트를생성한다. 마지막단계에서 View 클래스의기저클래스를 CListView 로선택한다 2) 오른쪽분할영역에나타날폼뷰를생성한다. 대화상자를생성하고속성을설정한다. 속성에서 [styles] 에서 child 로 [Border] 에 None 대화상자에컨트롤을배치하고속성을설정한다. 생성된대화상자와연결할클래스를만든다. 3) Edit Control 들과멤버변수를연결한다.
실습 10-2 4) 정적분할윈도우를설정한다. CSpiltterWnd의객체생성 OnCreateClient() 함수추가 OnCreateClient() 함수에서 CreateView() 함수를이용하여분할윈도우를생성 5) 오른쪽리스트뷰에학생정보를추가한다. 추가버튼의명령핸들러함수작성 6) 오른쪽리스트뷰의학생정보를수정한다. 수정버튼의명령핸들러함수작성
실습 10-2 7) 오른쪽리스트뷰의학생정보를삭제한다. 삭제버튼의명령핸들러함수작성 8) 프로그램을실행시킨다.
실습 10-2 실행결과
다중뷰 다중뷰 하나의도큐먼트에여러가지의뷰가설정된형태 분할윈도우와다른점 뷰화면이나누어지는것이아니라뷰자체가변경 분할윈도우도다중뷰라말할수있다.
실습 10-3 다중뷰만들기 이프로그램은폼퓨에서문자를입력하고도큐먼트에저장시킨상태에서 [ 보기 ] 메뉴의 [ 뷰전환 ] 항목을선택하면일반뷰의형태로바뀐다. 이때폼퓨에서도큐먼트에저장시킨문자가일반뷰에도출력이된다. 일반뷰상태에서다시 [ 보기 ] 메뉴의 [ 뷰전환 ] 항목을선택하면폼뷰의형태로바뀐다. 이번실습을통해다중뷰의개념과구현방법을익힐수있다.
실습 10-3 프로그램작성순서 1) SDI 기반의프로젝트를생성한다. [ 생성된클래스 ] 단계에서 View 클래스의기저클래스를 CFormView 로선택한다 2) 새로운뷰클래스를생성한다. 3) 폼뷰의대화상자에컨트롤을배치한다. 4) 다중뷰를위한코드를입력한다. 5) 메뉴에 [ 뷰전환 ] 항목을만든다.
실습 10-3 6) 메뉴에대함메시지함수를작성한다. [ 뷰전환 ] 에대한메시지함수를작성한다. 7) 폼뷰에서입력한문자를도큐먼트에저장하고뷰전환시일반뷰에출력한다. 8) 프로그램을실행시킨다.
실습 10-3 실행결과
연습문제 10-1 폼뷰에서정보를입력한후 [ 확인 ] 버튼을누르면뷰영역에서마우스의움직임에따라정보가마우스를따라다니면서표시된다. 그리고왼쪽마우스를누르면데이터를 5 번까지출력하고오른쪽마우스를누르면출력된데이터를삭제하는프로젝트를작성한다.
연습문제 10-1 실행화면