[개발] C# 인쇄하기
인쇄하기
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 }
닷넷에서 제공하는 프린트에 관련된 핵심 클래스는 다 확인할 수 있으므로 꼭 해보자. 여기에 필요한 이미지는,
총 다섯개 이미지 이다. 받아서 사용해보길 바란다.
'IT-개발,DB' 카테고리의 다른 글
[개발/VCL] 델파이 영상처리 VCL Sobakcc Lab (0) | 2016.01.16 |
---|---|
디렉토리 구조만 복사 (0) | 2016.01.09 |
[VC] IE에 사용자 툴바를 설치후에 기본으로 보이게 하는 방법 (0) | 2015.12.17 |
[개발/VC++] 익스플로러에서 새창이 생성될때 그 창의 포인터를 얻는 방법 (0) | 2015.12.17 |
[web] 웹서버 설정 관련 링크 : 웹서버 + PHP + MySQL + DDNS (0) | 2015.12.01 |
댓글