본문 바로가기
C & C++/C & C++

여러 페이지 인쇄하기

by izen8 2011. 10. 25.
반응형
// 인쇄 다이얼로그 박스 출력
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

댓글