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

이 노트 인쇄를 사용자 지정 하는 프로세스에 설명 합니다. 및 인쇄 미리 보기 및 CView 및 콜백 루틴 및 CPreviewView 의 멤버 함수에 사용 되는 콜백 루틴의 목적에 설명 합니다.

문제

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

효율적인 인쇄

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

불행히도,이 인쇄 과정을 느려질 수 있습니다. 응용 프로그램에서 인쇄 표준 기술을 사용 하 여 달성 될 수 있다 보다는 빨리 해야 합니다., 수동 줄무늬 구현 해야 합니다.

구간 설정 인쇄

수동으로 밴드를 다시 구현 해야 합니다 인쇄 루프는 OnPrint (밴드) 당 한 번 페이지 당 여러 번 호출 됩니다. 인쇄 루프 viewprnt.cpp에서 OnFilePrint 함수에서 구현 됩니다. CView에서-클래스, 파생 된 인쇄 함수를 호출 하는 인쇄 명령을 처리 하는 것에 대 한 메시지 맵 엔트리는이 함수를 오버 로드 합니다. OnFilePrint 루틴을 복사 하 고 줄무늬 구현 하려면 인쇄 루프를 변경 합니다. 아마는 또한 인쇄 중인 페이지의 섹션에 따라 드로잉을 최적화할 수 있습니다 줄무늬 사각형 인쇄 함수에 전달 하려면。

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

인쇄 미리 보기: nbsp; 사용자 인터페이스와 전자 종이(&N)

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

인쇄 미리 보기 사용자 지정

이 노트 인쇄 미리 보기를 수정 하는 한 측면 거래: 미리 보기 모드에 UI를 추가 합니다. 다른 수정이 가능 하지만 그러한 변경이이 논의의 범위를 벗어났습니다.

간단히, 미리 보기 모드에 UI를 추가 하는 프로세스에는:

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

  2. 원하는 UI 측면에 대 한 명령 처리기 추가。

  3. 디스플레이에 시각적 요소를 추가 하는 경우 OnDraw 무시 하 고 호출 후 드로잉을 수행 CPreviewView::OnDraw.

OnFilePrintPreview

이 인쇄 미리 보기에 대 한 명령 처리기입니다. 기본 구현은:

void CView::OnFilePrintPreview()
{
 nbsp;? / / 파생된 클래스에서 특별 한 창 여기 처리 구현
 ?? / / 갈고리 프레임 창에 연결 하는 경우에 가까이 해야 합니다.

/ / 프레임 만들기이 있어야 합니다. 이 함수를 수명은 해야 합니다.
 ?? CPrintPreviewState * pState 새로운 CPrintPreviewState; =

if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR,이,
 ?????????????? RUNTIME_CLASS(CPreviewView), pState))
 ?? {
 ?????? / / 파생된 클래스를 리버스 특수 창 처리
 ?????? / / 여기에 미리 보기 실패 사례에 대 한

TRACE0 ("오류: 실패 DoPrintPreview");
 ?????? AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
 ?????? pState; 삭제????? / 미리 보기를 초기화 하지 못했습니다. / / / 상태를 지금 삭제
 ?? }
}(&N)

DoPrintPreview 는 응용 프로그램의 주 창을 숨길 것 이다. 컨트롤 막대 상태 표시줄 같은 수 유지 pState gt;에서 그들을 지정 하 여dwStates 회원 (이것은 비트 마스크와 비트에 대 한 개별 컨트롤 막대는 AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)에 의해 정의 됩니다). 창 pState->nIDMainPane 창이 자동으로 숨겨진 하 고 reshown 것 이다. DoPrintPreview 는 표준 미리 보기 UI에 대 한 버튼 막대를 만들 다음 것입니다. 특별 한 창 처리 필요한 경우 DoPrintPreview 하기 전에 수행 해야 하는 다른 창을 표시 하거나 숨기려면 같은 라고。

기본적으로 인쇄 미리 보기를 마치면 반환 컨트롤 막대의 원래 상태와 주요 창에 표시 합니다. 재정의에서 수행 한다 특수 처리가 필요한 경우 EndPrintPreview. DoPrintPreview 실패, 특수 처리도 제공 합니다.

Doprintpreview는 호출:

EndPrintPreview

이 인쇄 미리 보기 모드를 종료 라고 합니다. 종종 인쇄 미리 보기에서 마지막으로 표시 된 문서에서 페이지를 이동 하는 것이 바람직합니다. EndPrintPreview 할 응용 프로그램의 기회입니다. PInfo-gt;m_nCurPage 멤버는 마지막 페이지 (왼쪽 두 페이지가 표시 된 경우), 표시 및 포인터는 페이지에서 사용자가 관심이 있었다 어디 힌트. 응용 프로그램의 보기 구조 프레임 워크에 알려진 이후 당신이 선택한 지점으로 이동 하는 코드를 제공 해야 합니다(&G).

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

/ / 여기 더 정리를 수행 해야 합니다.
CView::EndPrintPreview (pDC, pInfo, 포인트, pView)

CWinApp::OnFilePrintSetup

이 인쇄 설정 메뉴 항목에 대 한 매핑할 수 있어야 합니다. 대부분의 경우 구현을 재정의 필요 하지 않습니다.

페이지 표식

또 다른 문제를 사용 하면 페이지 번호 매기기 및 순서입니다. 간단한 워드 프로세서 유형의 응용 프로그램에 대 한 간단한 문제입니다. 대부분의 인쇄 미리 보기 시스템 각 인쇄 된 페이지 문서에서 한 페이지에 해당 하는 가정。

일반적인된 솔루션을 제공 하기 위해 노력에 고려해 야 할 몇 가지 있습니다. CAD 시스템을 상상 하십시오. 사용자가 여러 E 크기 시트 커버 드로잉. E 크기 (또는 작은, 조정) 플로터, 페이지 번호 매기기 간단한 경우에서와 같이 될 것 이다. 아니지만 장당 16 A 크기 페이지를 인쇄 하는 레이저 프린터에 어떤 인쇄 미리 보기 "페이지"?

소개 단락 국가로 인쇄 미리 보기 프린터 처럼 행동 합니다. 따라서, 사용자는 어떤 특정 프린터 선택의 올 것 이라고 볼 것 이다. 그것은 각 페이지에 인쇄 되는 이미지를 결정 하는 보기。

("페이지 1" 또는 "페이지 1-2")에서으로 페이지당 하나의 숫자로 표현할 수 있는 경우 사용자에 게 페이지 번호를 표시 하는 수단을 제공 하는 CPrintInfo 구조에 페이지 설명 문자열입니다. 이 문자열은 CPreviewView::OnDisplayPageNumber의 기본 구현에 의해 사용 됩니다. 하나, 예를 들어, "Sheet1, 섹션 A, B"을 제공 하기 위해이 가상 함수를 재정의할 수 있습니다 다른 디스플레이 필요한 경우。

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index