WinAPI'de Subclassing yöntemi ile EDIT kontrolünde girilen karakterlerin sınırlanması

Yazar: Admin

Kategori: Yazılım

WinAPI ile oluşturulan bir program içinde tanımlanan EDIT kontrolleri için bir mesaj işlem fonksiyonu oluşturarak subclassing yöntemi kullanmak suretiyle, bazı karakterlerin girilmesini engelleyebilirsiniz.

Eğer bir kontrolde bulunan özellikleri değiştirmek veya yeni özellikler eklemek için subclassing yöntemini kullanabilirsiniz.

Bu yöntemde, bir kontrolün içinde yer aldığı pencere mesaj işlem fonksiyonu yerine yeni bir bir mesaj işlem fonksiyonu tanımlanır. Fonksiyon tanımlaması yapıldıktan sonra, EDIT penceresine gelen mesajlar ilk önce bu fonksiyona gelir. Bu fonsiyonda gelen mesajlara bir işlem yapılır veya direk olarak ana pencereye gönderilir. EDIT kontrolünün mesaj işlem fonksiyonunu değiştirmek için SetWindowLong() veya SetWindowLongPtr() fonksiyonu kullanılır.

Öncelikle aşağıdaki kod satırlarını WinAPI ile oluşturduğunuz kaynak dosyanın başına ekleyin:


/* EDIT kontrolü ID bildirimi */
#define IDC_EDIT 101
/* EDIT kontrolü pencere Handle değeri bildirimi */
HWND hwndEdit;
/* EDIT kontrolünün bulunduğu pencere mesaj işlem fonksiyonunun atandığı değer */
WNDPROC PrevEditProc; 
/* EDIT kontrolü için oluşturulan yeni mesaj işlem fonksiyonunun bildirimi */
LRESULT CALLBACK EditNewProc (HWND, UINT, WPARAM, LPARAM);

EDIT kontrolünün içinde bulunduğu pencerenin mesaj işlem fonksiyonuna aşağıdaki kodları ekleyin:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  {
    case WM_CREATE:
       
       hwndEdit = CreateWindowEx(0, "EDIT", "",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 20, 100, 20,
                             hwnd, (HENU)IDC_EDIT, NULL, NULL);

       PrevEditProc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditNewProc);
       .
       .
       .
	   

Yukarıdaki satırlarla önce, bir EDIT kontrolü oluşturulur. Sonra, SetWindowLong() fonksiyonu GWL_WNDPROC parametresi ile kullanılarak EDIT kontrolünün mesaj işlem fonksiyonu değiştirilir.

WinAPI ile oluşturduğunuz kaynak dosyasının sonuna aşağıdaki satırları ekleyin:


/* EDIT kontrolünün yeni mesaj işlem fonksiyonu */
/* EDIT kontrolünün yeni mesaj işlem fonksiyonu */
LRESULT CALLBACK EditNewProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
     case WM_CHAR:
        /* Rakam, '.' veya BACKSPACE tuşlarına basılırsa, mesaj işlem görür
        ve 0 değeri döndürülür. */
        if ((wParam<48 || wParam>57) && (wParam!='.' && wParam!=8)) return 0;
        break;
  }
  
  /* Ana pencere mesaj işlem fonksiyonu çağrılır ve mesaj işlem görmeden aktarılır. */
  return CallWindowProc (PrevEditProc, hwnd, message, wParam, lParam);
}

Yukarıdaki fonksiyon tanımlandıktan sonra EDIT kontrolüne gelen tüm mesajlara öncelikle burada işlem yapılır.

TranslateMessage() fonksiyonu WM_KEYDOWN mesajına işlem yaptığında, WM_CHAR mesajını klavyenin aktif olduğu pencereye gönderir. WM_CHAR mesajının wParam parametresi basılan tuşun karakter kodunu içerir.

Eğer rakam, '.' veya BACKSPACE tuşuna basılırsa, mesaj işlem görür ve 0 değeri döndürülür. Eğer, koşul sağlanmazsa, mesaja işlem yapılmaz ve CallWindowProc() fonksiyonu çağrılarak mesaj ana pencere mesaj işlem fonksiyonuna gönderilir.

Programınızı derleyip çalıştırdığınızda, EDIT kontrolü içinde sadece rakam, '.' işareti ve BACKSPACE tuşları ile giriş yapabileceksiniz.