다음을 통해 공유


다중 페이지 문서

이 문서에서는 Windows 인쇄 프로토콜에 대해 설명하고 둘 이상의 페이지가 포함된 문서를 인쇄하는 방법을 설명합니다. 이 문서에서는 다음 항목을 다룹니다.

인쇄 프로토콜

여러 페이지 문서를 인쇄하기 위해 프레임워크와 뷰는 다음과 같은 방식으로 상호 작용합니다. 먼저 프레임워크에서 인쇄 대화 상자를 표시하고, 프린터에 대한 디바이스 컨텍스트를 만들고, CDC 개체의 StartDoc 멤버 함수를 호출합니다. 그런 다음 문서의 각 페이지에 대해 프레임워크는 개체의 StartPage 멤버 함수를 CDC 호출하고 뷰 개체에 페이지를 인쇄하도록 지시하고 EndPage 멤버 함수를 호출합니다. 특정 페이지를 시작하기 전에 프린터 모드를 변경해야 하는 경우 뷰는 ResetDC를 호출하여 새 프린터 모드 정보를 포함하는 DEVMODE 구조를 업데이트합니다. 전체 문서가 인쇄되면 프레임워크는 EndDoc 멤버 함수를 호출합니다.

뷰 클래스 함수 재정의

CView 클래스는 인쇄 중에 프레임워크에서 호출하는 여러 멤버 함수를 정의합니다. 뷰 클래스에서 이러한 함수를 재정의하여 프레임워크의 인쇄 논리와 뷰 클래스의 인쇄 논리 간에 연결을 제공합니다. 다음 표에서는 이러한 멤버 함수를 나열합니다.

CView의 재정의 가능한 인쇄 함수

이름 재정의 이유
OnPreparePrinting 인쇄 대화 상자, 특히 문서의 길이에 값을 삽입하려면
OnBeginPrinting 글꼴 또는 기타 GDI 리소스를 할당하려면
OnPrepareDC 지정된 페이지에 대한 디바이스 컨텍스트의 특성을 조정하거나 인쇄 시간 페이지 매김을 수행하려면
Onprint 지정된 페이지를 인쇄하려면
OnEndPrinting GDI 리소스 할당을 취소하려면

다른 함수에서도 인쇄 관련 처리를 수행할 수 있지만 이러한 함수는 인쇄 프로세스를 구동하는 함수입니다.

다음 그림에서는 인쇄 프로세스와 관련된 단계를 보여 줍니다. 각 CView인쇄 멤버 함수가 호출되는 위치를 보여 줍니다. 이 문서의 나머지 부분에는 이러한 단계의 대부분이 자세히 설명되어 있습니다. 인쇄 프로세스의 추가 부분은 GDI 리소스 할당 문서에 설명되어 있습니다.

Printing loop process.
인쇄 루프

페이지 매김

프레임워크는 인쇄 작업에 대한 많은 정보를 CPrintInfo 구조에 저장합니다. 페이지 매김과 CPrintInfo 관련된 값 중 일부는 다음 표와 같이 액세스할 수 있습니다.

CPrintInfo에 저장된 페이지 번호 정보

멤버 변수 또는

함수 이름
참조된 페이지 번호
GetMinPage/SetMinPage 문서의 첫 페이지
GetMaxPage/SetMaxPage 문서의 마지막 페이지
GetFromPage 인쇄할 첫 번째 페이지
GetToPage 인쇄할 마지막 페이지
m_nCurPage 현재 인쇄 중인 페이지

페이지 번호는 1부터 시작합니다. 즉, 첫 번째 페이지는 0이 아닌 1로 번호가 매겨집니다. 이러한 멤버와 CPrintInfo의 다른 멤버에 대한 자세한 내용은 MFC 참조를 참조하세요.

인쇄 프로세스의 시작 부분에서 프레임워크는 뷰의 OnPreparePrinting 멤버 함수를 호출하여 구조체에 포인터를 CPrintInfo 전달합니다. 애플리케이션 마법사는 다른 멤버 함수인 OnPreparePrinting DoPreparePrinting을 호출 하는 구현을 CView제공합니다. DoPreparePrinting 는 인쇄 대화 상자를 표시하고 프린터 디바이스 컨텍스트를 만드는 함수입니다.

이 시점에서 애플리케이션은 문서에 있는 페이지 수를 모릅니다. 문서의 첫 번째 페이지와 마지막 페이지의 수에는 기본값 1과 0xFFFF 사용합니다. 문서에 있는 페이지 수를 알고 있는 경우 문서를 보내기 전에 구조체에 대해 [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage)를 재정 OnPreparePrinting 의하고 호출합니다DoPreparePrinting.CPrintInfo 이렇게 하면 문서의 길이를 지정할 수 있습니다.

DoPreparePrinting 그런 다음 인쇄 대화 상자를 표시합니다. 반환될 때 구조체 CPrintInfo 에는 사용자가 지정한 값이 포함됩니다. 사용자가 선택한 페이지 범위만 인쇄하려는 경우 인쇄 대화 상자에서 시작 및 끝 페이지 번호를 지정할 수 있습니다. 프레임워크는 CPrintInfoGetFromPage 함수를 GetToPage 사용하여 이러한 값을 검색합니다. 사용자가 페이지 범위를 지정하지 않으면 프레임워크는 반환된 값을 호출 GetMinPage 하고 GetMaxPage 사용하여 전체 문서를 인쇄합니다.

인쇄할 문서의 각 페이지에 대해 프레임워크는 뷰 클래스의 두 멤버 함수인 OnPrepareDCOnPrint를 호출하고 각 함수에 CDC 개체에 대한 포인터와 구조체에 대한 포인터 CPrintInfo 라는 두 개의 매개 변수를 전달합니다. 프레임워크가 호출 OnPrepareDCOnPrint때마다 구조체의 CPrintInfo m_nCurPage 멤버에 다른 값을 전달합니다. 이러한 방식으로 프레임워크는 인쇄해야 하는 페이지를 보기에 알려줍니다.

OnPrepareDC 멤버 함수도 화면 표시에 사용됩니다. 그리기 전에 디바이스 컨텍스트를 조정합니다. OnPrepareDC 는 인쇄에서 비슷한 역할을 수행하지만 몇 가지 차이점이 있습니다. 첫째, CDC 개체는 화면 디바이스 컨텍스트 대신 프린터 디바이스 컨텍스트를 나타내고, 둘째, CPrintInfo 개체는 두 번째 매개 변수로 전달됩니다. (이 매개 변수는 화면 표시를 위해 NULL OnPrepareDC 이 호출됩니다.) 인쇄할 페이지에 따라 디바이스 컨텍스트를 조정하려면 재정 OnPrepareDC 의합니다. 예를 들어 뷰포트 원본 및 클리핑 영역을 이동하여 문서의 적절한 부분이 인쇄되도록 할 수 있습니다.

OnPrint 멤버 함수는 페이지의 실제 인쇄를 수행합니다. 기본 인쇄가 수행되는 방법 문서에서는 프레임워크가 프린터 디바이스 컨텍스트를 사용하여 OnDraw를 호출하여 인쇄를 수행하는 방법을 보여줍니다. 보다 정확하게 말하면 프레임워크는 구조 및 디바이스 컨텍스트를 사용하여 호출 OnPrint CPrintInfo 하고 OnPrint 디바이스 컨텍스트를 OnDraw전달합니다. 화면 표시가 아닌 인쇄 중에만 수행해야 하는 렌더링을 수행하도록 재정 OnPrint 의합니다. 예를 들어 머리글 또는 바닥글을 인쇄하려면(자세한 내용은 문서 머리글 및 바닥글 참조). 그런 다음, 화면 표시 및 인쇄 모두에 공통적인 렌더링을 수행하려면 재정의 OnPrint 에서 호출 OnDraw 합니다.

화면 표시 및 인쇄 모두에 대한 렌더링을 수행한다는 OnDraw 사실은 애플리케이션이 WYSIWYG라는 것을 의미합니다. 그러나 WYSIWYG 애플리케이션을 작성하지 않는다고 가정해 보겠습니다. 예를 들어 인쇄에 굵은 글꼴을 사용하지만 컨트롤 코드를 표시하여 화면에 굵은 텍스트를 나타내는 텍스트 편집기를 고려해 보세요. 이러한 상황에서는 화면 표시에 엄격하게 사용합니다 OnDraw . 재정 OnPrint의할 때 호출을 OnDraw 별도의 그리기 함수 호출로 대체합니다. 이 함수는 화면에 표시되지 않는 특성을 사용하여 문서를 용지에 나타나는 방식으로 그립니다.

프린터 페이지와 문서 페이지 비교

페이지 번호를 참조할 때 프린터의 페이지 개념과 문서의 페이지 개념을 구분해야 하는 경우가 있습니다. 프린터의 관점에서 페이지가 용지 1장입니다. 그러나 한 장의 용지가 문서의 한 페이지와 반드시 같은 것은 아닙니다. 예를 들어 용지를 접을 회보를 인쇄하는 경우 한 용지에 문서의 첫 번째 페이지와 마지막 페이지가 나란히 포함될 수 있습니다. 마찬가지로 스프레드시트를 인쇄하는 경우 문서는 페이지로 전혀 구성되지 않습니다. 대신 용지 한 장의 행 1~20, 열 6~10이 포함될 수 있습니다.

CPrintInfo 구조의 모든 페이지 번호는 프린터 페이지를 참조합니다. 프레임워크는 프린터를 통과할 각 용지에 대해 한 번 호출 OnPrepareDC OnPrint 합니다. OnPreparePrinting 함수를 재정의하여 문서의 길이를 지정하는 경우 프린터 페이지를 사용해야 합니다. 일대일 서신이 있는 경우(즉, 한 프린터 페이지가 하나의 문서 페이지와 같음) 쉽게 사용할 수 있습니다. 반면 문서 페이지와 프린터 페이지가 직접 일치하지 않는 경우 문서 페이지 간에 변환해야 합니다. 예를 들어 스프레드시트를 인쇄하는 것이 좋습니다. 재정의할 OnPreparePrinting때 전체 스프레드시트를 인쇄하는 데 필요한 용지 수를 계산한 다음 해당 값을 사용하여 멤버 함수를 CPrintInfo호출 SetMaxPage 해야 합니다. 마찬가지로 재정의할 OnPrepareDC때는 m_nCurPage 특정 시트에 표시되는 행 및 열 범위로 변환한 다음 뷰포트 원점도 그에 따라 조정해야 합니다.

인쇄 시간 페이지 매김

경우에 따라 뷰 클래스는 문서가 실제로 인쇄될 때까지의 기간을 미리 알지 못할 수 있습니다. 예를 들어 응용 프로그램이 WYSIWYG가 아니므로 인쇄할 때 화면의 문서 길이가 해당 길이와 일치하지 않는다고 가정합니다.

이렇게 하면 뷰 클래스에 대해 OnPreparePrinting을 재정의할 때 문제가 발생합니다. 문서의 길이를 모르기 때문에 CPrintInfo 구조의 함수에 값을 SetMaxPage 전달할 수 없습니다. 사용자가 인쇄 대화 상자를 사용할 때 중지할 페이지 번호를 지정하지 않으면 프레임워크에서 인쇄 루프를 중지해야 하는 시기를 알 수 없습니다. 인쇄 루프를 중지할 시기를 결정하는 유일한 방법은 문서를 인쇄하고 종료 시기를 확인하는 것입니다. 뷰 클래스는 인쇄되는 동안 문서의 끝에 대해 검사 다음 끝에 도달하면 프레임워크에 알려야 합니다.

프레임워크는 뷰 클래스의 OnPrepareDC 함수를 사용하여 중지 시기를 알려줍니다. 호출할 OnPrepareDC때마다 프레임워크는 m_bContinuePrinting 구조체의 멤버를 CPrintInfo 검사. 기본값은 TRUE입니다. 다시 기본 경우 프레임워크는 인쇄 루프를 계속합니다. FALSE설정하면 프레임워크가 중지됩니다. 인쇄 시간 페이지 매김을 수행하려면 문서의 끝에 도달했는지 여부를 검사 재정 OnPrepareDC 의하고 있는 경우 m_bContinuePrinting FALSE설정합니다.

현재 페이지가 1보다 큰 경우 집합의 OnPrepareDC 기본 구현은 FALSEm_bContinuePrinting. 즉, 문서의 길이를 지정하지 않은 경우 프레임워크는 문서가 한 페이지 길이라고 가정합니다. 그 결과 기본 클래스 버전을 OnPrepareDC호출하는 경우 주의해야 합니다. 기본 클래스 버전을 호출한 후 m_bContinuePrinting TRUE라고 가정하지 마세요.

다음에 대해 자세히 알고 싶은 사항

참고 항목

인쇄
CView 클래스
CDC 클래스