TN030: 인쇄 및 인쇄 미리 보기 사용자 지정
참고 항목
다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.
이 참고에서는 인쇄 및 인쇄 미리 보기를 사용자 지정하는 프로세스를 설명하고 사용된 CView
콜백 루틴의 목적과 콜백 루틴 및 멤버 함수에 CPreviewView
대해 설명합니다.
문제
MFC는 대부분의 인쇄 및 인쇄 미리 보기 요구 사항에 대한 완벽한 솔루션을 제공합니다. 대부분의 경우 보기를 인쇄하고 미리 볼 수 있도록 추가 코드가 거의 필요하지 않습니다. 그러나 개발자가 상당한 노력을 기울여야 하는 인쇄를 최적화하는 방법이 있으며 일부 애플리케이션은 인쇄 미리 보기 모드에 특정 사용자 인터페이스 요소를 추가해야 합니다.
효율적인 인쇄
MFC 애플리케이션이 표준 메서드를 사용하여 인쇄되면 Windows는 모든 GDI(그래픽 디바이스 인터페이스) 출력 호출을 메모리 내 메타파일로 전달합니다. 호출될 때 EndPage
Windows는 프린터에서 한 페이지를 인쇄해야 하는 각 물리적 밴드에 대해 메타파일을 한 번 재생합니다. 이 렌더링 중에 GDI는 중단 프로시저를 자주 쿼리하여 계속해야 하는지 확인합니다. 일반적으로 중단 프로시저를 사용하면 사용자가 인쇄 대화 상자를 사용하여 인쇄 작업을 중단할 수 있도록 메시지를 처리할 수 있습니다.
아쉽게도 인쇄 프로세스가 느려질 수 있습니다. 애플리케이션의 인쇄 속도가 표준 기술을 사용하여 수행할 수 있는 것보다 빨라야 하는 경우 수동 밴딩을 구현해야 합니다.
인쇄 밴딩
수동으로 밴드를 지정하려면 페이지당 여러 번(대역당 한 번) 호출되는 OnPrint
인쇄 루프를 다시 구현해야 합니다. 인쇄 루프는 viewprnt.cpp의 OnFilePrint
함수에서 구현됩니다. CView
파생 클래스에서는 인쇄 명령을 처리하기 위한 메시지 맵 항목이 인쇄 함수를 호출할 수 있도록 이 함수를 오버로드합니다. 루틴을 OnFilePrint
복사하고 인쇄 루프를 변경하여 밴딩을 구현합니다. 인쇄 중인 페이지의 섹션에 따라 그리기를 최적화할 수 있도록 줄무늬 사각형을 인쇄 함수에 전달하려고 할 수도 있습니다.
둘째, 밴드를 그리는 동안 자주 호출 QueryAbort
해야 합니다. 그렇지 않으면 중단 프로시저가 호출되지 않고 사용자가 인쇄 작업을 취소할 수 없습니다.
인쇄 미리 보기: 사용자 인터페이스가 있는 전자 용지
인쇄 미리 보기는 기본적으로 디스플레이를 프린터의 에뮬레이션으로 바꾸려고 합니다. 기본적으로 기본 창의 클라이언트 영역은 창 내에 하나 또는 두 개의 페이지를 완전히 표시하는 데 사용됩니다. 사용자는 페이지 영역을 확대하여 자세히 볼 수 있습니다. 추가 지원을 통해 사용자는 미리 보기 모드에서 문서를 편집할 수도 있습니다.
인쇄 미리 보기 사용자 지정
이 참고 사항은 인쇄 미리 보기 수정의 한 가지 측면인 미리 보기 모드에 UI 추가만 다룹니다. 다른 수정이 가능하지만 이러한 변경 내용은 이 논의의 범위를 벗어납니다.
미리 보기 모드에 UI를 추가하려면
에서 뷰 클래스를
CPreviewView
파생합니다.원하는 UI 측면에 대한 명령 처리기를 추가합니다.
디스플레이에 시각적 측면을 추가하는 경우 호출
CPreviewView::OnDraw
후 드로잉을 재정OnDraw
의하고 수행합니다.
OnFilePrintPreview
인쇄 미리 보기에 대한 명령 처리기입니다. 기본 구현은 다음과 같습니다.
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize, delete State now
}
}
DoPrintPreview
는 애플리케이션의 기본 창을 숨깁니다. 상태 막대와 같은 컨트롤 막대는 pState-dwStates> 멤버에 지정하여 유지할 수 있습니다(비트 마스크이며 개별 컨트롤 막대의 비트는 AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)로 정의됨). pState-nIDMainPane> 창은 자동으로 숨겨지고 다시 표시되는 창입니다. DoPrintPreview
표준 미리 보기 UI에 대한 단추 모음을 만듭니다. 다른 창을 숨기거나 표시하는 것과 같은 특수 창 처리가 필요한 경우 호출되기 전에 DoPrintPreview
수행해야 합니다.
기본적으로 인쇄 미리 보기가 완료되면 컨트롤 막대가 원래 상태로 반환되고 기본 창이 표시됩니다. 특별한 처리가 필요한 경우 재정의 EndPrintPreview
로 수행해야 합니다. 실패하면 DoPrintPreview
특수한 처리도 제공합니다.
DoPrintPreview는 다음을 사용하여 호출됩니다.
미리 보기 도구 모음에 대한 대화 상자 템플릿의 리소스 ID입니다.
인쇄 미리 보기에 대한 인쇄를 수행할 보기에 대한 포인터입니다.
Preview View 클래스의 런타임 클래스입니다. DoPrintPreview에서 동적으로 만들어집니다.
CPrintPreviewState 포인터입니다. CPrintPreviewState 구조체(또는 애플리케이션에 더 많은 상태를 유지해야 하는 경우 파생 구조)는 프레임에 만들어서는 안 됩니다. DoPrintPreview는 모덜리스이며 EndPrintPreview가 호출될 때까지 이 구조체가 유지되어야 합니다.
참고 항목
인쇄 지원을 위해 별도의 뷰 또는 뷰 클래스가 필요한 경우 해당 개체에 대한 포인터를 두 번째 매개 변수로 전달해야 합니다.
EndPrintPreview
인쇄 미리 보기 모드를 종료하기 위해 호출됩니다. 인쇄 미리 보기에 마지막으로 표시된 문서의 페이지로 이동하는 것이 좋습니다. EndPrintPreview
은 애플리케이션이 이 작업을 수행할 수 있는 기회입니다. pInfo-m_nCurPage> 멤버는 마지막으로 표시된 페이지(두 페이지가 표시된 경우 맨 왼쪽)이며 포인터는 사용자가 관심 있는 페이지의 위치에 대한 힌트입니다. 애플리케이션 보기의 구조는 프레임워크에 알려지지 않으므로 선택한 지점으로 이동하는 코드를 제공해야 합니다.
를 호출 CView::EndPrintPreview
하기 전에 대부분의 작업을 수행해야 합니다. 이 호출은 pView, pDC 및 pInfo의 DoPrintPreview
효과를 되돌리고 삭제합니다.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
인쇄 설정 메뉴 항목에 대해 매핑해야 합니다. 대부분의 경우 구현을 재정의할 필요가 없습니다.
페이지 명명법
또 다른 문제는 페이지 번호 매기기 및 순서입니다. 간단한 워드 프로세서 유형 애플리케이션의 경우 이는 간단한 문제입니다. 대부분의 인쇄 미리 보기 시스템은 각 인쇄 페이지가 문서의 한 페이지에 해당한다고 가정합니다.
일반화된 솔루션을 제공하기 위해 고려해야 할 몇 가지 사항이 있습니다. CAD 시스템을 상상해 보십시오. 사용자에게는 여러 E 크기 시트를 포함하는 드로잉이 있습니다. E 크기(또는 크기가 조정된 더 작은) 플로터에서 페이지 번호 매기기는 간단한 경우와 같습니다. 그러나 레이저 프린터에서 시트당 16개의 A사이스 페이지를 인쇄하면 인쇄 미리 보기에서 "페이지"를 고려합니다.
소개 단락에 따르면 인쇄 미리 보기는 프린터처럼 작동합니다. 따라서 사용자가 선택한 특정 프린터에서 나오는 것을 볼 수 있습니다. 각 페이지에 인쇄되는 이미지를 결정하는 것은 보기에 달려 있습니다.
구조의 CPrintInfo
페이지 설명 문자열은 페이지 번호를 페이지당 하나의 숫자로 나타낼 수 있는 경우("페이지 1" 또는 "페이지 1-2"에서와 같이) 사용자에게 표시할 수 있는 방법을 제공합니다. 이 문자열은 기본 구현 CPreviewView::OnDisplayPageNumber
에서 사용됩니다. 다른 디스플레이가 필요한 경우 이 가상 함수를 재정의하여 제공할 수 있습니다(예: "Sheet1, Sections A, B").