Скачать презентацию Lab 10 Guide 프린터 출력 예제 한 Скачать презентацию Lab 10 Guide 프린터 출력 예제 한

4a0b23fe62cefa202170e86668176d06.ppt

  • Количество слайдов: 15

Lab 10 Guide: 프린터 출력 예제 * 한 페이지의 그림 인쇄 (교재 24장, 1262 Lab 10 Guide: 프린터 출력 예제 * 한 페이지의 그림 인쇄 (교재 24장, 1262 -1265쪽) * 뷰를 이용하지 않는 프린터 출력 (교재 24장, 1272 -1277쪽) 1

실습 목적 및 장비 § 실습 목적 • 인쇄 기능의 구현 방법 인쇄 관련 실습 목적 및 장비 § 실습 목적 • 인쇄 기능의 구현 방법 인쇄 관련 함수의 표현 및 이용 방법 ü 좌표계 및 매핑 모드의 이해 ü 페이지 처리 방법 ü 프린터 DC의 획득 방법 ü § 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6. 0) 2

1. 한 페이지의 그림 인쇄 § 예제 프로그램 개요 • • • Single Document 1. 한 페이지의 그림 인쇄 § 예제 프로그램 개요 • • • Single Document 애플리케이션 6. 5절 드로잉 툴에 인쇄 기능 추가 (http: //cs. sookmyung. ac. kr/class/06395/lec/exe/Draw. Zip. exe) 실행 파일 (http: //cs. sookmyung. ac. kr/class/06395/lec/exe/Draw. exe) § 프로그램 골격 • 뷰 클래스는 CView 대신 CScroll. View에서 상속 (Draw. View. h와 Draw. View. cpp에서 모든 CView를 CScroll. View로 교 체) 3

한 페이지의 그림 인쇄 § 매핑 모드 및 스크롤 파라미터 설정 class CDraw. View 한 페이지의 그림 인쇄 § 매핑 모드 및 스크롤 파라미터 설정 class CDraw. View : public CScroll. View { … public: CSize m_size. Page; void CDraw. View: : On. Initial. Update() { … // A 4 용지크기. MM_LOMETRIC은 0. 1 mm를 단위로 함 m_size. Page = CSize(2100, 2970); CSize size. Total = CSize(m_size. Page. cx, m_size. Page. cy); CSize size. Page(size. Total. cx/2, size. Total. cy/2); CSize size. Line(size. Total. cx/100, size. Total. cy/100); Set. Scroll. Sizes(MM_LOMETRIC, size. Total, size. Page, size. Line); } 4

한 페이지의 그림 인쇄 § 매핑 모드 및 스크롤 반영 void CDraw. View: : 한 페이지의 그림 인쇄 § 매핑 모드 및 스크롤 반영 void CDraw. View: : On. LButton. Down(UINT n. Flags, CPoint point) { CDraw. Doc *p. Doc = Get. Document(); m_p. Current. Stroke = new CStroke(m_n. Pen. Thickness, m_Pen. Color); p. Doc->m_stroke. List. Add. Tail(m_p. Current. Stroke); p. Doc->Set. Modified. Flag(); Set. Capture(); // 논리 좌표계로 변환 CClient. DC dc(this); dc. Set. Map. Mode(MM_LOMETRIC); dc. DPto. LP(&point); CWnd 멤버 함수들은 디바이스 좌표계를 사용하므로 On. LButton. Down() 함수의 파라 미터 point도 디바이스 좌표계의 좌표 값이다. 따라서 이 값을 논 리좌표계로 변환해 주어야 한다 m_pt. Prev = point; CScroll. View: : On. LButton. Down(n. Flags, point); } 5

void CDraw. View: : On. Mouse. Move(UINT n. Flags, CPoint point) { if (Get. void CDraw. View: : On. Mouse. Move(UINT n. Flags, CPoint point) { if (Get. Capture() != this) return; // 논리 좌표계로 변환 CClient. DC dc(this); dc. Set. Map. Mode(MM_LOMETRIC); dc. DPto. LP(&point); 점의 좌표를 저장할 때 현재 스크롤 위치를 반영함 // 스크롤 반영 m_p. Current. Stroke->m_pt. Array. Add(point + Get. Scroll. Position()); CPen* p. Old. Pen = dc. Select. Object(&m_Current. Pen); dc. Move. To(m_pt. Prev); dc. Line. To(point); dc. Select. Object(p. Old. Pen); m_pt. Prev = point; CScroll. View: : On. Mouse. Move(n. Flags, point); } 6

2. 뷰를 이용하지 않는 프린터 출력 § 예제 프로그램 개요 • • 다이얼로그 기반 2. 뷰를 이용하지 않는 프린터 출력 § 예제 프로그램 개요 • • 다이얼로그 기반 애플리케이션 실행 파일 (http: //cs. sookmyung. ac. kr/class/06395/lec/exe/Dlg. Prn. exe) § 프로그램 골격 On. File. Open() On. File. Save() On. File. Print() Edit (m_str. Data) 7

뷰를 이용하지 않는 프린터 출력 § 파일 열기 대화 상자의 출력, CArchive 객체 생성, 뷰를 이용하지 않는 프린터 출력 § 파일 열기 대화 상자의 출력, CArchive 객체 생성, Serialize() 호출 void CDlg. Prn. Dlg: : On. File. Open() { char sz. Filter[] = "Text Files(*. TXT)|*. TXT|All Files(*. *)|*. *||"; CFile. Dialog file. Dlg (TRUE, "txt", NULL, OFN_HIDEREADONLY, sz. Filter); if(IDOK == file. Dlg. Do. Modal()) { CFile file(file. Dlg. Get. File. Name(), CFile: : mode. Read); // 파일 읽기를 위한 CArchive 객체 생성 CArchive ar(&file, CArchive: : load); // Serialize 함수 호출 Serialize(ar); } } 8

뷰를 이용하지 않는 프린터 출력 § 파일 저장 대화 상자의 출력, CArchive 객체 생성, 뷰를 이용하지 않는 프린터 출력 § 파일 저장 대화 상자의 출력, CArchive 객체 생성, Serialize() 호출 void CDlg. Prn. Dlg: : On. File. Save() { char sz. Filter[] = "Text Files(*. TXT)|*. TXT|All Files(*. *)|*. *||"; CFile. Dialog file. Dlg(FALSE, "txt", NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, sz. Filter); if(IDOK == file. Dlg. Do. Modal()) { CFile file(file. Dlg. Get. File. Name(), CFile: : mode. Write|CFile: : mode. Create); CArchive ar(&file, CArchive: : store); Serialize(ar); } } 9

뷰를 이용하지 않는 프린터 출력 § Serialize() 함수 void CDlg. Prn. Dlg: : Serialize(CArchive& 뷰를 이용하지 않는 프린터 출력 § Serialize() 함수 void CDlg. Prn. Dlg: : Serialize(CArchive& ar) { if (ar. Is. Storing()) { // 파일 저장 Update. Data(); ar. Write. String(m_str. Data); } else { // 파일 읽기 DWORD dw. Size = ar. Get. File()->Get. Length(); ar. Read(m_str. Data. Get. Buffer. Set. Length(dw. Size), dw. Size); Update. Data(FALSE); } } 10

뷰를 이용하지 않는 프린터 출력 § On. File. Print() 함수 void CDlg. Prn. Dlg: 뷰를 이용하지 않는 프린터 출력 § On. File. Print() 함수 void CDlg. Prn. Dlg: : On. File. Print() { // 인쇄 다이얼로그 박스 출력 CPrint. Dialog print. Dlg(FALSE); if (print. Dlg. Do. Modal() == IDCANCEL) return; // 프린터 DC를 얻음 CDC dc; dc. Attach(print. Dlg. Get. Printer. DC()); dc. m_b. Printing = TRUE; // 인쇄될 도큐먼트에 관한 정보 설정 CString str. Title; str. Title. Load. String(AFX_IDS_APP_TITLE); DOCINFO di; : : Zero. Memory (&di, sizeof (DOCINFO)); di. cb. Size = sizeof (DOCINFO); di. lpsz. Doc. Name = str. Title; 11

// 도큐먼트 인쇄 시작 BOOL b. Printing. OK = dc. Start. Doc(&di); // CPrint. // 도큐먼트 인쇄 시작 BOOL b. Printing. OK = dc. Start. Doc(&di); // CPrint. Info에 인쇄 관련 정보 설정 CPrint. Info; Info. m_rect. Draw. Set. Rect(0, 0, dc. Get. Device. Caps(HORZRES), dc. Get. Device. Caps(VERTRES)); Info. Set. Max. Page(1); // On. Begin. Printing 함수 호출 On. Begin. Printing(&dc, &Info); 12

// 페이지를 인쇄하는 루프 for (UINT page = Info. Get. Min. Page(); page <= // 페이지를 인쇄하는 루프 for (UINT page = Info. Get. Min. Page(); page <= Info. Get. Max. Page() && b. Printing. OK; page++) { dc. Start. Page(); // 페이지 인쇄 시작 Info. m_n. Cur. Page = page; On. Print(&dc, &Info); // On. Print 함수 호출 b. Printing. OK = (dc. End. Page() > 0); // 페이지 인쇄 완료 } On. End. Printing(&dc, &Info); // On. End. Printing 함수 호출 if (b. Printing. OK) dc. End. Doc(); else dc. Abort. Doc(); // 도큐먼트 인쇄 종료 dc. Detach(); } 13

뷰를 이용하지 않는 프린터 출력 § 기타 함수 void CDlg. Prn. Dlg: : On. 뷰를 이용하지 않는 프린터 출력 § 기타 함수 void CDlg. Prn. Dlg: : On. Begin. Printing(CDC *p. DC, CPrint. Info *p. Info) { } void CDlg. Prn. Dlg: : On. End. Printing(CDC *p. DC, CPrint. Info *p. Info) { } void CDlg. Prn. Dlg: : On. Print(CDC *p. DC, CPrint. Info *p. Info) { CRect rect. Bound(1000, -1000, 10000, -15000); Update. Data(); p. DC->Set. Map. Mode(MM_TWIPS); p. DC->Draw. Text(m_str. Data, rect. Bound, DT_LEFT|DT_TOP); } * 정의되는 모든 함수들은 CDlg. Prn. Dlg 클래스 안에 선언되어야 함 (Class Wizard에 의해 또는 직접 Dlg. Prn. Dlg. h를 편집하여) 14

보고서 작성 요령 § 보고서 • • 프로그램 소스 프로그램 설명 (App. Wizard에 의해 보고서 작성 요령 § 보고서 • • 프로그램 소스 프로그램 설명 (App. Wizard에 의해 생성된 부분은 제외) 15