Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 1262-1265쪽)
실습 목적 및 장비 실습 목적 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0) 인쇄 기능의 구현 방법 인쇄 관련 함수의 표현 및 이용 방법 좌표계 및 매핑 모드의 이해 페이지 처리 방법 프린터 DC의 획득 방법 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0)
1. 한 페이지의 그림 인쇄 예제 프로그램 개요 프로그램 골격 Single Document 애플리케이션 6.5절 드로잉 툴에 인쇄 기능 추가 (http://cs.sookmyung.ac.kr/class/06395/lec/exe/DrawZip.exe) 실행 파일 (http://cs.sookmyung.ac.kr/class/06395/lec/exe/Draw.exe) 프로그램 골격 뷰 클래스는 CView 대신 CScrollView에서 상속 (DrawView.h와 DrawView.cpp에서 모든 CView를 CScrollView로 교체)
한 페이지의 그림 인쇄 매핑 모드 및 스크롤 파라미터 설정 class CDrawView : public CScrollView { … public: CSize m_sizePage; void CDrawView::OnInitialUpdate() { … // A4 용지크기. MM_LOMETRIC은 0.1mm를 단위로 함 m_sizePage = CSize(2100, 2970); CSize sizeTotal = CSize(m_sizePage.cx, m_sizePage.cy); CSize sizePage(sizeTotal.cx/2, sizeTotal.cy/2); CSize sizeLine(sizeTotal.cx/100, sizeTotal.cy/100); SetScrollSizes(MM_LOMETRIC, sizeTotal, sizePage, sizeLine); }
한 페이지의 그림 인쇄 매핑 모드 및 스크롤 반영 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { CDrawDoc *pDoc = GetDocument(); m_pCurrentStroke = new CStroke(m_nPenThickness, m_PenColor); pDoc->m_strokeList.AddTail(m_pCurrentStroke); pDoc->SetModifiedFlag(); SetCapture(); // 논리 좌표계로 변환 CClientDC dc(this); dc.SetMapMode(MM_LOMETRIC); dc.DPtoLP(&point); m_ptPrev = point; CScrollView::OnLButtonDown(nFlags, point); } CWnd 멤버 함수들은 디바이스 좌표계를 사용하므로 OnLButtonDown() 함수의 파라미터 point도 디바이스 좌표계의 좌표 값이다. 따라서 이 값을 논리좌표계로 변환해 주어야 한다
점의 좌표를 저장할 때 현재 스크롤 위치를 반영함 void CDrawView::OnMouseMove(UINT nFlags, CPoint point) { if (GetCapture() != this) return; // 논리 좌표계로 변환 CClientDC dc(this); dc.SetMapMode(MM_LOMETRIC); dc.DPtoLP(&point); // 스크롤 반영 m_pCurrentStroke->m_ptArray.Add(point + GetScrollPosition()); CPen* pOldPen = dc.SelectObject(&m_CurrentPen); dc.MoveTo(m_ptPrev); dc.LineTo(point); dc.SelectObject(pOldPen); m_ptPrev = point; CScrollView::OnMouseMove(nFlags, point); } 점의 좌표를 저장할 때 현재 스크롤 위치를 반영함
2. 뷰를 이용하지 않는 프린터 출력 예제 프로그램 개요 프로그램 골격 다이얼로그 기반 애플리케이션 실행 파일 (http://cs.sookmyung.ac.kr/class/06395/lec/exe/DlgPrn.exe) 프로그램 골격 OnFileOpen() OnFileSave() OnFilePrint() Edit (m_strData)
뷰를 이용하지 않는 프린터 출력 파일 열기 파일 열기 대화 상자의 출력, CArchive 객체 생성, Serialize() 호출 void CDlgPrnDlg::OnFileOpen() { char szFilter[] = "Text Files(*.TXT)|*.TXT|All Files(*.*)|*.*||"; CFileDialog fileDlg (TRUE, "txt", NULL, OFN_HIDEREADONLY, szFilter); if(IDOK == fileDlg.DoModal()) CFile file(fileDlg.GetFileName(), CFile::modeRead); // 파일 읽기를 위한 CArchive 객체 생성 CArchive ar(&file, CArchive::load); // Serialize 함수 호출 Serialize(ar); }
뷰를 이용하지 않는 프린터 출력 파일 저장 파일 저장 대화 상자의 출력, CArchive 객체 생성, Serialize() 호출 void CDlgPrnDlg::OnFileSave() { char szFilter[] = "Text Files(*.TXT)|*.TXT|All Files(*.*)|*.*||"; CFileDialog fileDlg(FALSE, "txt", NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter); if(IDOK == fileDlg.DoModal()) CFile file(fileDlg.GetFileName(), CFile::modeWrite|CFile::modeCreate); CArchive ar(&file, CArchive::store); Serialize(ar); }
뷰를 이용하지 않는 프린터 출력 Serialize() 함수 void CDlgPrnDlg::Serialize(CArchive& ar) { if (ar.IsStoring()) // 파일 저장 UpdateData(); ar.WriteString(m_strData); } else // 파일 읽기 DWORD dwSize = ar.GetFile()->GetLength(); ar.Read(m_strData.GetBufferSetLength(dwSize), dwSize); UpdateData(FALSE);
뷰를 이용하지 않는 프린터 출력 OnFilePrint() 함수 void CDlgPrnDlg::OnFilePrint() { // 인쇄 다이얼로그 박스 출력 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; Info.m_rectDraw.SetRect(0,0, dc.GetDeviceCaps(HORZRES), dc.GetDeviceCaps(VERTRES)); Info.SetMaxPage(1); // OnBeginPrinting 함수 호출 OnBeginPrinting(&dc, &Info);
// 페이지를 인쇄하는 루프 for (UINT page = Info.GetMinPage(); page <= Info.GetMaxPage() && bPrintingOK; page++) { dc.StartPage(); // 페이지 인쇄 시작 Info.m_nCurPage = page; OnPrint(&dc, &Info); // OnPrint 함수 호출 bPrintingOK = (dc.EndPage() > 0); // 페이지 인쇄 완료 } OnEndPrinting(&dc, &Info); // OnEndPrinting 함수 호출 if (bPrintingOK) dc.EndDoc(); // 도큐먼트 인쇄 종료 else dc.AbortDoc(); dc.Detach();
뷰를 이용하지 않는 프린터 출력 기타 함수 * 정의되는 모든 함수들은 CDlgPrnDlg 클래스 안에 선언되어야 함 (Class Wizard에 의해 또는 직접 DlgPrnDlg.h를 편집하여) void CDlgPrnDlg::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo) { } void CDlgPrnDlg::OnEndPrinting(CDC *pDC, CPrintInfo *pInfo) { } void CDlgPrnDlg::OnPrint(CDC *pDC, CPrintInfo *pInfo) { CRect rectBound(1000, -1000, 10000, -15000); UpdateData(); pDC->SetMapMode(MM_TWIPS); pDC->DrawText(m_strData, rectBound, DT_LEFT|DT_TOP); }
보고서 작성 요령 보고서 프로그램 소스 프로그램 설명 (AppWizard에 의해 생성된 부분은 제외)