Makale Özeti

Bu yazımızda GDI+ ın en değerli nesnelerinden biri olan "PEN" yani Türkçe tabiri ile "Kalem" nesnesi üzerinde çalışacağız.

Makale

GDI+

GDI+ 3(GDI+ ve PEN Nesnesi)

Bu yazımızda GDI+ ın en değerli nesnelerinden biri olan "PEN" yani Türkçe tabiri ile "Kalem" nesnesi üzerinde çalışacağız.

    Gerçekten bir programcı değil de bir ressam yada bir teknik ressam gibi düşünürseniz. ve kendinize şu soruyu sorarsanız. "Resim yapmak için yada çizim yapmak için  neye ihtiyacınız vardır?" Emin olun ki GDI+ bu sorularımızın cevabı olabilecek güçtedir. Örneğin Windowsun vazgeçilmez öğelerinden biri olan bir "Paint" programı... Çok basit özellikleri olan bir program olarak gözükse de onun altında yatan programlama gücünü kimse inkar edemez. Yani "Paint" dahil birçok resim editörü GDI veya GDI+  içinden ipuçları vermektedir. Bir dikdörtgenin içini boyamak için kullanılan "Fırça" öğesi aslında bizim GDI+ da kullandığımız "Brush"nesnesinden başka bir şey değildir. Sonraki yazılarımızda "Brush" nesnesini anlatırken  hatrılayacaksınız. Bu yazımızda ise bahsettiğim gibi "Pen" yani kalem nesnesinden bahsedeceğiz.

 İlk  örneğimizi verelim;

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim gr As Graphics = e.Graphics

Dim p1 As New Pen(Color.Red)

gr.Clear(Color.White)

Dim rec As New Rectangle(10, 10, 100, 200)

gr.DrawRectangle(p1, rec)

End Sub

Bu kodu derlediğimizde karşımıza

     Evet bu örneğimizin diğer örneklerimizden bir  farkı yoktu. Ancak bu arada şunu anlatmak istiyorum. Dikdörtgeni çizen nedir? Şimdi sizlerle bu soruya yanıt arayacağız. "Graphics" nesnesi seçilmiş olan alana çizim yapacak argümanları içinde barındırır.  "gr" isimli nesnemiz  "Graphics"  sınıfından türetilmiş bir nesneye e argümanının Graphics özelliğini atayarak çizimi Form1 in üzerine yapacağımızı ifade ediyoruz. "e" argümanı parantez içerisinde anlatıldığı gibi "System.Windows.Forms.PaintEventArgs" sınıfının türettiği bir nesne bu sınıfın temel özelliği içinde form üzerinde oluşan olayları barındırmasıdır. İkinci satırımızda "p1" isimli bir "Pen" nesnesi tanımlanmıştır. Özetle çizimi yaptıracak olan "gr" nesnesi çizimi "p1" nesnesine yaptıracaktır. Eğer aynı prosedür içinde başka nesnelerde "p1" nesnesini kullanabilirdi. Eğer ressam örneğimize geri dönersek. "p1" çizimi yapacak olan şahsın elindeki kalemi gr ise çizim şablonunu temsil eder. Öyle ki "gr" nesnesinin özelliklerini değiştirmeksizin sadece "Pen" nesnesinin özelliklerini değiştirerek çizgilerin kalınlıklarını ayarlayabiliriz.

Yukarıdaki kodu aşağıdaki gibi düzeltirsek;

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim gr As Graphics = Me.CreateGraphics

Dim p1 As New Pen(Color.Red, 10)

gr.Clear(Color.White)

Dim rec As New Rectangle(10, 10, 100, 200)

gr.DrawRectangle(p1, rec)

End Sub

Kodu derlediğimizde aşağıdaki şekli alırız...(Değişen sadece "Dim p1 As New Pen(Color.Red, 10)" satırında "color.red" öğesinin yanına "," koyarak "10" değerini ekledik. Böylece çizgi kalınlığı default  olan "1 değerinden "10" değerine set edilmiş oldu.)

 Peki çizgi şeklini değiştirmek istersek  bu durumda ne yaparız.
Örneğin Kesik çizgi yada noktalı çizgi yada eksen çizgisi bu durumu anlamak için aşağıdaki tabloyu inceleyin.
Eğer Kalemin "DashStyle" özelliğini aşağıdaki gibi değiştirirsek istediğimiz sonuçları alabiliriz.

Özellik Açıklaması
          Dash  Kesik Çizgi
          DashDot  Bir Kesik bir nokta (Eksen Çizgisi)
          DashDotDot  Bir Kesik iki nokta
          Dot  Nokta nokta
          Solid   Düz Çizgi

Daha iyi anlamanız için bir örnek yapalım. Öncelikle formun üzerini şağıdaki şekildeki gibi düzenleyin.

    Koyu olarak görünen kısım bir "Picturebox" tır. "Dock" özelliğini değiştirerek bu hale getirebilirsiniz. Şimdi aşağıdaki kodu  kod ekranında yazalım.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim gr As Graphics = PictureBox1.CreateGraphics

Dim p1 As New Pen(Color.Red, Val(TextBox1.Text))

Dim rect As New Rectangle(300, 100, 100, 100)

gr.Clear(Color.Write)

Select Case ComboBox1.Text

Case "Normal"

p1.DashStyle = DashStyle.Solid

Case "Kesik"

p1.DashStyle = DashStyle.Dash

Case "Eksen Çizgisi"

p1.DashStyle = DashStyle.DashDot

Case "Noktalı"

p1.DashStyle = DashStyle.Dot

End Select

gr.DrawRectangle(p1, rect)

End Sub

Örnek çizimler şekildeki gibidir...

     Her şey bu kadar değil tabii. Mesela çizgilerin uzunluklarını ayarlayabileceğiniz  bir örnek yapalım. Aşağıdaki kodu yapıştıralım.

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim uzunluk() As Single = {5, 6, 10, 7, 3, 7}

Dim gr As Graphics = Me.CreateGraphics

Dim p1 As New Pen(Color.Red, 1)

p1.DashPattern = uzunluk

gr.Clear(Color.White)

gr.DrawLine(p1, 10, 90, 200, 90)

End Sub

Kodu incelersek Uzunluk adında bir "single" oluşturduk. Bu "uzunluk" isimli argümanımızı p1 nesnesinin "DashPattern" özelliğine atarsak istediğimiz uzunlukta kesik çizgiler. oluşturmuş oluruz. Kodu derlersek ortaya çıkan şekil aşağıdaki gibidir.

    Son olarak bir noktaya daha deyinip yazımı burada noktalamak istiyorum. Başlangıç noktası belli ve sonsuza giden bir doğru çizmek istiyorsunuz. Bu durumda "Pen" nesnesinin "StartCap" ve EndCap özelliklerini kullanmanız lazım aşağıdaki kodları inceleyelim.

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim gr As Graphics = Me.CreateGraphics

Dim p1 As New Pen(Color.Red, 5)

p1.StartCap = Drawing.Drawing2D.LineCap.DiamondAnchor

p1.EndCap = Drawing.Drawing2D.LineCap.Triangle

gr.Clear(Color.White)

gr.DrawLine(p1, 10, 90, 200, 90)

End Sub

Bu kodu derlersek aşağıdaki şekli elde ederiz.

    Şimdilik bu kadar son verdiğim örneği incelerseniz. "LineCap" özelliğini irdelerseniz diğer geometrik lineer kavramlara ulaşırsınız.  Önerileriniz ve eleştirileriniz için çok teşekkür ederim. Tekrar hatırlatmak isterim ki araştırılmasını istediğiniz içinden çıkamadığınız  bir konu olursa mutlaka yazın. Burada hep birlikte paylaşalım. Yeniden görüşmek üzere...

Tarık Gökhan Kızılırmak  

tarikgokhan@hotmail.com