'C#' Kategorisindeki Makaleler


Çizim İşlemlerinde Yazı Ortalama

Çizim işlemleri yaparken resim üzerine veya pencereye çizeceğimiz yazıların yatay veya dikey olarak ortalanmasını isteyebiliriz. Ortalama işlemini yapmak için DrawString metoduna verilen ek bir parametre vermek gerekiyor. Bu parametre de StringFormat sınıfı türünden bir nesne olmalı.

StringFormat sınıfı yazıyı otomatik alt satıra kaydırma (wrap) ve ortalama (aligment) işlemleriyle ilgili özellikleri saklayan bir sınıftır. Bizi ilgilendiren özellikle Alignment özelliğidir. Bu özelliğe atanan StringAlignment enumunun değerine göre bir yaslama yapılır. Enum Near, Far ve Center olarak 3 değer taşır. Ortalama yapmak için Center değeri seçilmeli.

   StringFormat strFrmt = new StringFormat();
   strFrmt.Alignment = StringAlignment.Center;

Aşağıdaki uygulamada dinamik olarak hazırladığım bir resmin içerisine yazdığım yazıyı ortaladım ve ortaya çıkan resmi bir PictureBox içerisinde gösterdim. Resmin genişliği yazdığım yazıdan çok daha geniş olduğunda ortalama işleminin etkisini görebileceğiz. Ancak burada unutmamamız gereken nokta böyle bir durumda yazının çizilmeye başlanacağı (x,y) koordinatı yerine çizim alanının RectangleF türünden verilmesi gerekliliğidir. Bizim örneğimizde bu alaN metoda gönderilen resmin boyut değeri (PhysicalDimension) kullanılarak oluşturulmuştur.

Form1 Design :

Yazı Ortalama Design

Form1.cs :

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

namespace CizimStringOrtalama
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //hazırlanan resmi picture box'ta gösterme
            pict_orta.Image = OrtalanmisResimHazirla();
        }

        public Image OrtalanmisResimHazirla()
        {
            //400 piksel'e 200 piksel boyutlarında Bitmap oluşturma
            Bitmap img = new Bitmap(400, 100);

            //resmi üzerine yazı yazılması için yollama
            YaziYaz(img);

            return img;
        }

        public void YaziYaz(Image img)
        {
            //çizim işlemini yapacak grafik nesnesini oluşturma
            Graphics grp = Graphics.FromImage(img);

            //yazı fontu bilgileirni oluşturma
            Font fnt = new Font("Verdana", 15);

            //çizim işlemi için mavi renkli fırça hazırlama
            SolidBrush brsh = new SolidBrush(Color.Blue);

            //çizim yapılacak alanı belirleme. Bu alan resmin tüm genişliği ve yüksekliği olacaktır;
            RectangleF alan = new RectangleF(new PointF(0, 0), img.PhysicalDimension);

            //ASIL ORTALAMAYI BU KISIM YAPAR. STRINGFORMAT SINIFI STRING'IN NASIL SIĞDIRILACAĞI BİLGİSİNİ TAŞIR
            StringFormat strFrmt = new StringFormat();
            strFrmt.Alignment = StringAlignment.Center; //yazının yerleşiminin ortalanmasını istiyoruz

            grp.DrawString("Yüce Çelikel", fnt, brsh, alan, strFrmt);
        }
    }
}

Bu uygulamanın çalıştırılması sonucu oluşan ekran görüntüsü ise şöyledir : 

Yazı Ortalama Yatay

Görüldüğü gibi resim tüm sayfayı kaplamakta ancak yazı bu resmin ortasında çıkmaktadır. Aynı işlemi yatay değil de dikey eksende yapabilmek için bu sefer de LineAlignment özelliğine StringAligment enumu türünden bir Center değeri vermemiz yeterli olacaktır.

strFrmt.LineAlignment = StringAlignment.Center; //yazı yerleşimi dikey eksende ortalanır

Bu satırı kodlara eklememiz sonucu ortaya çıkan ekran görüntüsü ise şöyle olur :

Yazı Ortalama Dikey

 

Bir başka makalede görüşmek üzere.
YÜCE ÇELİKEL
MCPD Enterprise Developer

Bir başka makalede görüşmek üzere.

Yüce ÇELİKEL
MCPD Enterprise Developer

 

Anahtar Kelimeler StringFormat Alignment Drawing DrawString
Dosyalar CizimStringOrtalama.rar

C# ile Özel Font Kullanımı

Son yaptığım proje için doğan bir ihtiyacımı sizinle paylaşmak isterim. Bu projede resimler üzerine kullanıcının seçeceği font aileleri ve boyutlarda yazı yazmam gerekiyordu. Farklı olan nokta ise sistemde yüklü olmayan fontların da sadece .ttf uzantılı dosyalar verilerek kullanılabilmesinin istenmesiydi. Bu durumda sorduğum soru ise C# ile font dosyalarını okuyup birer FontFamily nesnesi haline getirmenin mümkün olup olmadığı oldu. Araştırmalarım sonucunda karşıma PrivateFontCollection sınıfı çıktı.

System.Drawing.Text isimalanı içerisinde bulunan bu sınıftan alınan bir nesne, içerisinde birden çok FontFamily nesnesini saklayabilir. Ancak koleksiyonun içerisine fontlar ancak AddFontFile metodu ile eklenebilir.

Aşağıdaki uygulamada bir Winforms projesi kullandım. Proje arayüzü sadece bir labeldan oluşmakta. Özel yüklediğmiz fontu bu labelın font değeri olarak atayarak, işlemin başarılı olup olmadığını anlayacağız. Bu amaçla form sınıfında bir LoadCustomFont metodu hazırladım. Bu metot verilen adresteki font dosyasını yükleyip, ona ait olan FontFamily nesnesini geriye döndürecektir. Font dosyası olarak da proje klasörü içerisine koyduğum Insula.ttf kullanılacaktır.

Form1 Design :

Özel Font Form Tasarım

using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

namespace OzelFont
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //15 em büyüklüğünde Insula kullanan font nesnesini hazırlayıp, atama
            FontFamily aile = LoadCustomFont(@"..\..\Insula.ttf");
            lbl_sonuc.Font = new Font(aile, 20);
        }

        public FontFamily LoadCustomFont(string url)
        {
            PrivateFontCollection customs = new PrivateFontCollection();
            customs.AddFontFile(url); //font dosyasını verilen adresten yükleme

            return customs.Families[0]; //yüklenen ilk fontfamily nesnesini döndürür
        }
    }
}

Yukarıdaki kodlarla oluşturulan proje çalıştırıldığında aşağıdaki ekran görüntüsünde olduğu gibi label üzerinden yazı fontunun değiştiği ve Insula haline geldiği görülecektir.

Son Ekran Görüntüsü :

Insula Label

 

Yüce ÇELİKEL

MCPD Enterprise Developer

Anahtar Kelimeler PrivateFontCollection Custom Font FontFamily
Dosyalar OzelFont.rar