28 Haziran 2012 Perşembe

C# ile Print İşlemleri

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile Windows Forms uygulamalarımızda yazdırma (print) işlemlerini nasıl gerçekleştireceğimizi detaylı bir şekilde inceleyeceğiz. Uygulamalarımızdan raporlar, belgeler veya grafikler basmak, birçok iş uygulamasının temel bir ihtiyacıdır. .NET Framework, bu işlemleri kolaylaştıran güçlü sınıflar sunar. Gelin, yazdırma süreçlerinin temel adımlarını ve ilgili kontrolleri birlikte keşfedelim.

Yazdırma İşlemlerinin Temel Mantığı

C# .NET Framework'te yazdırma işlemleri, genellikle aşağıdaki temel adımları içerir:

  1. Yazdırılacak İçeriği Tanımlama: PrintDocument sınıfı, yazdırılacak belgeyi temsil eder.
  2. PrintPage Olayını İşleme: Yazdırılacak içeriğin her sayfasının nasıl çizileceğini bu olayda belirtiriz.
  3. Yazdırma Ayarlarını Yapma: PrintDialog ile yazıcı seçimi, PageSetupDialog ile sayfa ayarları gibi seçenekleri kullanıcıya sunarız.
  4. Yazdırma Önizlemesi (İsteğe Bağlı): PrintPreviewDialog ile yazdırmadan önce belgenin nasıl görüneceğini gösteririz.
  5. Yazdırma İşlemini Başlatma: PrintDocument nesnesinin Print() metodu ile yazdırma işlemini başlatırız.

Yazdırma İşlemlerinde Kullanılan Temel Sınıflar

Yazdırma işlemleri için System.Drawing.Printing ve System.Windows.Forms ad alanlarındaki sınıfları kullanırız.

1. PrintDocument

Yazdırılacak belgeyi temsil eden temel sınıftır. En önemli olayı PrintPage olayıdır.

  • DocumentName: Yazdırma kuyruğunda görünecek belge adı.
  • PrinterSettings: Yazıcı ayarlarını içerir (hangi yazıcıya yazdırılacağı, kopya sayısı vb.).
  • DefaultPageSettings: Varsayılan sayfa ayarlarını içerir (kağıt boyutu, yönlendirme, kenar boşlukları vb.).
  • Print(): Yazdırma işlemini başlatır.
2. PrintDialog

Kullanıcının yazıcı seçmesini, kopya sayısını belirlemesini ve yazdırma işlemini başlatmasını sağlayan standart Windows diyalog kutusudur.

  • Document: Bağlanacağı PrintDocument nesnesi.
  • AllowSomePages: Kullanıcının belirli sayfaları yazdırmasına izin verilip verilmediğini belirler.
  • ShowDialog(): Diyalogu gösterir.
3. PageSetupDialog

Kullanıcının sayfa boyutunu, yönlendirmesini (dikey/yatay) ve kenar boşluklarını ayarlamasını sağlayan standart Windows diyalog kutusudur.

  • Document: Bağlanacağı PrintDocument nesnesi.
  • ShowDialog(): Diyalogu gösterir.
4. PrintPreviewDialog

Yazdırma işleminden önce belgenin nasıl görüneceğini kullanıcıya gösteren bir önizleme penceresidir.

  • Document: Bağlanacağı PrintDocument nesnesi.
  • ShowDialog(): Diyalogu gösterir.

PrintPage Olayı: İçeriği Çizme

PrintDocument nesnesinin PrintPage olayı, yazdırma işleminin kalbidir. Her sayfa yazdırılmadan önce bu olay tetiklenir. Bu olay işleyicisinde, sayfanın üzerine metin, grafik veya diğer görsel öğeleri çizmek için Graphics nesnesini kullanırız.

using System.Drawing; // Graphics, Font, SolidBrush için
using System.Drawing.Printing; // PrintPageEventArgs için

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    // Graphics nesnesi, sayfa üzerine çizim yapmak için kullanılır
    Graphics g = e.Graphics;

    // Yazı tipi ve rengi tanımlama
    Font font = new Font("Arial", 12);
    SolidBrush brush = new SolidBrush(Color.Black);

    // Sayfa kenar boşlukları
    float solKenarBosluk = e.MarginBounds.Left;
    float ustKenarBosluk = e.MarginBounds.Top;

    // Sayfaya metin çizme
    g.DrawString("Merhaba Webkolog.net Okurları!", font, brush, solKenarBosluk, ustKenarBosluk);

    // Daha fazla sayfa olup olmadığını belirtme
    // Eğer yazdırılacak başka içerik varsa e.HasMorePages = true; yapılır, aksi takdirde false.
    e.HasMorePages = false;
}
  • e.Graphics: Sayfa üzerine çizim yapmak için kullanılan Graphics nesnesi.
  • e.MarginBounds: Sayfanın yazdırılabilir alanının sınırları.
  • e.PageBounds: Sayfanın toplam fiziksel sınırları.
  • e.HasMorePages: Eğer yazdırılacak başka sayfa varsa true olarak ayarlanır, aksi takdirde false. Bu, PrintDocument'ın bir sonraki sayfayı istemesini sağlar.

Örnek 1: Basit Metin Yazdırma

Bu örnekte, bir buton tıklamasıyla basit bir metin belgesini yazdırma işlemini adım adım göstereceğiz.

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private PrintDocument printDocument1;
    private PrintDialog printDialog1;
    private PageSetupDialog pageSetupDialog1;
    private PrintPreviewDialog printPreviewDialog1;

    public Form1()
    {
        InitializeComponent();

        // PrintDocument nesnesini oluştur
        printDocument1 = new PrintDocument();
        // PrintPage olayını bağla
        printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);

        // Diyalog kontrollerini oluştur
        printDialog1 = new PrintDialog();
        printDialog1.Document = printDocument1; // PrintDialog'ı PrintDocument'a bağla

        pageSetupDialog1 = new PageSetupDialog();
        pageSetupDialog1.Document = printDocument1; // PageSetupDialog'ı PrintDocument'a bağla

        printPreviewDialog1 = new PrintPreviewDialog();
        printPreviewDialog1.Document = printDocument1; // PrintPreviewDialog'ı PrintDocument'a bağla

        // Form üzerinde butonlar olduğunu varsayalım:
        // buttonPrint (Yazdır), buttonPageSetup (Sayfa Ayarları), buttonPrintPreview (Baskı Önizleme)
        this.buttonPrint.Click += new EventHandler(buttonPrint_Click);
        this.buttonPageSetup.Click += new EventHandler(buttonPageSetup_Click);
        this.buttonPrintPreview.Click += new EventHandler(buttonPrintPreview_Click);
    }

    // PrintPage olayı işleyicisi: Sayfaya ne çizileceğini burada belirtiriz
    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        Font font = new Font("Arial", 14, FontStyle.Regular);
        SolidBrush brush = new SolidBrush(Color.Black);

        // Yazdırılacak metin
        string metin = "Bu, Webkolog.net için C# ile yazdırma işlemlerini anlatan bir örnektir.\n\n";
        metin += "Bu metin, PrintDocument'ın PrintPage olayında çizilmektedir.\n";
        metin += "Farklı fontlar, renkler ve konumlar kullanarak daha karmaşık çıktılar oluşturabilirsiniz.";

        // Metni sayfaya çiz
        // DrawString(metin, font, fırça, x_koordinatı, y_koordinatı)
        g.DrawString(metin, font, brush, e.MarginBounds.Left, e.MarginBounds.Top);

        // Başka sayfa yok
        e.HasMorePages = false;
    }

    private void buttonPrint_Click(object sender, EventArgs e)
    {
        // PrintDialog'ı göster
        if (printDialog1.ShowDialog() == DialogResult.OK)
        {
            // Kullanıcı "Yazdır"a bastıysa yazdırma işlemini başlat
            printDocument1.Print();
        }
    }

    private void buttonPageSetup_Click(object sender, EventArgs e)
    {
        // PageSetupDialog'ı göster
        pageSetupDialog1.ShowDialog();
    }

    private void buttonPrintPreview_Click(object sender, EventArgs e)
    {
        // PrintPreviewDialog'ı göster
        printPreviewDialog1.ShowDialog();
    }
}

Örnek 2: Resim Yazdırma

Bu örnekte, bir resmin nasıl yazdırılacağını göstereceğiz.

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private PrintDocument printDocument2;
    private PrintDialog printDialog2;
    private PrintPreviewDialog printPreviewDialog2;
    private Image imageToPrint; // Yazdırılacak resim

    public Form1()
    {
        InitializeComponent();

        printDocument2 = new PrintDocument();
        printDocument2.PrintPage += new PrintPageEventHandler(printDocument2_PrintPage);

        printDialog2 = new PrintDialog();
        printDialog2.Document = printDocument2;

        printPreviewDialog2 = new PrintPreviewDialog();
        printPreviewDialog2.Document = printDocument2;

        // Form üzerinde bir buton (buttonPrintImage) olduğunu varsayalım
        this.buttonPrintImage.Click += new EventHandler(buttonPrintImage_Click);

        // Yazdırılacak resmi yükle (örnek olarak yerel bir resim dosyası)
        // Lütfen bu yolu kendi sisteminizdeki geçerli bir resim dosyası ile değiştirin
        try
        {
            imageToPrint = Image.FromFile("C:\\path\\to\\your\\image.jpg"); 
            // Veya bir PictureBox'tan alabilirsiniz: imageToPrint = pictureBox1.Image;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Resim yüklenirken hata oluştu: " + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
            imageToPrint = null; // Hata durumunda resmi null yap
        }
    }

    private void printDocument2_PrintPage(object sender, PrintPageEventArgs e)
    {
        if (imageToPrint != null)
        {
            Graphics g = e.Graphics;

            // Resmi sayfanın sol üst köşesine, kenar boşlukları dahilinde çiz
            // Resmi sayfanın tamamına sığdırmak için:
            // g.DrawImage(imageToPrint, e.MarginBounds);

            // Resmi belirli bir boyutta çizmek için:
            int x = e.MarginBounds.Left;
            int y = e.MarginBounds.Top;
            int width = imageToPrint.Width;
            int height = imageToPrint.Height;

            // Eğer resim sayfa sınırlarını aşıyorsa boyutunu ayarla
            if (width > e.MarginBounds.Width)
            {
                width = e.MarginBounds.Width;
                height = (int)(imageToPrint.Height * ((float)width / imageToPrint.Width));
            }
            if (height > e.MarginBounds.Height)
            {
                height = e.MarginBounds.Height;
                width = (int)(imageToPrint.Width * ((float)height / imageToPrint.Height));
            }

            g.DrawImage(imageToPrint, x, y, width, height);
        }
        e.HasMorePages = false; // Başka sayfa yok
    }

    private void buttonPrintImage_Click(object sender, EventArgs e)
    {
        if (imageToPrint == null)
        {
            MessageBox.Show("Yazdırılacak bir resim bulunamadı.", "Uyarı");
            return;
        }

        if (printDialog2.ShowDialog() == DialogResult.OK)
        {
            printDocument2.Print();
        }
    }
}

0 yorum:

Yorum Gönder