반응형

찰스 페졸드의 WPF 를 읽으면서 정리한 인쇄(PrintEllipse) 소스.

책을 읽으면서 직접 코딩을 하면서 정리했던 소스들을 그대로 옮겨 보았다.

 

using System;
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace PrintEllipse
{
    public class PrintEllipse : Window
    {
        private PrintTicket prntkt;

        [STAThread]
        public static void Main()
        {
            Application app = new Application();
            app.Run(new PrintEllipse());
        }

        public PrintEllipse()
        {
            Title = "Print Ellipse";
            FontSize = 24;

            //윈도우 Content를 위한 스택 패널 생성
            StackPanel stack = new StackPanel();
            Content = stack;

            //인쇄를 위한 버튼 생성
            Button btn = new Button();
            btn.Content = "_Print...";
            btn.HorizontalAlignment = HorizontalAlignment.Center;
            btn.Margin = new Thickness(24);
            btn.Click += PrintOnClick;
            stack.Children.Add(btn);
        }

        private void PrintOnClick(object sender, RoutedEventArgs e)
        {
            PrintDialog dlg = new PrintDialog();
            if (prntkt != null) dlg.PrintTicket = prntkt;

            //페이지지정 라디오버튼을 활성화하기 위해서는 UserPageRangeEnabled를 true로 해야 한다.
            dlg.UserPageRangeEnabled = true;

            //ShowDialog는 널 값이 가능한 bool을 반환하게 정의되어 있다. 대화상자 클래스의 ShowDialog 메소드는 true/false/null을 반환한다.
            //사용자가 인쇄 버튼을 클릭하면 true를, 취소 버튼을 클릭하면 false를, 제목 옆의 닫기 버튼을 클릭하면 null을 반환한다.
            //GetValueOrDefault 메소드는 if문을 위해 결과가 항상 bool 형태가 되게 null 값을 false로 바꾸어 준다.
            if ((bool)dlg.ShowDialog().GetValueOrDefault())
            {
                prntkt = dlg.PrintTicket;

                //DrawingVisual을 생성하고 DrawingContext를 준비
                DrawingVisual vis = new DrawingVisual();
                DrawingContext dc = vis.RenderOpen();

                //타원을 출력
                //PrintableAreaWidth와 PrintableAreaHeight는 페이지의 인쇄 가능 영역을 참조하는 것이 아니라 장치 독립적인 단위(1/96)로 페이지의 전체 물리적인 크기를 가리킨다.
                dc.DrawEllipse(Brushes.LightGray, new Pen(Brushes.Black, 3),
                                new Point(dlg.PrintableAreaWidth / 2, dlg.PrintableAreaHeight / 2),
                                dlg.PrintableAreaWidth / 2 - 10, dlg.PrintableAreaHeight / 2 - 10);

                //DrawingCOntext를 닫음
                dc.Close();

                //끝으로 페이지를 인쇄
                dlg.PrintVisual(vis, "My First Print Job");
            }
        }
    }
}
반응형

+ Recent posts