MFC

강력한 에디터 CRichEditView

디버그정 2008. 8. 30. 18:17

강력한 에디터 CRichEditView

도큐먼트를 파일에 저장하는 부분에 강력한 에디터를 소개하는것이 걸맞지 않다고 생각할지 모릅니다. 그러나 많은 양의 데이터를 저장한다고 가정을 할경우 에디터가 가장 편리하기 때문에 파일입출력 항목에 RichEdit에 대한 설명을 포함시켰습니다. 본장에서 만들 예제는 MExSer입니다. 이 프로젝트를 만들때 이제는 SDI를 이용합니다. Multiple Document Interface형태로 프로젝트를 만든다는 것입니다. 이프로젝트를 만들때 Step6에서 MExSerView를 CRichEditView를 Base class로 설정합니다. 그림 1은 MExSer 프로젝트를 만들때 AppWizard의 Step6의 화면입니다.

               (그림 1)MExSer 프로젝트 제작시 Step6


위와 같이 만든후에 컴파일하고 실행하면 View자체가 하나의 에디터로 구동되는 것을 알수 있을것입니다.

또한 파일저장및 오픈기능이 자동적으로 처리됩니다. 즉 아무런 프로그래밍 코딩없이 간단하게 에디터를 만들게 된것입니다. 또한 OLE 기능까지 완벽하게 제공되기 때문에 객체 삽입을 통해서 원하는 데이터를 완벽하게 이용할수 있습니다. 그림 2는 아무런 코딩없이 간단하게 처리된 MExSer의 실행모습입니다.

               (그림 2) MExSer 실행결과


CRichEditView는 CRichEditCtrl 컨트롤을 포함하고 있는 View입니다. RichEdit에대해서 좀더 자세히 알고 싶은 분은 도움말 샘플프로그램으로 제공하는 WordPad를 참조하시기 바랍니다. 우리가 본예제에서 주목하는 점은 코딩 한줄 없이 어떻게파일에 자동적으로 저장하고 다시 읽어 오는가입니다.  이부분에 대한 해답이 CMExSerDoc의 Serialize 함수에 있습니다. CMExSerDoc의 Serialize함수는 다음과 같습니다.


void CMExSerDoc::Serialize(CArchive& ar)

{

       if (ar.IsStoring())

       {

               // TODO: add storing code here

       }

       else

       {

               // TODO: add loading code here

       }


       // Calling the base class CRichEditDoc enables serialization

       //  of the container document's COleClientItem objects.

       CRichEditDoc::Serialize(ar);

}


CArchive ar이라는 함수는 현재 도큐먼트와 연결되어 있는 파일와 연결된 파이프라고 생각하시면 됩니다. 이파이프가 인자로 넘어오는 Serialize함수는 File메뉴에서 Open이나 Save 또는 Save as 를 기능을 사용할때 가동됩니다. File메뉴에서 Open항목을 선택해서 파일 대화상자를 구동시키고 특정 파일명을 입력한다음 OK버튼을 클릭하면 현재 데이터를 보관하는 Document의 OnOpenDocument함수가 실행됩니다. 이함수는 CDocument의 맴버함수로 되어 있기 때문에 소스에 기록되어 있지 않아도 바로 호출이 되는 것입니다. MExSer에서 File메뉴에서 Open 항목을 선택하면 MExSerDoc의 맴버함수인 OnOpenDocument가 실행됩니다. 이하수가 실행되면서 CDocument의 내부에서는 CFile크래스의 맴버변수를 이용하여 파일을 열고 이파일에 데이터를 넣을수 있는 파이프를 만듭니다. 이파이프가 바로 CArchive 입니다. 이클래스의 변수 ar를 Document의 Serialize의 인자로 넘겨주면서 Serialize가 실행되는 것입니다. 이 CArchive의 맴버함수중에 IsStoring() 함수를 실행시키면 현재 파일에 저장하고자 하는 의미로 CArchive를 만들었다면 TRUE로 그렇지 않다면 FALSE를 리턴합니다. 위의 Serialize 함수에서 ar.IsStoring() 이용하여 두개를 분리한것은 ar.IsStoring() TRUE이면 저장으로 그렇지 않으면 읽기로 구동하기 위해서입니다. 위에서는 Open항목만 설명하였으나 Save,Save as일때도 똑같이 ar를 만들어서 인자로 넘겨주면서 Serialize가 실행되기 때문입니다.

에를 들어어 도큐먼트에 다음과 같은 데이터가 있다고 합시다.

int number=365;

char *data='test:

위의 Serialize에서 위의 두개의 데이터를 파일에 넣고 또는 파일에서 읽어오자고 할경우에는 다음과 같이 할수가 있습니다.


void CMExSerDoc::Serialize(CArchive& ar)

{

       if (ar.IsStoring())

       {

         ar << number;//파일에 number값을 기록

         ar << data;//파일에 data를 기록

       }

       else

       {

         ar >> number;//파일에서 number를 읽는다.

         ar >> data;//파일에서 data를 읽는다.

       }

       :

}


<<와 >>의 기호로 아주 간단하게 파일에 데이터를 기록할수 있는 것입니다. 프로그래밍 할때 가장 어렵거나 귀찮은 부분이라면 파일입출력입니다. 그런데 MFC에서 도큐먼트의 Serialize함수를 이용한다면 이런 부분이 말끔하게 해결이 되는 것입니다.

이제 Serialize와 ar의 기능을 어느정도는 이해를 했습니다. 그런데 저장하고 읽는 부분은 공백으로 되어있습니다. 그럼 에디터에서 입력한 데이터는 도대체 어디에서 저장하는함수가 호출될까요? 위의 Serialize의 마지막줄에 있는 다음과 같은 내용이 해답입니다.


       CRichEditDoc::Serialize(ar);

즉 파일과 연결된 파이프라인 클래스 CArchive형의 변수 ar를 CRichEditDoc클래스의 Serialize로 넘겨주어서 이파이프라인에 CRichEditView에서 입력한 데이터를 저장하게 되는 것입니다. CArchive형을 받아서 파일에 데이터를 기록하는 몇개의 클래스들이 있습니다. 이런 클래스들은 도큐먼트의 Serialize에 넘어온 인자 ar만 바로 넘겨주면 되는 것입니다. CRichEditView는 CRichEditDoc와 쌍을 이룹니다. 이렇게 쌍을 이루기때문에 MExSerDoc는 CDocument를 상속받은것이 아니라 CRichEditDoc를 상속받았습니다. 따라서 base 클래스인 CRichEditDoc의 Serialize를 호출함으로써 에디터에 입력한 데이터를 손쉽게 파일로 저장하는 것입니다.

본예제에서 우리는 한가지는 알고 넘어가야 합니다. 즉 데이터를 저장하고 읽는 것을 담당하는 것이 바로 Serialize 라는 사실과 이 함수에 인자로 넘어온 ar에 <<나 또는 >>을 이용하여 데이터를 기록할수 있다는 사실입니다.


[출처] [퍼옴]MFC06|작성자 에릭

'MFC' 카테고리의 다른 글

CView클래스에 대해...Visual C++ 6 강좌(033)  (0) 2008.08.30
CView 클래스  (1) 2008.08.30
MFC 메시지 맵의 구현 원리  (2) 2008.08.30
◎ MFC Class 레퍼런스(한글번역)  (0) 2008.08.30
지킴이 기초 강좌  (1) 2008.08.29
CCmdTarget Class MFC  (1) 2008.08.07
MFC 클래스의 최상위 클래스 CObject  (2) 2008.08.07