본문 바로가기
IT-개발,DB

[개발] C# 인쇄하기

by SB리치퍼슨 2016. 1. 8.

[개발] C# 인쇄하기





인쇄하기

GDI+ 인쇄 관련 클래스들을 보자

클래스설명
PageSetupDialog페이지 설정을 처리하는 대화상자. 용지 크기 및 공급, 방향, 여백 등을 설정
PrintDialog컴퓨터에 설치된 프린터를 선택하는 대화상자. 프린터 속성과 인쇄범위 매수 설정
PrintPreviewDialog프린터에 인쇄할 내용 미리보기 대화상자.
PageSettings인쇄될 특정 페이지에 대한 속성 설정.
PrintDocument인쇄될 내용을 담고 있는 개체
PrinterSettings프린터의 색(흑백/컬러), 급지 방식, 가로 인쇄 등의 프린터 속성 설정

인쇄에 관련된 여러 예제들이 있지만 모두 합쳐서 작업해보면 깔끔할 것 같다.

 

응용작업

일기장 프로그램을 만들어서 프린트 할 수 있도록 하는 작업을 해보도록 하자. 윈도우 응용 프로그램으로 새 프로젝트를 만들고 폼에 컨트롤들을 배치한다.

form_layout.gif

 

 

 

 

 

 

 

 

 

 

 

이 폼 레이아웃에서 특별한 점은 없으나 가장 상위의 날짜 입력부분에 들어가는 컨트롤이 DateTimePicker 라는 점이다. 여기에 들어가는 컨트롤들에 대한 아이디는 본인의 임의대로 지정할 수 있으니 편하게 지정하기 바란다.

먼저 네임스페이스와 생성자 이전까지를 본다.

 

  1. 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()

 

다음으로 생성자 내부의 작업을 수행한다.

  1. 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;

폼 레이아웃에 나와있는 페이지 설정, 미리보기, 인쇄하기 버튼에 대한 이벤트 작성이다.

  1. 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이다.

  1. 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         }

닷넷에서 제공하는 프린트에 관련된 핵심 클래스는 다 확인할 수 있으므로 꼭 해보자. 여기에 필요한 이미지는,

LetterBackground.jpgWeather01.gifWeather02.gifWeather03.gifWeather04.gif 총 다섯개 이미지 이다. 받아서 사용해보길 바란다.



PrintDiary.alz


반응형

댓글