서식 있는 편집 컨트롤의 콘텐츠를 인쇄하는 방법

이 섹션에는 서식 있는 편집 컨트롤의 콘텐츠를 인쇄하는 방법에 대한 정보가 포함되어 있습니다.

알아야 하는 작업

기술

필수 구성 요소

  • C/C++
  • Windows 사용자 인터페이스 프로그래밍

지침

인쇄 미리 보기 사용

대상 디바이스(일반적으로 인쇄된 페이지)에 표시되는 대로 서식 있는 편집 컨트롤에서 텍스트 서식을 지정하려면 EM_SETTARGETDEVICE 메시지를 전송하고 핸들을 대상 디바이스의 디바이스 컨텍스트(HDC) 및 원하는 선 너비로 전달합니다. 일반적으로 대상 HDC에 대해 GetDeviceCaps를 호출하여 선 너비를 가져옵니다.

특정 디바이스에 대한 인쇄 서식 지정

특정 디바이스에 대한 서식 있는 편집 컨트롤 콘텐츠의 파트의 서식을 지정하려면 EM_FORMATRANGE 메시지를 보냅니다. 이 메시지와 함께 사용되는 FORMATRANGE 구조체는 서식을 지정할 텍스트 범위와 대상 디바이스의 HDC를 지정합니다. 선택적으로 이 메시지는 텍스트를 프린터로 보냅니다.

밴딩 사용

밴딩은 하나 이상의 개별 사각형 또는 밴드를 사용하여 출력의 단일 페이지가 생성되는 프로세스입니다. 모든 밴드가 페이지에 배치되면 완전한 이미지 결과가 나타납니다. 이 방법은 메모리가 충분하지 않거나 한 번에 전체 페이지를 이미지화할 수 있는 기능이 없는 래스터 프린터에서 자주 사용됩니다.

밴딩을 구현하려면 EM_DISPLAYBAND 메시지를 사용하여 서식 있는 편집 컨트롤 콘텐츠의 연속 부분을 디바이스로 보냅니다. 이 메시지는 EM_FORMATRANGE에 대한 이전 호출에서 지정된 디바이스에 인쇄됩니다. 물론 EM_FORMATRANGE 메시지의 wParam 매개 변수는 0이어야 해당 메시지에 의해 인쇄가 시작되지 않습니다.

PrintRTF 코드 예

다음 코드 예는 서식 있는 편집 컨트롤의 콘텐츠를 지정된 프린터로 인쇄합니다.

// hwnd is the HWND of the rich edit control.
// hdc is the HDC of the printer. This value can be obtained for the 
// default printer as follows:
//
//     PRINTDLG pd = { sizeof(pd) };
//     pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
//
//     if (PrintDlg(&pd))
//     {
//        HDC hdc = pd.hDC;
//        ...
//     }

BOOL PrintRTF(HWND hwnd, HDC hdc)
{
    DOCINFO di = { sizeof(di) };
    
    if (!StartDoc(hdc, &di))
    {
        return FALSE;
    }

    int cxPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETX);
    int cyPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETY);
    
    int cxPhys = GetDeviceCaps(hdc, PHYSICALWIDTH);
    int cyPhys = GetDeviceCaps(hdc, PHYSICALHEIGHT);

    // Create "print preview". 
    SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys/2);

    FORMATRANGE fr;

    fr.hdc       = hdc;
    fr.hdcTarget = hdc;

    // Set page rect to physical page size in twips.
    fr.rcPage.top    = 0;  
    fr.rcPage.left   = 0;  
    fr.rcPage.right  = MulDiv(cxPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSX));  
    fr.rcPage.bottom = MulDiv(cyPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSY)); 

    // Set the rendering rectangle to the pintable area of the page.
    fr.rc.left   = cxPhysOffset;
    fr.rc.right  = cxPhysOffset + cxPhys;
    fr.rc.top    = cyPhysOffset;
    fr.rc.bottom = cyPhysOffset + cyPhys;

    SendMessage(hwnd, EM_SETSEL, 0, (LPARAM)-1);          // Select the entire contents.
    SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg);  // Get the selection into a CHARRANGE.

    BOOL fSuccess = TRUE;

    // Use GDI to print successive pages.
    while (fr.chrg.cpMin < fr.chrg.cpMax && fSuccess) 
    {
        fSuccess = StartPage(hdc) > 0;
        
        if (!fSuccess) break;
        
        int cpMin = SendMessage(hwnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
        
        if (cpMin <= fr.chrg.cpMin) 
        {
            fSuccess = FALSE;
            break;
        }
        
        fr.chrg.cpMin = cpMin;
        fSuccess = EndPage(hdc) > 0;
    }
    
    SendMessage(hwnd, EM_FORMATRANGE, FALSE, 0);
    
    if (fSuccess)
    {
        EndDoc(hdc);
    } 
    
    else 
    
    {
        AbortDoc(hdc);
    }
    
    return fSuccess;
    
}

서식 있는 편집 컨트롤 사용

Windows 공용 컨트롤 데모(CppWindowsCommonControls)