Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Windows Form Uygulamasında Paint Yapımı

Merhaba,

Bu makalemizde C# Windows Form uygulamasında çizgi çizmeyi irdeleyecek ve örnek bir Paint uygulaması üzerinde içeriğimizi kuvvetlendireceğiz. Windows Form uygulamalarında forma çizgi çizebilmek için kâh Graphics sınıfı üzerinden Draw ile başayan metodları kullanabilir kâh tek tek pixeller üzerinde işlemler yapabiliriz. Tabi burada ilk verdiğim Graphics sınıfı kullanılarak çizilen çizgiler genellikle şekillerden oluşan yapıları barındırmaktayken, tek tek pixellere müdahale ederek çizdirdiklerimiz kullanıcının mouse ile olan insiyatifine bağlı tarifsiz çizgileri ifade etmektedir.

Biz bu içeriğimizde ikinci öneri olan pixellere müdahale yöntemiyle çizim yapmayı inceleyeceğiz.

Hemen konuya giriş yapabilmek maksadıyla aşağıdaki gibi bir form tasarlayalım.

    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;
        
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code
        
        private void InitializeComponent()
        {
            this.txt1 = new System.Windows.Forms.TextBox();
            this.btnRenkSec = new System.Windows.Forms.Button();
            this.cdRenk = new System.Windows.Forms.ColorDialog();
            this.SuspendLayout();
            // 
            // txt1
            // 
            this.txt1.Location = new System.Drawing.Point(12, 12);
            this.txt1.Name = "txt1";
            this.txt1.Size = new System.Drawing.Size(100, 20);
            this.txt1.TabIndex = 0;
            this.txt1.TextChanged += new System.EventHandler(this.txt1_TextChanged);
            // 
            // btnRenkSec
            // 
            this.btnRenkSec.Location = new System.Drawing.Point(118, 9);
            this.btnRenkSec.Name = "btnRenkSec";
            this.btnRenkSec.Size = new System.Drawing.Size(75, 23);
            this.btnRenkSec.TabIndex = 2;
            this.btnRenkSec.Text = "Renk Seç";
            this.btnRenkSec.UseVisualStyleBackColor = true;
            this.btnRenkSec.Click += new System.EventHandler(this.btnRenkSec_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackColor = System.Drawing.SystemColors.ButtonHighlight;
            this.ClientSize = new System.Drawing.Size(737, 512);
            this.Controls.Add(this.btnRenkSec);
            this.Controls.Add(this.txt1);
            this.Name = "Form1";
            this.Text = "Paint";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox txt1;
        private System.Windows.Forms.Button btnRenkSec;
        private System.Windows.Forms.ColorDialog cdRenk;
    }

Formumuzun ekran görüntüsü aşağıdaki gibidir.
C# Windows Form Uygulamasında Paint Yapımı

Çalışma yapacağımız forma şöyle bir baktığımızda birer adet TextBox, Button ve ColorDialog nesneleri mevcut. Burada TextBox’a girilecek değer forma çizeceğimiz çizginin kalınlığını belirtirken, Button nesnesi ile de ColorDialog nesnesi gösterilmekte ve çizginin rengi belirlenmektedir.

Evet şimdi çizim işlemimize geçebiliriz. Burada yapacağımız işlem, form ekranında mouse tıklandığı noktadan başlayarak, sürüklendiği tüm koordinatlarla birlikte ta ki bırakıldığı noktaya kadar olan tüm pixcellerin rengini ColorDialog ile belirlediğimiz renge boyamaktır. Bu işlem için formun tıklandığı koordinatı yakalayabilmek için “MouseDown“, sürüklendiği anı yakalayabilmek için “MouseMove” ve bırakıldığı koordinata erişebilmek için ise “MouseUp” olaylarını kullanacağız.

Tabi öncelikle çizim yapacak işlevlerimizi oluşturmamız gerekecektir.

        private void Form1_Load(object sender, EventArgs e) => g = this.CreateGraphics();
        Graphics g;
        Bitmap b = new Bitmap(5, 5);
        bool Durum;
        int x = 5;
        private void DrawLine(Graphics g, Point location, Color color)
        {
            if (Durum)
            {
                for (int i = 0; i < x; i++)
                    for (int j = 0; j < x; j++)
                        b.SetPixel(i, j, color);
                g.DrawImageUnscaled(b, location.X, location.Y);
            }
        }

Yukarıdaki kod bloğunu incelerseniz eğer bir Graphics referansı oluşturmakta ve bu referansa Form_Load eventında this.CreateGraphics() komutuyla o anki form nesnesi üzerinden bir grafik oluşturup vermekteyiz. Ayriyetten Bitmap nesnesi oluşturup varsayılan değer olarak 5’e 5’lik bir pixel değerinde ayarlamaktayız. Oluşturduğumuz bool tipteki Durum değişkeni ise mouseun o anda tıklayarak hareket edip etmediği üzerinde bize bilgi verecektir. DrawLine metodu ise Bitmap içerisindeki pixelleri tek tek verilen color tipinde dolduracaktır. Son olarakta g.DrawImageUnscaled(b, location.X, location.Y); komutu aracılığıyla ilgili çizimi forma yansıtacaktır.

Şimdi ise olaylarımızı aşağıya alalım.

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                DrawLine(g, e.Location, Renk);
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e) => Durum = false;

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Durum = true;
                DrawLine(g, e.Location, Renk);
            }
        }

Burada pek fazla açıklayama değer bir yapı göremiyorum. Görüldüğü üzere mouse hareketlerine göre çizim gerçekleştirilmektedir.

Son olarak çizgimizin rengi ve kalınlığını belirleyecek yapılarımızı oluşturalım.

        Color Renk = Color.Black;
        private void btnRenkSec_Click(object sender, EventArgs e)
        {
            if (cdRenk.ShowDialog() == DialogResult.OK)
                Renk = cdRenk.Color;
        }

        private void txt1_TextChanged(object sender, EventArgs e)
        {
            TextBox txt = sender as TextBox;
            x = int.Parse(txt.Text);

            b = new Bitmap(x, x);
        }

Yaptığımız işlemin net görülebilmesi için tüm çalışmayı aşağıda bir bütün olarak paylaşıyorum.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e) => g = this.CreateGraphics();
        Graphics g;
        Bitmap b = new Bitmap(5, 5);
        bool Durum;
        int x = 5;
        private void DrawLine(Graphics g, Point location, Color color)
        {
            if (Durum)
            {
                for (int i = 0; i < x; i++)
                    for (int j = 0; j < x; j++)
                        b.SetPixel(i, j, color);
                g.DrawImageUnscaled(b, location.X, location.Y);
            }
        }
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                DrawLine(g, e.Location, Renk);
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e) => Durum = false;

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Durum = true;
                DrawLine(g, e.Location, Renk);
            }
        }
        Color Renk = Color.Black;
        private void btnRenkSec_Click(object sender, EventArgs e)
        {
            if (cdRenk.ShowDialog() == DialogResult.OK)
                Renk = cdRenk.Color;
        }

        private void txt1_TextChanged(object sender, EventArgs e)
        {
            TextBox txt = sender as TextBox;
            x = int.Parse(txt.Text);
            b = new Bitmap(x, x);
        }
    }

Yaptığımız bu işlemlerden sonra projemizi derleyip çalıştıralım.
C# Windows Form Uygulamasında Paint Yapımı

Gördüğünüz gibi forma istediğimiz boyut ve renkte çizgimizi çizmiş bulunmaktayız.

Bu içeriğimizinde sonuna gelmiş bulunmaktayız. Umarım bol bol faydalanırsınız.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*