다음을 통해 공유


TN030: 인쇄 및 인쇄 미리 보기 사용자 지정.

[!참고]

온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.

이 참고가 인쇄 및 인쇄 미리 보기를 사용자 지정 하는 프로세스를 설명 하 고 용도에 사용 되는 콜백 루틴을 CView 의 멤버 함수 및 콜백 루틴 CPreviewView.

문제

MFC에 대 한 대부분의 인쇄 완벽 한 솔루션을 제공 하 고 인쇄 미리 보기를 해야 합니다.대부분의 경우 거의 추가 코드 보기 인쇄 미리 볼 수 있을 필요가 없습니다.그러나 가지는 개발자의 상당한 노력이 필요한 인쇄 성능을 최적화 하려면 및 일부 응용 프로그램의 인쇄 미리 보기 모드에 특정 사용자 인터페이스 요소를 추가 해야 합니다.

효율적인 인쇄

표준 방법을 사용 하 여 MFC 응용 프로그램을 인쇄 하면 모든 그래픽 장치 인터페이스 (GDI) 출력 호출 하는 메모리 내의 메타 파일 Windows를 지시 합니다.때 EndPage 입니다 라고 하는 Windows 메타 파일 프린터 페이지를 인쇄 하는 데 필요한 각 실제 밴드 한 번 재생 됩니다.이 렌더링 하는 동안 GDI에 자주 중단 절차 계속 해야 하는 경우 확인 하려면 쿼리 합니다.일반적으로 중단 프로시저 메시지를 사용자는 인쇄 대화 상자를 사용 하 여 인쇄 작업을 중단할 수 있도록 처리할 수 있습니다.

불행 하 게도이 인쇄 프로세스 속도가 느려질 수 있습니다.인쇄 응용 프로그램에서 표준 기술을 사용 하 여 얻을 수 있습니다 보다 빨리 해야 하는 경우에 수동 줄무늬 구현 해야 합니다.

개요 인쇄

수동으로 밴드에 re 인쇄 루프 구현 해야 등 OnPrint (밴드) 마다 한 번씩 페이지당 여러 번 호출 됩니다.인쇄 루프에서 구현 되는 OnFilePrint viewprnt.cpp 함수.사용자 CView-클래스에서 파생 된 인쇄 함수를 호출 하는 인쇄 명령을 처리 하는 것에 대 한 메시지 맵 엔트리는이 함수를 오버 로드 합니다.복사는 OnFilePrint 루틴 및 줄무늬 구현 하는 인쇄 루프를 변경 합니다.것 또한 인쇄 되는 페이지에서 부분을 기반으로 드로잉을 최적화할 수 있도록 밴딩 사각형을 인쇄 함수에 전달 하려고 합니다.

둘째, 자주 호출 해야 QueryAbort 밴드를 드로잉 하는 동안.그렇지 않으면 않습니다 중단 프로시저 호출 됩니다 및 사용자가 인쇄 작업을 취소할 수 없습니다.

사용자 인터페이스를 가진 전자 종이 인쇄 미리 보기:

인쇄 미리 보기를 기본적으로 프린터 에뮬레이션으로 표시 하려고 합니다.기본적으로 주 창의 클라이언트 영역 창 내에서 완벽 하 게 하나 또는 두 개의 페이지를 표시할 수 있습니다.사용자가 영역을 더 자세하게 보려면 페이지를 확대할 수 있습니다.추가 지원은 통해 사용자도 미리 보기 모드에서 문서를 편집할 수 있습니다.

인쇄 미리 보기 사용자 지정

이 글만 수정 인쇄 미리 보기의 한 측면을 다룹니다.: 미리 보기 모드에 추가 UI.다른 수정 가능 하지만이 논의의 범위를 벗어난 변경 됩니다.

미리 보기 모드에 UI를 추가 하려면

  1. 파생 뷰 클래스에서 CPreviewView.

  2. 원하는 UI 요소에 대 한 명령 처리기를 추가 합니다.

  3. 시각적 측면을 표시에 추가 하는 경우 재정의 OnDraw 호출을 그리기를 수행 하 고 CPreviewView::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 창 자동 숨김 및 reshown입니다.DoPrintPreview 미리 보기 UI에 대 한 표준 단추 모음 다음 만들어집니다.특수 창 처리 필요 하지 않으면 같은 하기 전에 수행 해야 하는 기타 창 표시 또는 숨기기 DoPrintPreview 라고 합니다.

인쇄 미리 보기를 완료 하면 기본적으로 컨트롤 막대를 주 창에 표시 하 고 원래 상태로 반환 합니다.특수 처리가 필요한 경우 재정의 된 수행 해야 EndPrintPreview. 경우 DoPrintPreview 실패, 특수 한 처리를 제공할 수도 있습니다.

Doprintpreview는 호출 합니다.

  • 미리 보기 도구 모음 대화 상자 템플릿 리소스 ID.

  • 인쇄 인쇄 미리 보기를 수행 하 여 보기에 대 한 포인터입니다.

  • 미리 보기 뷰 클래스의 런타임 클래스입니다.이 Doprintpreview에서 동적으로 생성 됩니다.

  • CPrintPreviewState 포인터입니다.CPrintPreviewState 구조 (또는 파생 된 구조는 응용 프로그램이 자세한 상태를 유지 해야 하는 경우) 해야 메모 없습니다 프레임을 만들 수 있습니다.Doprintpreview는 모덜리스 이며이 구조 Endprintpreview가 호출 될 때까지 살아 남아 야 합니다.

    [!참고]

    개별 뷰 또는 뷰 클래스에 인쇄 지원이 필요한 경우 해당 개체에 대 한 포인터를 두 번째 매개 변수로 전달 되어야 합니다.

EndPrintPreview

인쇄 미리 보기 모드를 종료 하려면이 호출 됩니다.인쇄 미리 보기에서 마지막으로 표시 된 문서에서 페이지를 이동 하는 것이 바람직한 경우가 많습니다.EndPrintPreview 이렇게 하려면 응용 프로그램의 기회입니다.PInfo->m_nCurPage 멤버인 마지막 (왼쪽 두 페이지에 표시 된 경우), 표시 된 페이지 및 포인터 사용자 페이지에 관련 된 위치는 힌트입니다.다음 뷰는 응용 프로그램의 구조를 프레임 워크에 알 수 없는 이후 선택한 지점으로 이동 하는 코드를 제공 해야 합니다.

대부분의 작업을 호출 하기 전에 수행 해야 CView::EndPrintPreview.이 호출의 효과 반전 DoPrintPreview pInfo pView, Pdc에서 삭제 합니다.

// 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 섹션 A, B" 제공이 가상 함수를 재정의 하나 있습니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트