Bu makalemizde mobil cihazlarımızda kullandığımız standart System.Windows.Form.Label class’ının bir örneği olan label nesnemiz yerine kendi transparan label’imizi nasıl yapabileceğimizi irdeleyeceğiz..(Aslında herhangi bir transparent control’ün nasıl yapılabileceğini...)
Bildiğiniz gibi mobil cihazlar desktop bir pc ye istinaden daha kısıtlı kaynaklara sahip olduğundan haliyle yazılım geliştiricilerin bir çoğu platformun bu kısıtlılıklardan ötürü mümkünse desktop ya da web tabanlı uygulamalara müşterilerini yönlendiriyorlar..Burda yönlendirmekten kastım sadece sunum katmanını içeriyor..Yalnis anlasilmasin J Yoksa mobil çözüm üreten bir cok uygulama geliştirici zaten .NET çercevesi içerisinde özgürce bilgileri dahilinde istedikleri gibi çözümlerini üretmeye devam ediyor..Hatta .NET 3.5 ile gelen yeniliklerle bu olay cok daha zirveye tırmanmış durumda..Sonuç itibariyle bileşen pazarına bakıldığında 3. Parti bileşen üreticilerinin windows ve web pazarının büyüklüğünden ötürü mobile alanında yaptıkları ürünlerin sayısı oldukca kısıtlı..(Zorluğuda cabası..) İsterseniz onlara inat .NET CF içerisinde olmayan bir transparan bir label’ı nasıl yapabileceğimize başlayalim J
Öncelikle ihtiyacımız olan kodsal tasarım bileşenlerini yazmaya başlayalım..
public interface IBackground
{
Image BackgroundImage { get; }
}
Bu interface sayesinde bunu kullanan classların Image tipinde ki “bu image bizim ilgili formumuzun zemin rengi için gerekli” property’iyi tanımlama zorunluluğu getiriyoruz..
public class TransFxControlBase : Control
protected bool HasImage = false;
protected override void OnPaintBackground(PaintEventArgs e)
IBackground form = Parent as IBackground; //DİKKAT! Burda ilgili kontrolün parent’ının bu interface’i implemente edip etmediğini kontrol ediyoruz.. Değilse zaten normal bir şekilde calismaya devam edecektir.
if (form == null)
base.OnPaintBackground(e); // normal...
return;
else
HasImage = true; // evet implementasyon yapıldıysa OK!!
e.Graphics.DrawImage(
form.BackgroundImage,
0,
Bounds,
GraphicsUnit.Pixel); // işte şimdi resmi zemine oturtuyoruz..!
protected override void OnTextChanged(EventArgs e)
base.OnTextChanged(e); //Text değişimine karşı resmin geçerliliği kontrol ediliyor..Invalidate kullanmazsak bu evet fire edildiğinde refresh problemi yaşaniyor..
Invalidate();
protected override void OnParentChanged(EventArgs e)
base.OnParentChanged(e); // Aynı şekilde ilgili kontrolün parent’inin değişmesi de kontrolün refresh’ini gerektiren durumlardan birisidir..
Evet yukarıda kod içerisinde durumu açıkca ifade etmeye calistik.Şimdi isterseniz gelin yazdığımız bu customcontrol classindan türeyecek olan TransFxLabel isimli class’imizi yazalım..
public class TransFxLabel : TransFxControlBase
ContentAlignment alignment = ContentAlignment.TopRight; // ilgili kontrolümüz içerisinde text ifadenin nerede yer alacağını set ediyoruz..
StringFormat format = null;
Bitmap scr_pix = null;
public TransFxLabel()
format = new StringFormat();
public ContentAlignment TextAlign // bu property sayesinde de tam olarak string ifadenin nerede belirleneceği enumeration ile set edilmiş oluyor...
get
return alignment;
set
alignment = value;
switch (alignment)
case ContentAlignment.TopCenter:
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
break;
case ContentAlignment.TopLeft:
format.Alignment = StringAlignment