반응형
// 인쇄 다이얼로그 박스 출력
CPrintDialog printDlg(FALSE);
if (printDlg.DoModal() == IDCANCEL) return;
// 프린터 DC를 얻음
CDC dc;
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting = TRUE;
// 인쇄될 도큐먼트에 관한 정보 설정
CString strTitle;
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;
// 도큐먼트 인쇄 시작
BOOL bPrintingOK = dc.StartDoc(&di);
// CPrintInfo에 인쇄 관련 정보 설정
CPrintInfo Info;
//width = 4725, height 6792
Info.m_rectDraw.SetRect(500,500, dc.GetDeviceCaps(HORZRES)-500, dc.GetDeviceCaps(VERTRES)-500);
CRect r;
int nHeight;
dc.SetMapMode(MM_TEXT);
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=227478&ref=227094
// m_strEDIT는 프린트할 String 데이터가 들어있는 CString 변수 입니다.
char * p = m_strEDIT.GetBuffer(m_strEDIT.GetLength());
char *startAt = p;
//이 부분이 여러페이지 인쇄를 위해서 쓰이는 부분 같습니다.
int totalDone = 0;
int lengthToGo = m_strEDIT.GetLength();
// 페이지를 인쇄하는 루프
for (UINT page = Info.GetMinPage(); bPrintingOK && totalDone < lengthToGo ; page++)
{
// 페이지 인쇄 시작
dc.StartPage();
Info.m_nCurPage = page;
r = Info.m_rectDraw;
r.bottom = r.top;
int i = 0;
while (r.bottom < Info.m_rectDraw.bottom && totalDone + i < lengthToGo)
{
r.right = Info.m_rectDraw.right;
nHeight = dc.DrawText(startAt, i++, r, DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
}
// go one back to assure correct height
if (r.bottom >= Info.m_rectDraw.bottom)
i--;
//print page number
CString strPageNum;
strPageNum.Format("- %d -",Info.m_nCurPage);
dc.DrawText(strPageNum,i, r, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
// print that text
dc.DrawText(startAt, i, r, DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
// go to next page
startAt += i;
totalDone += i;
// 페이지 인쇄 완료
bPrintingOK = (dc.EndPage() > 0);
}
m_strEDIT.ReleaseBuffer();
// 도큐먼트 인쇄 종료
if (bPrintingOK) dc.EndDoc();
else dc.AbortDoc();
dc.Detach();
CPrintDialog printDlg(FALSE);
if (printDlg.DoModal() == IDCANCEL) return;
// 프린터 DC를 얻음
CDC dc;
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting = TRUE;
// 인쇄될 도큐먼트에 관한 정보 설정
CString strTitle;
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;
// 도큐먼트 인쇄 시작
BOOL bPrintingOK = dc.StartDoc(&di);
// CPrintInfo에 인쇄 관련 정보 설정
CPrintInfo Info;
//width = 4725, height 6792
Info.m_rectDraw.SetRect(500,500, dc.GetDeviceCaps(HORZRES)-500, dc.GetDeviceCaps(VERTRES)-500);
CRect r;
int nHeight;
dc.SetMapMode(MM_TEXT);
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=227478&ref=227094
// m_strEDIT는 프린트할 String 데이터가 들어있는 CString 변수 입니다.
char * p = m_strEDIT.GetBuffer(m_strEDIT.GetLength());
char *startAt = p;
//이 부분이 여러페이지 인쇄를 위해서 쓰이는 부분 같습니다.
int totalDone = 0;
int lengthToGo = m_strEDIT.GetLength();
// 페이지를 인쇄하는 루프
for (UINT page = Info.GetMinPage(); bPrintingOK && totalDone < lengthToGo ; page++)
{
// 페이지 인쇄 시작
dc.StartPage();
Info.m_nCurPage = page;
r = Info.m_rectDraw;
r.bottom = r.top;
int i = 0;
while (r.bottom < Info.m_rectDraw.bottom && totalDone + i < lengthToGo)
{
r.right = Info.m_rectDraw.right;
nHeight = dc.DrawText(startAt, i++, r, DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
}
// go one back to assure correct height
if (r.bottom >= Info.m_rectDraw.bottom)
i--;
//print page number
CString strPageNum;
strPageNum.Format("- %d -",Info.m_nCurPage);
dc.DrawText(strPageNum,i, r, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
// print that text
dc.DrawText(startAt, i, r, DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
// go to next page
startAt += i;
totalDone += i;
// 페이지 인쇄 완료
bPrintingOK = (dc.EndPage() > 0);
}
m_strEDIT.ReleaseBuffer();
// 도큐먼트 인쇄 종료
if (bPrintingOK) dc.EndDoc();
else dc.AbortDoc();
dc.Detach();
반응형
'C & C++ > C & C++' 카테고리의 다른 글
유니코드 <--> 멀티 바이트 변환 (0) | 2011.10.25 |
---|---|
파일 다이얼로그에서 단일 * 다중선택 (0) | 2011.10.25 |
디렉토리 생성 삭제 (0) | 2011.05.25 |
Text 파일 읽어오기 (0) | 2011.05.25 |
[API] 수행시간 계산 (0) | 2011.05.25 |
댓글