Programlama dillerinin seviyesi
arttıkça alt seviyeli işleri yapmak daha zorlaşıyor diye başlayıp
yazacaktım ama baktım ki gevezelik olacak direkt konuya geçelim.
Efendim nokta net içinde 'Control' diye bir sınıf, bu sınıf içnde de
aşağıdaki gibi bir metod vardır:
[C#]
public virtual bool PreProcessMessage(
ref Message msg
);
Bu metod 'virtual' olduğu için 'control' sınıfından türettiğimiz
kendi sınıflarımızda 'override' edebiliriz. Peki bu metod ne işe
yarar? Bu metod, eğer türettiğimiz sınıf bir 'Windows Forms'
uygulaması içinde çalışıyorsa veya 'ActiveX' kontrol olarak
bulunuyorsa çağrılan bir metoddur. Ve çağrıldığı zaman bize
windows'tan mesaj getirir. Küçük bir örnek verelim, bir forms
uygulamasını açtık ve bir metun kutusu içinde klavyeden 'A' tuşuna
bastık, peki metin kutusunun nasıl haberi olacak? İşte windows metin
kutusunun 'PreProcessMessage' metodunu çağırır ve ona, bak sana bir
mesajım var der...
Bu metodu kullanarak şöyle bir özel bir metin kutusu yazdım, önce
kodu görelim(sadeleşmiş halini) sonra açıklayalım:
public class KarTextBox : System.Windows.Forms.TextBox
{
Hashtable _shiftKeyMap = new Hashtable();
public Hashtable ShiftKeyMap {
get{ return _shiftKeyMap; }
}
public override bool PreProcessMessage(ref Message msg)
{
Keys keyCode = ( ( Keys ) ( int ) msg.WParam ); // (1)
//(2) (3)
if(ShiftKeyMap.ContainsKey(keyCode) &&
((Control.ModifierKeys & Keys.Shift) != 0))
{
msg.WParam = new IntPtr((int)ShiftKeyMap[keyCode]);
return true;
}
return false;
}
}
Bu metin kutusunu yazmaktaki amacımız klavyeden basılan karakterleri
istediğimiz başka karakterler ile değiştirmek, niye diye sormayın :)
Metin kutumuz standart windows metin kutusundan türetildi, böylece
onun tüm özelliklerine sahip olacak. Ek olarak 'ShiftKeyMap' diye
bir özellik ekledik ki bunun tipi hashtable, kullanımı ise şöyle
karTextBox1.ShiftKeyMap.Add(Keys.A, Keys.B); yani klavyeden shift+a
tuşuna basılırsa biz bunu 'B' tuşuna çevireceğiz.
Şimdi malum metodun açıklamasını yapalım, önce msg değişkeni
içindeki tuş kodu alınıyor (1). Daha sonra bu tuş hashtable içinde
bulunuyor mu diye bakılıyor (2). Ve de shift tuşuna baılmış mı? diye
kontrol ediliyor (3). Shift tuşunu kontrol etmek için Control
sınıfındaki statik bir alandan faydalanmak gerekli 'ModifierKeys',
ki bu alan içinde sadece shift değil bazı diğer özel tuşların
durumlarınıda bulmak mümkün. Tekrar konumuza dönersek (2) ve (3)
nolu kontroller doğru ise direkt mesajın içeriğini
değiştiriyoruz(4).
Son bir önemli not mesajları incelemek için 'msg.ToString()' in
sonucuna bakarsanız güzel bilgiler edinirsiniz ;)
|