인쇄하기
GDI+ 인쇄 관련 클래스들을 보자
클래스 | 설명 |
---|---|
인쇄에 관련된 여러 예제들이 있지만 모두 합쳐서 작업해보면 깔끔할 것 같다.
응용작업
일기장 프로그램을 만들어서 프린트 할 수 있도록 하는 작업을 해보도록 하자. 윈도우 응용 프로그램으로 새 프로젝트를 만들고 폼에 컨트롤들을 배치한다.
이 폼 레이아웃에서 특별한 점은 없으나 가장 상위의 날짜 입력부분에 들어가는 컨트롤이 DateTimePicker 라는 점이다. 여기에 들어가는 컨트롤들에 대한 아이디는 본인의 임의대로 지정할 수 있으니 편하게 지정하기 바란다.
먼저 네임스페이스와 생성자 이전까지를 본다.
8 using System.Drawing.Imaging;
9 using System.Drawing.Printing; // 추가한다.
10
11 namespace DiaryPrint
12 {
13 public partial class frmDiary : Form
14 {
15 private Font m_MainFont = null;
16 private Font m_SubFont = null;
17 private Font m_SmallFont = null;
18 private PageSettings m_PageSetting = null;
19 private Bitmap m_BackBmp = null;
20 private Bitmap[] m_Weather = new Bitmap[4];
21
22 public frmDiary()
다음으로 생성자 내부의 작업을 수행한다.
24 InitializeComponent();
25
26 string FilePath = Application.StartupPath + "\\";
27 m_MainFont = new Font("돋움", 15, FontStyle.Bold);
28 m_SubFont = new Font("돋움체", 13);
29 m_SmallFont = new Font("바탕체", 9);
30 m_BackBmp = new Bitmap(GetType(), "LetterBackground.jpg");
31 // 날씨아이콘
32 for (int i = 0; i < 4; i++)
33 {
34 string strIcon = string.Format("Weather0{0}.gif", i + 1);
35 m_Weather[i] = new Bitmap(GetType(), strIcon);
36 }
37 cb_Weather.SelectedIndex = 0;
폼 레이아웃에 나와있는 페이지 설정, 미리보기, 인쇄하기 버튼에 대한 이벤트 작성이다.
40 private void btn_PageSetup_Click(object sender, EventArgs e)
41 {
42 try
43 {
44 PageSetupDialog psd = new PageSetupDialog();
45 if (this.m_PageSetting == null)
46 this.m_PageSetting = new PageSettings();
47 psd.PageSettings = this.m_PageSetting;
48 psd.ShowDialog();
49 }
50 catch (InvalidPrinterException pex)
51 {
52 MessageBox.Show(pex.Message);
53 }
54 catch (Exception ex)
55 {
56 MessageBox.Show(ex.Message);
57 }
58 }
59
60 private void btn_Preview_Click(object sender, EventArgs e)
61 {
62 try
63 {
64 PrintDocument pd = new PrintDocument();
65 pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
66
67 if (this.m_PageSetting != null)
68 {
69 pd.DefaultPageSettings = this.m_PageSetting;
70 }
71
72 PrintPreviewDialog ppd = new PrintPreviewDialog();
73 ppd.Document = pd;
74 ppd.ShowDialog();
75 }
76 catch (Exception ex)
77 {
78 MessageBox.Show(ex.Message);
79 }
80 }
81
82 private void btn_Print_Click(object sender, EventArgs e)
83 {
84 try
85 {
86 PrintDocument pd = new PrintDocument();
87 pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
88
89 if (this.m_PageSetting != null)
90 {
91 pd.DefaultPageSettings = this.m_PageSetting;
92 }
93
94 PrintDialog pdlg = new PrintDialog();
95 pdlg.Document = pd;
96
97 if (pdlg.ShowDialog() == DialogResult.OK)
98 {
99 pd.Print(); // 인쇄
100 }
101 }
102 catch (Exception ex)
103 {
104 MessageBox.Show(ex.Message);
105 }
106 }
다음으로 가장 핵심 프로세스인 이벤트 pd_PrintPage와 메서드 PaintDocument이다.
108 protected void pd_PrintPage(object sender, PrintPageEventArgs ppe)
109 {
110 Graphics g = ppe.Graphics;
111 PaintDocument(g);
112 ppe.HasMorePages = false;
113 }
114
115 private void PaintDocument(Graphics g)
116 {
117 g.FillRectangle(Brushes.White, 100, 50, 600, 800); // 전체 사각형
118 g.DrawImage(m_BackBmp, 100, 50); // 배경이미지 출력
119 g.DrawImage(m_Weather[cb_Weather.SelectedIndex], 380, 120); // 날씨아이콘 출력
120 g.DrawString(cb_Weather.SelectedItem.ToString(), this.m_MainFont, Brushes.White, 375, 160); // 날씨적기
121 g.DrawString(this.dtp_Date.Text, this.m_SubFont, Brushes.Brown, 380, 236); // 날짜출력
122
123 StringFormat sf = new StringFormat(); // 글자포맷
124 sf.Alignment = StringAlignment.Near; // 세로정렬
125 sf.LineAlignment = StringAlignment.Center; // 가로정렬
126 Rectangle rect = new Rectangle(100, 280, 500, this.m_MainFont.Height * 3); // 제목 적는 영역
127 g.DrawString(this.txt_Title.Text, this.m_MainFont, Brushes.Black, rect, sf); // 글적기
128
129 rect = new Rectangle(240, 350, 500, this.m_SubFont.Height * 10); // 내용 적는 영역
130 g.DrawString(this.txt_Contents.Text, this.m_SubFont, Brushes.Black, rect); // 글 적기
131 }
닷넷에서 제공하는 프린트에 관련된 핵심 클래스는 다 확인할 수 있으므로 꼭 해보자. 여기에 필요한 이미지는,
총 다섯개 이미지 이다. 받아서 사용해보길 바란다.
'.NET' 카테고리의 다른 글
ASP.NET DLL만들기 매서드 만들기 예제 참고 헬퍼 클래스 (0) | 2008.12.15 |
---|---|
C# 폼에 값넘기는것 참고사항 이벤트핸들러 sender as 쓰고 (0) | 2008.11.24 |
C# 소켓 프로그래밍의 개요 (0) | 2008.11.24 |
C# CDI+ 키보드 마우스 제어 관련 예제 소스 (0) | 2008.11.21 |
C# 시스템 정보 대단히 신기한데? Environment (0) | 2008.11.20 |
C# String 타입에서 출바꿈 출력하기 (아스키코드값 변환 엔터) (0) | 2008.11.20 |
C# 마우스와 키보드 (0) | 2008.11.20 |
GDI+ , 타이머(타이머를 통해서 시계를 구현한다), 마우스와 키보드 (마우스/키보드 입력값을 확인한다) (0) | 2008.11.19 |