MFC

CView클래스에 대해...Visual C++ 6 강좌(033)

디버그정 2008. 8. 30. 20:39
CView클래스에 대해...Visual C++ 6 강좌(033)
조회(278)
프로그래밍 | 2004/05/25 (화) 09:56
추천하기 | 스크랩하기(2)
Visual C++ 6 강좌(033)



10.AFX(Application Frameworks) (계속10)

4.CView

CView클래스도 CWnd클래스에서 상속받은 파생클래스입니다..그러니 메시지 핸들러 함수라든지
윈도우 자체를 제어하는 기능들을 다 포함하고 있는 셈이죠...

이 일반적인 원도우로서의 역할에다가 뷰윈도우로서의 고유한 역할을 추가한 것이 CView클래스
입니다..

벌써 설명을 다 했듯이 데이터를 여러 가지 방법으로 보여주는 역할을 하지요..
그리고 CFrameWnd나 CWndApp같은 클래스는 거의 대부분의 윈도우 응용프로그램들이 비슷비슷하게
가지고 있는 부분이지만 데이터를 처리하고 보여주는 등의 일을 하는 CView와 CDocument는
프로그램들마다 다르기 때문에 우리의 프로그래밍 실력은 여기서 판가름이 난다고 할 수 있죠..

CFrameWnd는 일관된 유저인터페이스와 관련이 깊기 때문에 다른 여타 프로그램들과 크게 다를
바가 없지만요 실제 우리가 이러이러한 기능을 하는 프로그램을 만든다 하면 그건 다른 프로그램
들과 다를 테니까 거의 대부분이 이 CView클래스와 CDocument클래스에 다가 이러한 내용을
넣어주기 때문에 실제 우리가 가장 많이 다루게 되고 가장 잘 알고 있어야 하는 부분입니다..

전에 설명했던 얘기를 간단히 요약해서 말씀드리자면,

우리가 이러이러한 기능을 하는 프로그램을 만든다고 하면 그러한 기능은 거의 CDocument에
넣게 되는데요..그 이유야 이 클래스가 데이터를 처리하고 저장하는 등의 일을 하기 때문이죠..

그런데..같은 데이터를 처리하였다 하더라도 이 데이터를 보여주는 방법은 정말 엄청나게 많거
든요?

예를 들어 우리가 증권투자를 도울 수 있는 주가분석프로그램을 만든다고 합시다..
그러면 주가와 관련된 데이터를 이러저러하게 처리하여 저장해야 되겠죠? 이렇게 해놓고..
이 처리된 결과를 뷰윈도우(클라이언트영역)에 보여줘야 하는데요..
만약 우리가 상장회사의 금일 주가변동을 시간대별로 보여줘야 한다면 어떻게 하면 될까요?

뭐 표를 만들어 가로축은 시간의 흐름을 세로축에는 상장회사별로 숫자로 보여 줄 수 도 있고요..
단순한 막대그래프 형태로 보여줄 수 있고요..아니면 곡선으로 보여줄 수 도 있고요..
고요...고요...고요...고요...정말 방법은 많겠죠?

데이터를 처리하고 저장하는 도큐먼트부분은 하나라도 보여주는 뷰부분은 여러개가 될 수 있겠죠?
그래서 뷰윈도우는 어찌됐던간에 어떤 도큐먼트와 연결되어있어야 합니다..

그렇지 않으면 이 뷰윈도가 어떤 도큐먼트에서 처리된 데이터를 보여주는 지 알길이 없으니까요..

그리고 도큐먼트의 입장에서 보면 하나의 도큐먼트가 여러개의 뷰를 가질 수 있는 셈이지요..

사실 지금으로선 이정도의 설명으로 CView클래스의 대한 설명은 끝입니다..

그러면 AppWizard가 CView클래스에서 상속받아 만들어준 파생클래스 CMyView를 한번보지요..

CView클래스가 선언된 부분이 저장되어 있는 헤더파일(MyView.h)를 한번볼까요?
어떻게 선언되 있는지 보게요...어떻게 찾지요? 예 워크스페이스의 FileView탭을 클릭해서
거기에 있는 Header Files 라는 폴더를 클릭해 주면 모든 헤더파일이 다 사이좋게 모여있죠?
거기에서 MyView.h를 클릭하면 되죠..

지금까지 계속 이런식으로 파일을 찾았는데요.. 더 간단한 방법이 있습니다..
우리가 실제로 프로그램을 짤 때는 ClassView탭에 놓고 작업을 하는데요...
거기서 어떤 클래스의 헤더파일이나 소스파일을 보고 싶을 때 지금까지 한 방법으로 FileView탭
으로 이동해서 찾아도 되지만요.좀 성가시죠...
더 쉽게 보려면 그냥 ClassView탭상에서 클래스 이름을 더블클릭하면 그 클래스가 선언되어 있는
헤더파일을 보여줍니다.. 간단하죠..
그리고 그 클래스의 어떤 멤버함수를 클릭하면 그 멤버함수가 정의되어 있는 부분을 보여주는데..
그 보여주는 부분은 곧 그 클래스의 멤버함수가 정의되어 있는 소스파일(cpp)중에 우리가 클릭한
멤버함수의 정의부분이 되는 셈이죠...

그럼 한번 ClassView의 CMyView클래스를 더블클릭해 보세요... 좀전에 CFileView에서 우리가
찾아서 클릭한 MyView.h의 내용이 똑같이 나오죠...편리하군요...

그럼 진짜로 한번 훑어 보세요...

뭔소리를 하는건지...우리는 여기서 두가지 멤버함수만 기억해 두면 그걸로 족합니다..

뷰가 하는 역할이라는게..도큐먼트에서 처리되어 저장되어 있는 데이터를 가져다가 화면에 보여
주는거잖아요..그게 거의 전부죠..

그러면 앞에서 설명하였다시피...그렇다면 어떤 도큐먼트의 내용을 보여주자면..두 개의 두분으로
나뉘어 지겠군요..어떤 도큐먼트의 내용을 보여주는건지 일단 알아야 보여주던지 말던지..할테니
도큐먼트에 저장된 데이터를 가져오기 위해선 도큐먼트를 얻어와야 해야겠죠.. 그리고 얻어왔다면
보여주면 되는거죠..
그런데 보여주는 기능은 크게 두가지로 나눌 수 있습니다.. 너무나 당연한 얘기지만..
화면에 즉 모니터를 통해 직접 보여 줄 수도 있고...프린터를 해서 보여줄 수도 있잖아요?
그래서 화면에 보여주는 기능과 프린터 기능이 있겠지요..
그리고 어떤 내용을 어떻게 보여주느냐하는 문제는 순전히 프로그래머 맘데로입니다.
너무나 당연한 얘기지요..
이런이런 내용을 이렇게 보여주라는 법은 없으니까요...이 부분에서 여러분의 아이디어와
프로그래밍 실력이 결합해서 정말 쥑이는 프로그램이 나올 수 있는 거죠...

또 기름끼 좌악 빼서 보면 다음과 같이 되어 있습니다...

Class CMyView: public CView
{
public:
CMyDoc* GetDocument();
Virtual void OnDraw(CDC* pDC);
protected;
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
};

정말 기름끼 쫙 빼군요...

맨위의 문장은 CMyView가 AFX클래스인 CView에서 public으로 상속받은 파생클래스라는 얘기구요..
다 아시죠?
그 다음 public로 선언되어 있는 함수들은 외부사용이 가능한 멤버함수라는 말이구요..
그 아래 protected로 선언되어 있는 함수들은 이 클래스의 내부적으로나 파생클래스 즉, 우리가
만든(사실은 AppWizard가 만들어준) CMyView를 상속받을 파생클래스(현재로선 없지요..)내부에서
사용가능하지만 외부사용은 안된다는 의미이지요..

위에서 설명했던 도큐먼트를 얻어오는 역할을 GetDocument함수가 있군요...
선언된 모양을 보니 도큐먼트의 더정확히 말하면 도큐먼트 클래스의 포인터를 얻어오는군요..
즉 CMyDoc이라는 클래스형의 포인터를 반환한다는 말이죠.. 우리는 이 포인터를 가지고 도큐먼트의
데이터를 이렇게 보여줄 수 있습니다..

그리고 실제로 보여주는 기능을 함수인 OnDraw라는 멤버함수가 보입니다..
실제 이 멤버함수가 CView클래스의 대부분의 역할을 담당한다고 볼 수 있습니다..
우리는 이 함수안에다 실제로 보여주는 기능을 넣어 주면 되는 거죠..
이렇게 다 만들어져 있으니 정말 편리하기 그지 없습니다..

어떻게 정의되어 있는지 볼까요..
워크스페이스에 CMyView클래스를 보면 OnDraw함수가 있지요?
클릭해 보세요.. 어떻게 되어 있습니까?

CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

//TODO: add draw code for native data here
}
음~~역시 예상한데로 별내용 없군요..
일단 GetDocument를 호출했군요..
CMyDoc형으로 선언된 pDoc이라는 포인터에 GetDocument가 반환하는 현재 도큐먼트의 포인터를
저장하죠.. 그럼 우리는 이 pDoc이라는 포인터를 이용하여 도큐먼트의 저장된 데이터를 참조
할 수 있는겁니다..
주석문에 //TODO라는 부분에다가 우린 실제로 어떤 데이터를 어떻게 보여주는지를 넣어주어야
겠지요..이걸로 끝~~~


클래스 선언부분으로 돌아와서 OnDraw함수밑에 보니 On어쩌구Printing이라는 함수가 세 개
있군요...Printing이라는 말을 보니 프린터 출력과 관계된 함수인거 같죠?
이 프린터를 출력하는 부분은 뒤에서 설명하도록 하구요...

우리가 CView라는 클래스를 보면서 기억해야 할 부분은 3가지 정도입니다..
이것만 기억해 주고 넘어가면 되는 거죠..

* CView는 CWnd에서 파생되었으므로 윈도우자체를 제어하고 메시지 핸들러 함수를 이용할 수
있다.
* CView함수의 고유한 부분은 도큐먼트를 얻어 그 내용을 보여주는 것이다..
* 보여주는 기능은 실제로 OnDraw함수에 구현하고 특별히 프린터로 출력하는 부분은 프린터
관련함수를 이용하여 보여 준다..

이것으로 CView클래스의 내용은 마치구요.. 다음은 CDocument클래슬 살펴보죠...