서식 있는 편집 컨트롤의 콘텐츠를 인쇄하는 방법
이 섹션에는 서식 있는 편집 컨트롤의 콘텐츠를 인쇄하는 방법에 대한 정보가 포함되어 있습니다.
알아야 하는 작업
기술
필수 구성 요소
- 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;
}
관련 항목