ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 인쇄하기
    .NET 2008. 11. 20. 11:41
    반응형



    인쇄하기

    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 총 다섯개 이미지 이다. 받아서 사용해보길 바란다.

    반응형

    댓글

Designed by Tistory.