본문 바로가기
Visual C++(MFC)

MFC09. 인쇄하기

by 정양섭 2022. 3. 7.

  인쇄 기능은 MFC에서 제공하는 인쇄기능을 이용할 경우 몇가지 세팅만하면 간단히 인쇄가 됩니다. GUI 설명에서 잠깐 언급했듯이 BITMAP에 출력 및 프린터 출력등 출력에 해당하는 I/F는 모두 CDC Class에 의해 통합 관리가 됩니다. MFC 내부적으로 인쇄일 경우 인쇄 CDC를 얻어 OnDraw의 인자로 넘겨 줌으로써 거의 수정없이 인쇄가 가능한 것입니다.

Source 설명

  일반적으로 프로젝트를 생성하여 프로그램을 제작하면 인쇄기능이 그대로 지원됩니다. 그러나 화면해상도와 프린터의 해상도는 차이가 나므로 인쇄물은 좌측 상단에 조그마하게 인쇄됩니다. 따라서 프린터기의 해상도에 맞추어 인쇄를 수행해야만 합니다. 이것은 메핑모드를 바꾸어서 수행할 수 있습니다. 메핑모드에 대해서는 여기서 자세히 설명하지 않고(인쇄 외에 일반적인 프로그램 작성시에 거의 알 필요가 없다) 필요한 함수만을 설명합니다.

우선 프린터의 해상도에 따른 가로 크기와 세로크기를 구하는 함수를 보면 다음과 같습니다.

 

pDC->GetDeviceCaps(HORZRES)    //가로 크기 구하기
pDC->GetDeviceCaps(VERTRES)    //세로 크기 구하기

Printer라는 프로젝트를 생성하고 (Single document로 생성), Class View에서 을 선택하여 나타난 Overrides 중 OnPrepareDC를 마우스로 더블클릭하여 함수를 생성한 후 다음과 같이 수정합니다.


void CPrinterView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
        CView::OnPrepareDC(pDC, pInfo);
        if (pDC->IsPrinting()){
                CSize sizeDoc(1024, 768);       // 화면크기 설정 - 필요한 크기 세팅해야함
                CSize sizePrint(pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES));

                pDC->SetMapMode(MM_ANISOTROPIC);   //메핑모드 수정 - 기본값 MM_TEXT

                //가운데 인쇄 - 시작위치 및 인쇄 크기(다시) 구함
                double dRate, dRate1, dRate2;
                CPoint pointStart(0, 0);
                dRate1 = (double)sizePrint.cx/(double)sizeDoc.cx;
                dRate2 = (double)sizePrint.cy/(double)sizeDoc.cy;
                dRate = min(dRate1, dRate2);
                //sizeDoc.cx * dRate : 수정된 가로 프린터 화면 크기
                //sizeDoc.cy * dRate : 수정된 세로 프린터 화면 크기
                if(dRate1 > dRate2)
                        pointStart.x = (int)(sizePrint.cx - sizeDoc.cx * dRate) / 2;
                else
                        pointStart.y = (int)(sizePrint.cy - sizeDoc.cy * dRate) / 2;
                sizePrint = CSize((int)(sizeDoc.cx * dRate), (int)(sizeDoc.cy * dRate));

                pDC->SetViewportOrg(pointStart);                        //시작위치 설정
                pDC->SetWindowExt(sizeDoc.cx, sizeDoc.cy);  //화면 크기 설정
                pDC->SetViewportExt(sizePrint.cx, sizePrint.cy);  //프린터 화면 크기 설정
        }
}

데모용 프로그램
  데모용 프로그램은 단지 다음과 같이 화면에 간단한 그림을 그리고 그 화면을 인쇄할 수 있도록 구성하였습니다.


예제 프로그램 다운로드

PrintDemo.zip
0.03MB


 

'Visual C++(MFC)' 카테고리의 다른 글

MFC11. DLL 제작  (0) 2022.03.07
MFC10. 메모리  (0) 2022.03.07
MFC08. View에서 깜박임 문제 해결  (0) 2022.03.07
MFC07. Doc-View 구조  (0) 2022.03.07
MFC06. 대화상자  (0) 2022.03.07