MFC :: Chapter 10 (다양한 뷰 클래스, 분할 윈도우, 다중 뷰) - 103번째 이야기
다양한 뷰 클래스
뷰 클래스는 프로그램에서 데이터를 입력받기도 하지만 주로 도큐먼트의 데이터를 표현하고 출력하는 역할을 한다. MFC에서는 데이터를 다양하게 표현하기 위한 여러 클래스들을 제공하고 있는데 이들은 모두 CView 클래스에서 파생된 것들이다.
폼 뷰는 CView 클래스를 상속받은 SDI 형태의 프로그램 구조를 갖고 있으면서도 컨트롤을 사용할 수 있는 형태를 말한다. 위 그림에서 처럼 CFormView의 계층도를 보면 알 수 있듯이 CView 클래스에서 상속받은 형태이기 때문에 CMainFrame 클래스의 자식 윈도우로서 동작 하게 된다. CDialog 클래스와 마찬가지로 CFormView 클래스를 상속받아서 사용자 정의의 폼 뷰 프로그램을 작성할 수 있다.
폼 뷰 형태의 프로그램은 자식 윈도우 내에서 대화상자처럼 컨트롤을 사용할 수 있다는 점을 제외하고는 CView 클래스에서 상속받은 View와 다른 점은 없다. CFormView 클래스를 상속받아서 프로젝트를 생성하면 하나의 템플릿으로 구성된 클래스 구조를 갖는 애플리케이션을 생성할 수 있다.
분할 윈도우
분할 윈도우(Split Windows)라는 것은 프레임 뷰 영역을 두 개 이상의 영역으로 나누어서 보여주기 위한 것이다. 분할된 뷰 영역에서 같은 내용을 보이기도 하지만 주 사용 목적은 관련 있는 데이터를 서로 다른 모습으로 보이거나 도큐먼트의 서로 다른 부분을 보여주기 위함이다. 분할 윈도우에는 동적 분할 윈도우와 정적 분할 윈도우가 있다.
동적 분할 윈도우는 처음에는 하나의 뷰 영역을 나타내지만 사용자가 원하면 뷰 영역을 나눌 수 있는 것이고 정적 분할 윈도우는 프로그램 실행 처음부터 뷰 영역이 나뉘어져 있는 것이다. 정적 분할 윈도우는 동적 분할 윈도우와는 달리 프로그램 실행 도중에 윈도우의 영역을 나눌 수 없다.
동적 분할 윈도우는 별 다른 코드의 추가 없이 AppWizard에서 자동적으로 만들어 주며, 정적 분할 윈도우는 CMainFrame 클래스의 멤버 함수인 OnCreateClient() 함수에서 CSplitterWnd 클래스의 CreateStatic() 함수를 이용하여 만들 수 있다.
OnCreateClient() 함수
OnCreateClient() 함수는 프레임 윈도우의 클라이언트 영역이 생성될 때 애플리케이션 프레임워크로부터 호출되는 함수이다. 분할 윈도우를 사용하기 위해서 CSplitterWnd 클래스의 객체를 메인 프레임 클래스에 멤버 변수로 등록하였는데 이 객체를 OnCreateClient() 함수 내에서 Create() 함수나 CreateStatic() 함수를 통해서 분할 윈도우를 생성하는 것이다.
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
( lpcs : 윈도우 CREATESTRUCT 구조를 위한 포인터
pContext : CCreateContext 구조를 위한 포인터 )
CreateStatic() 함수
CreateStatic() 함수는 정적 분할 윈도우를 만들기 위한 멤버 함수로 함수의 원형은 다음과 같다.
BOOL CreateStatic (CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);
( pParentWnd : 분할 윈도우의 부모 프레임 윈도우 핸들
nRows : 행의 수
nCols : 열의 수
dwStyle : 윈도우 스타일 명시
nID : 윈도우의 차일드 윈도우 ID )
CreateView() 함수
CreateView() 함수는 정적 분할 윈도우 창을 생성하기 위해 호출되는 멤버 함수로 동적 분할 윈도우의 사용자가 창(영역) 열 또는 행을 분할하고자 할 때 새창을 생성해 준다. 이 함수의 원형은 다음과 같다.
virtual BOOL CreateView(int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext);
( row : 새로운 뷰 윈도우를 위한 분할 윈도우의 행
col : 새로운 뷰 윈도우를 위한 분할 윈도우의 열
pViewClass : 새로운 뷰의 CRunTimeClass를 명시
sizeInit : 새로운 뷰 윈도우의 처음 크기
pContext : 새로운 뷰 윈도우와 연결하고자 하는 도큐먼트의 정보를 가지는 포인터 )
다중 뷰
다중 뷰 역시 하나의 도큐먼트에 여러 가지 뷰가 설정된 형태이나 분할 윈도우와 다른 점은 뷰 화면이 나뉜것이 아니라 뷰 자체가 바뀐다는 것이다. 그러나 분할 윈도우 역시 다중 뷰라고 말할 수 있다. Practice10_3.zip 참조
)
SetActiveView() 함수
SetActiveView() 함수는 CFrameWnd 클래스의 멤버 함수로 특정 뷰를 활성화되어 있는 뷰로 설정한다. 함수의 원형은 다음과 같다.
void SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);
( pViewNew : CView 객체를 위한 포인터 명시
bNotify : 활성화 된 뷰인지를 명시 )
SetDlgCtrlID() 함수
SetDlgCtrlID() 함수는 윈도우 ID, 컨트롤 ID를 설정하는 함수로 원형은 다음과 같다.
int SetDlgCtrlID(int nID);
( nID : 컨트롤의 ID를 설정하기 위한 값 )
RecalcLayout() 함수
RecalcLayout() 함수는 프레임 윈도우 크기를 재설정하거나 표준 컨트롤 바들이 on 또는 off로 토글될 때 프레임워크에 의해서 호출되는 함수이다. 이 함수의 원형은 다음과 같다.
virtual void RecalcLayout(BOOL bNotify = TRUE);
( bNotify : 프레임 윈도우가 레이아웃 변경의 보고를 얻기 위해 아이템의 활성인자를 결정한다 )
CCreateContext 클래스
CCreateContext 클래스는 현재 인스턴스화된 도큐먼트에 대한 정보를 가지고 있는 클래스다. 템플릿 개념에서 뷰는 도큐먼트와 쌍으로 존재한다고 설명했다. 그렇기 때문에 새로운 뷰가 생성되기 위해서는 현재 사용되고 있는 도큐먼트에 대한 정보가 있어야 한다. 이 도큐먼트에 대한 정보를 가지고 있는 클래스가 바로 CCreateContext이다.
뷰 클래스는 프로그램에서 데이터를 입력받기도 하지만 주로 도큐먼트의 데이터를 표현하고 출력하는 역할을 한다. MFC에서는 데이터를 다양하게 표현하기 위한 여러 클래스들을 제공하고 있는데 이들은 모두 CView 클래스에서 파생된 것들이다.
( CView 클래스에서 파생된 클래스 )
위 그림은 CView 클래스에서 파생된 클래스들을 나타낸 것이다. CView 클래스에서 파생된 클래스는 크게 CCtrlView 클래스와 CScrollView 클래스로 나뉜다. CCtrlView 클래스는 컨트롤들의 기능을 뷰 차원에서 지원할 수 있도록 한 클래스이고 CScrollView 클래스는 그 외 일반적인 뷰의 기능을 구현한다. 다음 표는 각각의 뷰 클래스에 대해 설명하고 있다.
|
플래그 값 |
내 용 |
| CView | 모든 뷰 클래스들의 기저 클래스 |
| CCtrlView | 컨트롤기능 뷰 클래스들의 기저 클래스 |
| CEditView | 에디트 관련 기능을 구현하는 뷰 클래스 |
| CListView | 리스트 컨트롤의 기능을 구현하는 뷰 클래스 |
| CRichEditView | 리치에디트 컨트롤의 기능을 구현하는 뷰 클래스 |
| CTreeView | 트리 컨트롤의 기능을 구현하는 뷰 클래스 |
| CScrollView | 스크롤이 가능한 뷰 클래스 |
| CFormView | 대화상자 기반의 문서 뷰 구조를 갖는 뷰 클래스 |
| CDaoRecordView | DAO를 지원하는 뷰 클래스 |
| CHtmlView | HTML 문서를 보여주는 뷰 클래스 |
| COleDBRecordView | OLE DB를 지원하는 뷰 클래스 |
| CRecordView | ODBC를 지원하는 뷰 클래스 |
폼 뷰는 CView 클래스를 상속받은 SDI 형태의 프로그램 구조를 갖고 있으면서도 컨트롤을 사용할 수 있는 형태를 말한다. 위 그림에서 처럼 CFormView의 계층도를 보면 알 수 있듯이 CView 클래스에서 상속받은 형태이기 때문에 CMainFrame 클래스의 자식 윈도우로서 동작 하게 된다. CDialog 클래스와 마찬가지로 CFormView 클래스를 상속받아서 사용자 정의의 폼 뷰 프로그램을 작성할 수 있다.
폼 뷰 형태의 프로그램은 자식 윈도우 내에서 대화상자처럼 컨트롤을 사용할 수 있다는 점을 제외하고는 CView 클래스에서 상속받은 View와 다른 점은 없다. CFormView 클래스를 상속받아서 프로젝트를 생성하면 하나의 템플릿으로 구성된 클래스 구조를 갖는 애플리케이션을 생성할 수 있다.
분할 윈도우
분할 윈도우(Split Windows)라는 것은 프레임 뷰 영역을 두 개 이상의 영역으로 나누어서 보여주기 위한 것이다. 분할된 뷰 영역에서 같은 내용을 보이기도 하지만 주 사용 목적은 관련 있는 데이터를 서로 다른 모습으로 보이거나 도큐먼트의 서로 다른 부분을 보여주기 위함이다. 분할 윈도우에는 동적 분할 윈도우와 정적 분할 윈도우가 있다.
동적 분할 윈도우는 처음에는 하나의 뷰 영역을 나타내지만 사용자가 원하면 뷰 영역을 나눌 수 있는 것이고 정적 분할 윈도우는 프로그램 실행 처음부터 뷰 영역이 나뉘어져 있는 것이다. 정적 분할 윈도우는 동적 분할 윈도우와는 달리 프로그램 실행 도중에 윈도우의 영역을 나눌 수 없다.
동적 분할 윈도우는 별 다른 코드의 추가 없이 AppWizard에서 자동적으로 만들어 주며, 정적 분할 윈도우는 CMainFrame 클래스의 멤버 함수인 OnCreateClient() 함수에서 CSplitterWnd 클래스의 CreateStatic() 함수를 이용하여 만들 수 있다.
OnCreateClient() 함수
OnCreateClient() 함수는 프레임 윈도우의 클라이언트 영역이 생성될 때 애플리케이션 프레임워크로부터 호출되는 함수이다. 분할 윈도우를 사용하기 위해서 CSplitterWnd 클래스의 객체를 메인 프레임 클래스에 멤버 변수로 등록하였는데 이 객체를 OnCreateClient() 함수 내에서 Create() 함수나 CreateStatic() 함수를 통해서 분할 윈도우를 생성하는 것이다.
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
( lpcs : 윈도우 CREATESTRUCT 구조를 위한 포인터
pContext : CCreateContext 구조를 위한 포인터 )
CreateStatic() 함수
CreateStatic() 함수는 정적 분할 윈도우를 만들기 위한 멤버 함수로 함수의 원형은 다음과 같다.
BOOL CreateStatic (CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);
( pParentWnd : 분할 윈도우의 부모 프레임 윈도우 핸들
nRows : 행의 수
nCols : 열의 수
dwStyle : 윈도우 스타일 명시
nID : 윈도우의 차일드 윈도우 ID )
CreateView() 함수
CreateView() 함수는 정적 분할 윈도우 창을 생성하기 위해 호출되는 멤버 함수로 동적 분할 윈도우의 사용자가 창(영역) 열 또는 행을 분할하고자 할 때 새창을 생성해 준다. 이 함수의 원형은 다음과 같다.
virtual BOOL CreateView(int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext);
( row : 새로운 뷰 윈도우를 위한 분할 윈도우의 행
col : 새로운 뷰 윈도우를 위한 분할 윈도우의 열
pViewClass : 새로운 뷰의 CRunTimeClass를 명시
sizeInit : 새로운 뷰 윈도우의 처음 크기
pContext : 새로운 뷰 윈도우와 연결하고자 하는 도큐먼트의 정보를 가지는 포인터 )
다중 뷰
다중 뷰 역시 하나의 도큐먼트에 여러 가지 뷰가 설정된 형태이나 분할 윈도우와 다른 점은 뷰 화면이 나뉜것이 아니라 뷰 자체가 바뀐다는 것이다. 그러나 분할 윈도우 역시 다중 뷰라고 말할 수 있다. Practice10_3.zip 참조
)
SetActiveView() 함수
SetActiveView() 함수는 CFrameWnd 클래스의 멤버 함수로 특정 뷰를 활성화되어 있는 뷰로 설정한다. 함수의 원형은 다음과 같다.
void SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);
( pViewNew : CView 객체를 위한 포인터 명시
bNotify : 활성화 된 뷰인지를 명시 )
SetDlgCtrlID() 함수
SetDlgCtrlID() 함수는 윈도우 ID, 컨트롤 ID를 설정하는 함수로 원형은 다음과 같다.
int SetDlgCtrlID(int nID);
( nID : 컨트롤의 ID를 설정하기 위한 값 )
RecalcLayout() 함수
RecalcLayout() 함수는 프레임 윈도우 크기를 재설정하거나 표준 컨트롤 바들이 on 또는 off로 토글될 때 프레임워크에 의해서 호출되는 함수이다. 이 함수의 원형은 다음과 같다.
virtual void RecalcLayout(BOOL bNotify = TRUE);
( bNotify : 프레임 윈도우가 레이아웃 변경의 보고를 얻기 위해 아이템의 활성인자를 결정한다 )
CCreateContext 클래스
CCreateContext 클래스는 현재 인스턴스화된 도큐먼트에 대한 정보를 가지고 있는 클래스다. 템플릿 개념에서 뷰는 도큐먼트와 쌍으로 존재한다고 설명했다. 그렇기 때문에 새로운 뷰가 생성되기 위해서는 현재 사용되고 있는 도큐먼트에 대한 정보가 있어야 한다. 이 도큐먼트에 대한 정보를 가지고 있는 클래스가 바로 CCreateContext이다.



Practice10_1.rar
댓글을 달아 주세요.