Makale Özeti

Windows üzerinde grafik işlemlerine bir çok yenilik getiren GDI+ ile ilgili güzel bir giriş yazısı.

Makale

Merhaba,

Bunun ilk yazım olmasından dolayı oluşabilecek hatalar için şimdiden özür diliyorum. Bu makalenin amacı C# üzerinde grafik komutlarını yani GDI+ kullanarak basit şekiller çizmek, çizimin mantığını biraz kavramak, böylece windows kontrolleri yazmaya da bir adım atmış oluyoruz. GDI+ ile hazırda verilmiş olan kontrollerde bulamadığınız özellikleri bu kontrollere ekleyebilir yada sıfırdan bir kontrol yaratabilirsiniz. GDI+, grafik çizmek için kullanacağınız bir class’dır. .NET’in tüm class’ları gibi temiz ve anlaşılır bir object yapısı vardır. Hemen uygulamaya geçiyorum:

Önce GDI+ ile çalışmanın mantığını kavramak için basit bir iki çizim yapacağız:

  1. Yeni bir Windows Project açın,
  2. Formun arka planını beyaz yapın (anlaşılması için hepsini Form1() içine yazıyorum),
  3. Graphics objesi oluşturun:


Şimdi bir çalışma ortamı oluştuğunu varsayıyorum. Burda en önemli nokta CreateGraphics() komutudur. Bu komut ile ele aldığımız class içine çizim yapabileceğimiz bir obje, class’ın kendisi tarafından yaratılmış oluyor. Her çizim işleminden önce muhakkak bu işlemin yapılması gerekiyor.

Sıradaki işlemimiz ise en basitinden bir dikdörtgen çizmek. Burda işleri biraz karıştırıp, formun tam merkezine bir dikdörtgen çizmeye çalışalım. Böylece formun dış alanını nasıl yakalıyacağımızı da görmüş oluruz.

Yaptığımız işlemlere adım adım bakalım:

this.Show();

Show() komutunu vermezsek yaptığımız çizimler form üzerinde görünmezler, bu yüzden formu göstermeye zorluyoruz.

 Rectangle rect = this.ClientRectangle;

Formun iç alanı boyutunda bir dikdörtgen elde ediyoruz.

 Pen redPen = new Pen(Color.Red, 2);

Kırmızı renkle çizen ve “2” birim kalınlığında bir kalem objesi yaratıyoruz, çizimlerin çoğunda ya bir “Brush” yada “Pen” objesi kullanılır.

 rect.Width /= 2;

 rect.Height /= 2;

 rect.X += rect.Width / 2;

 rect.Y += rect.Height / 2;

Dikdörtgenin boyutlarını tam formun ortasına gelecek şekilde ayarlıyoruz, Önce boyutunu yarıya indirip, X ve Y koordinatlarını değiştiriyoruz. Burada akılda kalması gereken önemli bir nokta ise, formun sol üst köşesinin koordinatı (0,0) olup, aşağıya doğru gidildikçe Y artar, sağa doğru gidildikçe ise X değeri artar.

 g.DrawRectangle(redPen, rect);

Son olarak da Dikdörtgenimizi çiziyoruz. Dikdörtgen objesi verilmeden koordinatlar verilerek de çalışabilirdik ama kodumuz daha karışık olabilirdi.

Kodu çalıştırdıktan sonra, formun üzerinde başka bir form dolaştırın veya formu küçültüp büyültün. Göreceğiniz gibi çizdiğimiz dikdörtgen silinmektedir. Bunun sebebi forma tekrar boyama komutunu vermememizdir. Aslında bu işi (tekrar boyamayı) tüm formlar otomatik olarak yapmaktadırlar. Windows işletim sistemi, bir forma “kendini yeniden boya” emrini verdiği zaman, o form OnPaint eventini ateşler ve buradaki çizim komutlarını tekrarlıyarak üzerindeki çizimlerin bütünlüğünü sağlar.

Bu bilgilerden hareketle çizimimizi OnPaint içine taşıyalım.

Yapılan değişikliği farketmişsinizdir. Artık CreateGraphics() komutuna ihtiyacımız yok, çünkü OnPaint’in kendi içinde bu yaratılıyor ve biz bunu direkt olarak kullanabiliyoruz. Kodu şimdi çalıştırdığımda ekrandaki kırmızı dikdörtgen silinmeyecektir.

Şu anda formun boyunu değiştirirseniz, ortadaki dikdörtgenin boyutları değişmiyor gibi görünecektir, fakat kodda görüldüğü üzere boyutlar dinamik olduğundan değişimin anında olması gerektiğini düşünebilirsiniz. Bunun tek açıklaması Resize eventi gerçekleştiği zaman formun içinin tekrar boyanmamasıdır. Bunu sağlamanın en mantıklı yolu Resize olayı içinden OnPaint’i çağırmak olacaktır. Fakat bu fonksiyon direkt olarak çağırılmak yerine yerine bir komutla çağırılmalıdır:

Invalidate();

Kodu yazarsak:

 

Böylece her Resize edildiğinde, formun üzerindeki şekiller boyanacaktır. Bunu yapmanın bir diğer yolu ise, çizimle ilgili ayarların yapıldığı bir komuttur:

SetStyle(ControlStyles.ResizeRedraw,true);

Bu şekilde hiç kod yazmadan her Resize olduğunda otomatik olarak formun çizim nesnelerini tekrar çizmesini sağlayabiliriz.

Böylece çizim nesnelerine bir giriş yapmış olduk, ileride basit bir kontrol adım adım yapmayı göstermek istiyorum, umarım yararlı bir yazı olmuştur J Sorularınız varsa e-mail adresimi veriyorum, cevap verebilirim.

Barış Gömleksizoğlu

bargom@gmx.net

MCSD, Y.Makina.Müh.