Bu yazımızda, ’Edit
Box’, ’Text Box’ isimleriyle bilinen yazı kutusu standart kontrolünü, bu kontrolün
API fonksiyonları ile oluşturulmasını, kontrole gönderilen ve kontrolden gelen
mesajların işlenmesini inceleyeceğiz. Windows sistemleri, kullanıcı ile uygulama
programlarının haberleşmesini sağlayabilmek için birtakım kontroller sunmuştur.
Kontroller ile ilgili genel bilgileri önceki yazılarımızda ele almıştık. Bu
kontrollerden birisi olan yazı kutusu kontrolü, Windows uygulamalarında kullanıcının
klavyeden bilgi girmesini sağlamak veya kullanıcıya birtakım bilgileri sunmak
amaçlarıyla kullanılır. Kontrolün görünümü şu şekildedir :
Yazı
Kutusu Kontrolünün Oluşturulması
Öncelikle kontrolün
nasıl oluşturulduğunu ele alalım. Önceki yazılarımızdan hatırlayacağınız üzere,
standart Windows kontrolleri CreateWindow ya da CreateWindowEx fonksiyonları
ile bu fonksiyonların pencere sınıfı parametreleri olarak özel pencere sınıfı
isimleri geçilerek oluşturuluyordu. Standart kontrollere ilişkin pencere sınıfları,
sistem tarafından otomatik olarak oluşturularak sisteme kaydedilir. Bu pencere
sınıflarına ilişkin isimler, standart başlık dosyalarında belirtilmiştir. Biz
de bu isimleri kullanarak istediğimiz kontrolü CreateWindow fonksiyonlarını
çağırarak oluştururuz. Yazı kutusu kontrolüne ilişkin pencere sınıfı ismi ’edit’
tır. Yazı kutusu kontrolü oluşturmak için CreateWindow fonksiyonunu çağırdığımızda,
fonksiyonun ilk parametresi olan pencere sınıf ismi yerine ’edit’ pencere sınıfı
ismi geçilir. Fonksiyonun ikinci parametre değişkeni, pencere oluştururken,
oluşturulan pencerenin başlık yazısında görüntülenecek yazıyı temsil ediyordu.
Yazı kutusu kontrolü oluştururken ise bu parametre değişkeninin değeri, yazı
kutusunun içindeki yazıyı temsil eder. Fonksiyonun üçüncü parametresi, oluşturulan
pencerenin biçim bilgilerini belirtiyordu. Standart Windows kontrolleri için
birtakım biçimler tanımlanmış ve bu biçimlere ilişkin isimler, sembolik sabitler
olarak başlık dosyalarına eklenmiştir. Standart kontrollerin pencere biçim bilgisine
ilişkin sembolik sabit isimlerinin ilk iki harfleri standart kontrolü temsil
edecek şekilde verilmiştir. Örneğin yazı kutusu kontrolüne ilişkin pencere biçimi
sembolik sabitleri ES_ öneki ile başlar.
Yazı
Kutusu Kontrolüne İlişkin Pencere Biçimleri
YAZI
KUTUSU KONTROLÜ PENCERE BİÇİMİ SEMBOLİK SABİT İSMİ
|
ANLAMI
|
ES_MULTILINE |
Yazı kutusu kontrolünün satır sayısı için iki biçim mevcuttur. Varsayılan
biçim tek satırlı yazı kutusudur. Eğer kontrolün birden fazla sayıda satıra
sahip olması istenirse ES_MULTILINE pencere biçimi sembolik sabiti kullanılmalıdır. |
ES_LEFT,
ES_CENTER, ES_RIGHT |
Windows’un
yazı kutusundaki yazıyı hizalaması için üç seçenek sunulmuştur. Kontroldeki
yazı sağa, sola ya da ortaya hizalanabilir. ES_LEFT yazının sola hizalanmasını,
ES_CENTER yazının ortaya hizalanmasını, ES_RIGHT ise yazının sağa hizalanmasını
sağlar. Ancak bu pencere biçimlerinin kullanılabilmesi için kontrol ES_MULTILINE
pencere biçimi ile oluşturulmalıdır. |
ES_LOWERCASE,
ES_UPPERCASE, ES_OEMCONVERT |
Kullanıcının
yazı kutusu kontrolüne gireceği yazının görünümü uygulama tarafından kontrol
edilebilir. Eğer kontrol ES_LOWERCASE pencere biçimi ile yaratılırsa kontroldeki
yazı küçük harflerle, ES_UPPERCASE pencere biçimi ile yaratılırsa kontroldeki
yazı büyük harflerle gösterilir. Bazı uygulamalarda kontroldeki yazının
belli bir karakter setine dönüştürülerek gösterilmesi gerekli olur. Bu durumda
kontrol ES_OEMCONVERT pencere biçimi ile oluşturulur. |
ES_AUTOHSCROLL,
ES_AUTOVSCROLL |
Kontrolün
içerisindeki yazının kaydırılması için iki seçenek sunulmuştur. Kontrol,
ES_AUTOHSCROLL biçimi ile yaratılırsa kontroldeki yazı yatay olarak kaydırılır.
ES_AUTOVSCROLL biçimi ile yaratılırsa dikey olarak kaydırılır. |
ES_NUMBER |
Yazı
kutusu kontrolüne sadece nümerik değerler girilmesini sağlar. |
ES_NOHIDESEL |
Klavye
odağı, yazı kutusu kontrolünden ayrıldıktan sonra, seçili olan yazının gizlenmemesini
sağlar. |
ES_READONLY |
Yazı
kutusu kontrolünün sadece okunur olarak yaratılmasını, dolayısıyla gösterilen
yazının kullanıcı tarafından değiştirilememesini sağlar. |
ES_PASSWORD |
Kontrole
yazılan yazının asterisks (*) karakterleri ile görüntülenmesini sağlar.
Şifre bilgisinin alınması gereken alanlarda kullanılabilir. Eğer yazının
asterisks karakterinden başka bir karakterle görüntülenmesi istenirse EM_SETPASSWORDCHAR
mesajı kullanılabilir. |
ES_WANTRETURN |
Kullanıcı
Enter tuşuna bastığı zaman kontrolde alt satıra geçilmesini sağlar. |
Yazı kutusu kontrolü
varsayılan olarak çerçevesizdir. Çerçeveli halde oluşturulması istenirse WS_BORDER
pencere biçimi ile oluşturulmalıdır.
Standart kontroller
alt pencereler olarak yaratıldığı için WS_CHILD pencere biçimini içermek zorundadırlar.
Genel pencere biçimlerinden WS_VISIBLE biçimi de yazı kutusu kontrolü için kullanılabilir.
BU biçim oluşturulacak pencerenin görünür olup olmamasını belirler.
Bir uygulama içerisinde
bu yazı kutusu pencere biçimlerine sahip kontroller oluşturmaya başlayalım.
Öncelikle, uygulamamızın başlangıç fonksiyonu olan WinMain fonksiyonunda, siyah
arka plan rengine sahip bir pencere oluşturalım. Yazı kutusu kontrollerimizin
ana penceresi bu pencere olacaktır. Kontrollerimizi oluşturmak üzere CreateWindow
fonksiyonunu çağırırken, fonksiyonun hWndParent isimli sekizinci parametre değişkeni
yerine, bu pencerenin tutamaç değerini geçeceğiz.
Ana penceremiz
üzerinde, toplam yedi tane farklı özelliklere sahip yazı kutusu kontrolü oluşturacağız.
Bu kontrollerden hemen önce, statik kontroller oluşturup başlık yazısı olarak
kontrolün adını vereceğiz. Kontrollerimizin sahip olacakları özellikler şöyle
olacak :
- 1. Kontrol
=> İçerisindeki yazıyı sola hizalayan tek satırlı bir yazı kutusu kontrolü
- 2. Kontrol => İçerisindeki yazıyı sağa hizalayan ve büyük harflerle gösteren
bir yazı kutusu kontrolü
- 3. Kontrol => İçerisindeki yazıyı ortaya hizalayan ve girilen yazının
uzunluğu, kontrol genişliğini aştığında dikey olarak kaydırma yapan bir                      yazı
kutusu kontrolü
- 4. Kontrol => Sadece sayısal değerler girilmesine izin veren bir yazı
kutusu kontrolü
- 5. Kontrol => Sadece okunur özellikte olan, değişikliğe izin vermeyen
bir yazı kutusu kontrolü
- 6. Kontrol => Şifreli bilgiler girmek üzere, girilen bilgileri belirtilen
karakterle gösteren bir yazı kutusu kontrolü
- 7. Kontrol => Kullanıcı ’Enter’ tuşuna bastığında alt satıra geçmeye
izin veren çok satırlı bir yazı kutusu kontrolü
Yazı kutusu kontrollerinin
genişlik değerlerini 200 olarak belirliyoruz. Yedinci yazı kutusu kontrolü hariç,
diğerlerinin yükseklik değerlerini 20 olarak, yedinci kontrolün yükseklik değerini
ise 60 olarak belirliyoruz. Statik kontrollerin ve yazı kutusu kontrollerinin
ana pencere üzerindeki konumlarını ise birbirleri üzerine gelmeyecek şekilde
ayarlıyoruz. Kontrollerin hepsi, uygulamanın pencere fonksiyonunda WM_CREATE
mesajı alındığı zaman, yani ana penceremiz oluştuğu zaman yaratılıyor. Kontrollerin
tanımlayıcı değerlerini, sembolik sabitler olarak kaynak kod dosyamızın başında
belirtiyoruz. Şimdi sırayla kontrollerimizi oluşturalım :
#define ID_EDITBOX_1
101
#define ID_EDITBOX_2 102
#define ID_EDITBOX_3 103
#define ID_EDITBOX_4 104
#define ID_EDITBOX_5 105
#define ID_EDITBOX_6 106
#define ID_EDITBOX_7 107
//...
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hEditBox1, hEditBox2, hEditBox3, hEditBox4,
hEditBox5, hEditBox6, hEditBox7;
    static HWND hStatic;
   
switch(message) {
        case WM_CREATE :
            hStatic = CreateWindow("static","1.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    10,50,75,20,hWnd,(HMENU)200,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox1 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_LEFT,
                   
    100,50,200,20,hWnd,(HMENU)ID_EDITBOX_1,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","2.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    10,90,75,20,hWnd,(HMENU)201,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox2 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_UPPERCASE,
                   
    100,90,200,20,hWnd,(HMENU)ID_EDITBOX_2,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","3.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    10,130,75,20,hWnd,(HMENU)202,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox3 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_CENTER | ES_AUTOVSCROLL,
                   
    100,130,200,20,hWnd,(HMENU)ID_EDITBOX_3,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","4.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    10,170,75,20,hWnd,(HMENU)203,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox4 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_NUMBER,
                   
    100,170,200,20,hWnd,(HMENU)ID_EDITBOX_4,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","5.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    350,50,75,20,hWnd,(HMENU)204,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox5 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_READONLY,
                   
    440,50,200,20,hWnd,(HMENU)ID_EDITBOX_5,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","6.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    350,90,75,20,hWnd,(HMENU)205,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox6 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_PASSWORD,
                   
    440,90,200,20,hWnd,(HMENU)ID_EDITBOX_6,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        //////////////////////////////////////////////////////////////////
   
        hStatic = CreateWindow("static","7.
Kontrol :",
                   
    WS_CHILD | WS_VISIBLE,
                   
    350,130,75,20,hWnd,(HMENU)205,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        hEditBox7 = CreateWindow("edit","deneme",
                   
    WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN,
                   
    440,130,200,60,hWnd,(HMENU)ID_EDITBOX_7,
                   
    ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
    break;
   
    //...
   
}
|
Yazı kutusu kontrollerini
oluştururken; öncelikle tüm kontroller için WS_CHILD, WS_VISIBLE pencere biçimleri
kullanıldı. Kontroller, birer alt pencere olarak oluşturulduğu için WS_CHILD
pencere biçiminin belirtilmesi gerektiğini daha önceden söylemiştik. Daha sonra
istenen özelliklere sahip olmaları için sırasıyla birinci kontrole yazıyı sola
hizalayan ES_LEFT pencere biçimi, ikinci kontrole yazıyı sağa hizalayan ES_RIGHT
ve yazıyı büyük harflerle gösteren ES_UPPERCASE pencere biçimleri, üçüncü kontrole
yazıyı sağa hizalayan ES_CENTER ve dikey kaydırma yapmayı sağlayan ES_AUTOVSCROLL
pencere biçimleri, dördüncü kontrole sadece sayısal değerler girilmesini sağlayan
ES_NUMBER pencere biçimi, beşinci kontrole sadece okunurluk özelliği sağlayan
ES_READONLY pencere biçimi, altıncı kontrole girilen yazıyı şifreleme karakterleri
ile gösteren ES_PASSWORD pencere biçimi, yedinci kontrole çok satırlılık özelliği
sağlayan ES_MULTILINE ve kullanıcı ’Enter’ tuşuna bastığında alt satıra geçmeyi
sağlayan ES_WANTRETURN pencere biçimleri eklendi.Şimdi uygulamamızı çalıştırarak,
kontrollerin ana pencere üzerindeki görünümlerine bakabilir ve kontrollerin
verilen özellikleri sağlayıp sağlamadığını test edebiliriz. Uygulamanın çalışan
hali şöyledir :
Yazı
Kutusu Kontrolü İçerisindeki Yazının Alınması ve Değiştirilmesi
Yazı kutusu kontrolü
içerisine kullanıcı tarafından yazılan bir yazı uygulama tarafından alınabilir
ve buradaki yazı değiştirilebilir. Uygulama, yazı kutusu kontrolüne yazılacak
yazının uzunluğunu da belli bir değer ile sınırlandırabilir. (Örneğin kişisel
bilgileri alan bir uygulamada isim bilgisinin 10 karakter ile sınırlandırılması
gibi)
Kontroldeki yazının
alınması için, kontrole WM_GETTEXT mesajı gönderilir. Kontroldeki yazının değiştirilmesi
için kontrole WM_SETTEXT mesajı gönderilir.
Şimdi uygulamamıza,
oluşturduğumuz yazı kutularının yazılarını değiştirmek üzere eklemeler yapalım.
Öncelikle kontrollerin yeni içeriklerini (char *) türünden bir dizi içerisinde
tutalım. Çalışma anında pencere üzerinde, farenin sol tuşuna tıklandığında sırasıyla
kontrollerimizin içeriklerini değiştirelim. Öncelikle kaynak kod dosyamızın
başına, kaçıncı tıklanma olduğu bilgisini sayacak olan static özelliğe sahip,
tamsayı türünden bir değişken tanımlayalım. Dizimizi oluşturalım. Pencere fonksiyonunda
WM_LBUTTONDOWN mesajı alınması durumunda ise, kontrollerin içeriklerini değiştirecek
kodu yazalım :
static int
counter = 0;
HWND editControls[7];
char *newControlStrings[7] = {"1. kontrol değiştirildi",
                                         
"2. kontrol değiştirildi",
                                         
"3. kontrol değiştirildi",
                                         
"123456789",
                                         
"5. kontrol değiştirildi",
                                         
"6. kontrol değiştirildi",
                                         
"7. kontrol değiştirildi 7. kontrol değiştirildi 7. kontrol değiştirildi"};
//...
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
   //...
   switch
(message) {
      case
WM_CREATE :
         //Statik
kontrollerin ve yazı kutusu kontrollerinin oluşturulduğu kısım.
         //...
         break;
      case
WM_LBUTTONDOWN :
         if
(counter == -1)
             return;
         SetWindowText(editControls[counter],newControlStrings[counter]);
         counter++;
         if
(counter == 7)
             counter
= -1;
         break;
   }
} |
Farenin sol tuşuna
her basıldığında, ’counter’ isimli değişkenin değerini bir artırıyoruz. Tüm
yazı kutusu kontrollerinin içerikleri değiştirildikten sonra bu kodun çalışmaması
için, ’counter’ isimli değişkenin değerini -1 olarak atıyoruz ve case ifadesinin
başında değişkenin değeri -1’e eşit ise ’return’ ifadesiyle geri dönüyoruz.
’counter’ değişkeninin değeri aynı zamanda, içeriği değiştirilecek yazı kutusu
kontrolünün yeni içeriğinin ’newControlStrings’ dizisindeki sıra numarasına
karşılık geliyor. Kontrolün içeriğini değiştirmek için SetWindowText isimli
API fonksiyonuna ikinci parametre olarak bu dizinin ’counter’ değerindeki sıra
numarasındaki karakter katarını geçiyoruz. SetWindowText isimli API fonksiyonunun
ilk parametre değişkeni, başlığı değiştirilecek pencerenin tutamaç değeri olarak
girilir. Yazı kutusu kontrollerinin tutamaç değerlerini global alanda bir dizide
tutarsak, ilk parametre değişkenine geçilecek değere de kolayca erişebiliriz.
Bu amaçla global alanda ’editControls’ isimli, HWND türünden elemanlara sahip
yedi elemanlı bir dizi tanımladık. Yazı kutusu kontrollerini oluştururken, ’CreateWindow’
fonksiyonundan elde ettiğimiz tutamaç değerlerini bu dizinin elemanları olarak
atarsak, yine ’counter’ global değişkenini, elemanların sıra numarası olarak
kullanabilir ve kontrollerin tutamaç değerlerine erişebiliriz. Uygulamayı tekrar
çalıştırarak, farenin sol tuşuna basarsak sırayla kontrollerdeki yazıların değiştirildiğini
ve kontrollerin özellerine bağlı olarak biçimlendirildiğini göreceğiz. Farenin
sol tuşuna yedi kez tıkladıktan sonra uygulamamız şu görünüme sahip olacaktır
:
Yazı
Kutusu Kontrolüne İlişkin Mesajlar
YAZI
KUTUSU KONTROLÜNE GÖNDERİLEN MESAJ
|
ANLAMI
|
EM_CANUNDO |
Yazı kutusu kontrolünün geri alma özelliğine sahip olup olmadığını öğrenmek
amacıyla uygulama tarafından kontrole gönderilir. Kontrolün geri alma özelliğinin
var olup olmamasına göre, EM_UNDO mesajına cevap verip vermeyeceği bilgisi
öğrenilir. wParam ve lParam parametreleri kullanılmaz, sıfır olarak geçilmelidir.
Eğer kontrol geri alma özelliğine sahip ise TRUE, aksi takdirde FALSE değeri
geri döner. |
EM_CHARFROMPOS
|
Yazı
kutusu kontrolündeki belli bir noktaya en yakın konumda olan karakterin,
sıra numarasını ve satır sıra numarasını öğrenmek amacıyla uygulama tarafından
kontrole gönderilir. wParam parametresi kullanılmaz, sıfır olarak geçilir.
lParam parametresinin düşük anlamlı WORD değeri yazı kutusu alanında bir
noktanın x koordinat değerini, yüksek anlamlı WORD değeri ise y koordinat
değerini belirtir. x ve y koordinat değerleri, MAKELPARAM makrosuna parametre
olarak geçilerek lParam parametresine geçilecek değer elde edilir. Mesajın
geri dönüş değeri, düşük anlamlı WORD değerinin karakter sıra numarası,
yüksek anlamlı WORD değerinin satır sıra numarasıdır. Tek satırlı yazı kutusu
kontrolü için satır sıra numarası her zaman sıfır olarak döndürülür. Eğer
verilen nokta koordinatı, yazı kutusu kontrolündeki son karaktere karşılık
geliyorsa, bu durumda kontroldeki son karakter geri döndürülür. Eğer nokta
koordinatları kontrolün dışında kalıyorsa, -1 değeri geri döndürülür. |
EM_EMPTYUNDOBUFFER |
Yazı
kutusu kontrolünün geri alma bayrağını sıfırlamak için uygulama tarafından
kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz, sıfır olarak
geçilir. Geri dönüş değeri yoktur. Yazı kutusu kontrolü WM_SETTEXT veya
EM_SETHANDLE mesajları aldığı zaman geri alma bayrağı otomatik olarak sıfırlanır. |
EM_GETFIRSTVISIBLELINE |
Yazı
kutusu kontrolündeki görünen en üst satırı almak için uygulama tarafından
kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz, sıfır geçilir.
Çoklu bir yazı kutusu kontrolüne bu mesaj gönderildiğinde geri dönüş değeri,
görünen en üst satırın sıra numarasıdır. Tek satırlı yazı kutusu kontrolüne
gönderildiğinde geri dönüş değeri, görünen ilk karakterin sıra numarasıdır. |
EM_GETHANDLE
|
Çok
satırlı yazı kutusu kontrolünün içerisindeki yazı için ayrılmış belleğin
tutamaç değerini almak amacıyla uygulama tarafından kontrole gönderilir.
wParam ve lParam parametreleri kullanılmaz, sıfır geçilir. Geri dönüş değeri
yazının saklandığı adres değeridir. Herhangi bir hata durumunda, örneğin
tek satırlı bir yazı kutusu kontrolüne bu mesaj gönderildiğinde geri dönüş
değeri sıfır olur. |
EM_GETLIMITTEXT
|
Yazı
limiti verilmiş bir yazı kutusu kontrolünün limit değerini öğrenebilmek
amacıyla uygulama tarafından kontrole gönderilir. wParam ve lParam parametreleri
kullanılmaz, sıfır geçilir. |
EM_GETLINE |
Yazı
kutusunun bir satırında yer alan yazıyı alarak bir bellek bölgesine kopyalamak
amacıyla uygulama tarafından kontrole gönderilir. wParam parametresi olarak
hangi satırdaki yazının alınacağı bilgisi, lParam parametresi olarak ise
alınan yazının kopyalanacağı bellek bölgesinin adresi geçilir. Tek satırlı
yazı kutusu kontrolüne bu mesaj gönderilirken wParam parametresi kullanılmaz.
Geri dönüş değeri, kopyalanan karakter sayısını verir. Parametre olarak
verilen satır numarası, yazı kutusu kontrolünün toplam satır sayısından
daha fazla ise geri dönüş değeri sıfır olacaktır. Gönderilen tampon bölgeye
kopyalanan yazının sonuna null karakter eklenmez. |
EM_GETLINECOUNT |
Çok
satırlı bir yazı kutusu kontrolünün toplam satır sayısı bilgisinin öğrenilmesi
amacıyla uygulama tarafından kontrole gönderilir. wParam ve lParam parametreleri
kullanılmaz, sıfır geçilir. Geri dönüş değeri kontrolün sahip olduğu toplam
satır sayısıdır. Eğer kontrolde hiç yazı yoksa geri dönüş değeri 1 olur. |
EM_GETMODIFY |
Yazı
kutusu kontrolünün içeriğinin değişip değişmediğini öğrenmek amacıyla uygulama
tarafından kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz,
sıfır geçilir. Eğer içerik değişmişse TRUE, değişmemişse FALSE değeri geri
döner. Windows sistemleri, kontrol içeriğinin değişip değişmediği bilgisini
kendi içinde oluşturduğu bir bayrak değişkende tutar. Bu bayrak değişkeni,
kontrol ilk yaratıldığında sıfırlanır. Eğer uygulama içerisinde kendimiz
bu bayrağı sıfırlamak istersek, kontrole EM_SETMODIFY mesajı göndermemiz
gerekir. |
EM_GETPASSWORDCHAR |
Yazı
kutusu kontrolünün şifreli bilgileri göstermek için kullanılan karakterini
öğrenmek amacıyla uygulama tarafından kontrole gönderilir. wParam ve lParam
parametreleri kullanılmaz, sıfır geçilir. Geri dönüş değeri, şifreli bilgileri
göstermek amacıyla kullanılan karakterdir. Eğer bu karakter belirtilmemişse
NULL değer geri döner. Yazı kutusu kontrolü, ES_PASSWORD pencere biçimiyle
yaratıldığında, varsayılan şifre karakteri asterisks (*) karakteri olarak
atanır. |
EM_GETSEL |
Yazı
kutusu kontrolündeki yazının parametre olarak verilen ilk ve son karakter
sıra numaraları arasında kalan kısmını öğrenmek amacıyla uygulama tarafından
kontrole gönderilir. wParam parametresi seçili yazının başlangıç pozisyonunu,
lParam parametresi seçili yazının bitiminden sonraki seçili olmayan ilk
karakterin pozisyonunu belirtir. Bu parametreler NULL geçilebilir. Geri
dönüş değeri, düşük anlamlı WORD değeri seçimin başlangıç pozisyonunu gösteren,
yüksek anlamlı WORD değeri seçili olan son karakterden sonraki ilk seçili
olmayan karakterin pozisyonunu gösteren 32 bitlik bir değerdir. Bu değerlerden
herhangi birisi 65.535 değerini aşarsa geri dönüş değeri -1 olur. Zengin
yazı kutusu kontrolünde (Rich edit control) seçim ilk 64K’lık kısımda saklanmaz,
bu nedenle bu kontrole EM_EXGETSEL mesajı gönderilmelidir. |
EM_LIMITTEXT |
Kullanıcının
yazı kutusu kontrolüne gireceği yazı miktarını sınırlandırmak ve bu sınır
miktarını belirtmek amacıyla uygulama tarafından kontrole gönderilir. wParam
parametresi olarak girilecek yazının sahip olacağı en fazla karakter sayısı
geçilir. lParam parametresi kullanılmaz, sıfır geçilir. wParam parametresi
olarak sıfır geçilirse, en fazla yazı uzunluğu tek satırlı yazı kutusu kontrolü
için 0x7FFFFFFE değerine; çok satırlı yazı kutusu kontrolü için 0xFFFFFFFF
değerine ayarlanır. Geri dönüş değeri yoktur. Bu mesaj, sadece kullanıcının
girebileceği yazının karakter sınırlandırmasını yapabilir. Bu mesaj gönderildiği
zaman, kontrolde hali hazırda bir yazı varsa, bu yazı sınırlandırmadan etkilenmez.
Aynı şekilde WM_SETTEXT mesajı ile kontrole kopyalanacak yazının uzunluğuna
da sınırlama getiremez. Bir yazı kutusuna, kullanıcı tarafından girilebilecek
yazının varsayılan uzunluğu 30.000 karakterdir. Zengin yazı kutusu kontrolü
kullanılıyorsa, 64K’dan daha uzun yazı uzunlukları için EM_EXLIMITTEXT mesajı
kullanılmalıdır. |
EM_LINEFROMCHAR |
Çok
satırlı yazı kutusu kontrolünün, parametre olarak geçilen karakter sıra
numarasını içeren satırının sıra numarasını öğrenmek amacıyla uygulama tarafından
kontrole gönderilir. Parametre olarak geçilen karakter sıra numarası, kontrolün
başından itibaren olan sırayı belirtir. wParam parametresi olarak karakter
sıra numarası geçilir. lParam parametresi kullanılmaz, sıfır geçilir. Eğer
wParam parametresi olarak -1 değeri geçilirse, o an aktif olan satırın veya
seçili bir satır varsa o satırın sıra numarası öğrenilir. Zengin yazı kutusu
kontrolünde, satır numarası öğrenilecek karakterin sıra numarası 64K’dan
daha büyükse EM_EXLINEFROMCHAR mesajı gönderilmelidir. |
EM_LINEINDEX |
Çok
satırlı yazı kutusu kontrolünün parametre olarak geçilen satır numarasının
ilk karakterinin sıra numarasını öğrenmek amacıyla uygulama tarafından kontrole
gönderilir. wParam parametresi olarak satır sıra numarası geçilir. lParam
parametresi kullanılmaz, sıfır geçilir. wParam parametresi olarak -1 değeri
geçilirse o an aktif olan satırın ilk karakterinin sıra numarası bilgisi
öğrenilir. Eğer gönderilen satır sıra numarası, kontrolün toplam satır sayısından
daha büyük bir değer ise -1 değeri, aksi takdirde ilgili satırın ilk karakterinin
sıra numarası geri döndürülür. |
EM_LINELENGTH |
Yazı
kutusu kontrolünün herhangi bir satırının uzunluğu bilgisinin öğrenilmesi
amacıyla uygulama tarafından kontrole gönderilir. wParam parametresi olarak,
satır sıra numarası bilgisinin alınması için bir karakter sıra numarası
geçilir. lParam parametresi kullanılmaz, sıfır geçilir. Çok satırlı yazı
kutusu kontrolüne bu mesaj gönderileceği zaman, önce EM_LINEINDEX mesajı
kontrole gönderilmeli ve mesaja parametre olarak geçilecek karakterin satır
sıra numarası öğrenilmelidir. |
EM_LINESCROLL |
Çok
satırlı yazı kutusu kontrolündeki yazının yatay veya dikey olarak kaydırılması
amacıyla uygulama tarafından kontrole gönderilir. wParam parametresi olarak
yatay kaydırılacak karakter sayısı; lParam parametresi olarak dikey kaydırılacak
satır sayısı geçilir. Bu mesaj çok satırlı yazı kutusu kontrolüne gönderildiğinde
TRUE değeri, tek satırlı yazı kutusu kontrolüne gönderildiğinde FALSE değeri
geri döndürülür. |
EM_REPLACESEL |
Yazı
kutusunun seçili olan yazı bilgisini, başka bir yazı ile değiştirmek amacıyla
uygulama tarafından kontrole gönderilir. Mesajın wParam parametresi olarak
yapılacak değiştirme işleminin geri alınabilir olup olmadığını belirten
bir değer, lParam parametresi olarak yeni yazının adres bilgisi geçilir.
wParam parametresi olarak TRUE geçilirse yapılacak değiştirme işlemi geri
alınabilir, FALSE geçilirse geri alınamaz. lParam parametresindeki adreste,
yazı kutusuna yerleştirilecek olan ve sonuna null karakter eklenmiş olan
yazı bulunmalıdır. Geri dönüş değeri yoktur. Bu mesaj, yazı kutusundaki
yazının sadece bir bölümü başka bir yazı ile değiştirileceği zaman kullanılmalıdır.
Tüm yazı değiştirilecekse WM_SETTEXT mesajının kullanılması daha anlamlıdır.
Bu mesaj yazı kutusu kontrolüne gönderildiğinde, kontrolde seçili bir yazı
yoksa, yeni yazı o an kursörün geçerli olduğu pozisyondan itibaren eklenir. |
EM_SCROLL |
Çok
satırlı yazı kutusundaki kontrolündeki yazının dikey olarak kaydırılması
amacıyla uygulama tarafından kontrole gönderilir. Kontrole bu mesajı göndermek
ile WM_VSCROLL mesajının gönderilmesi aynı işlevi görür. Mesajın wParam
parametresi olarak kaydırma işleminin türü geçilir. lParam parametresi kullanılmaz,
sıfır geçilir. wParam parametresinin alabileceği değerler ve anlamları şunlardır
:
    - SB_LINEDOWN : Bir satır aşağıya kaydırma
    - SB_LINEUP : Bir satır yukarıya kaydırma
    - SB_PAGEDOWN : Bir sayfa aşağıya kaydırma
    - SB_PAGEUP : Bir sayfa yukarıya kaydırma
Mesajın başarılı
olması durumunda geri dönüş değerinin yüksek anlamlı WORD değeri TRUE
olur, yüksek anlamlı WORD değeri ise kaydırılan satır sayısını belirtir.
wParam parametresi olarak yanlış bir değer geçilirse FALSE değeri geri
döndürülür.
|
EM_SETHANDLE |
Çok
satırlı yazı kutusu kontrolünün kullandığı bellek bölgesinin tutamaç değerini
değiştirmek amacıyla uygulama tarafından kontrole gönderilir. wParam parametresi
olarak bellek bölgesinin tutamaç değeri geçilir. lParam parametresi kullanılmaz,
sıfır geçilir. Bu mesajı alan yazı kutusu kontrolü, içerisindeki yazı bilgisini
saklamak amacıyla, kendisi bir alan tahsis etmez, wParam parametresinde
belirtilen adres bölgesini kullanır. Gerekli olduğu takdirde bu alan üzerinden
yeniden tahsisat işlemi yapar. Geri dönüş değeri yoktur. Uygulama, kontrolün
kullandığı bellek bölgesini değiştirmeden önce bu bellek bölgesinin tutamaç
değerini EM_GETHANDLE mesajı göndererek almalı ve free fonksiyonu ile bu
alanı boşaltmalıdır. Kontrol, kendisi için verilen bellek bölgesinin uzunluğundan
daha fazla bir alana gereksinim duyduğunda bu alanı otomatik olarak büyütür.
EM_SETHANDLE mesajı kontrole gönderildiğinde, geri alma tamponu ve değiştirilme
durumunu tutan bayrak sıfırlanır. Bu durumda kontrole EM_CANUNDO mesajı
gönderildiğinde sıfır değeri, EM_GETMODIFY mesajı gönderildiğinde sıfır
değeri alınır. Kontrolün penceresi yeniden çizilir. |
EM_SETLIMITTEXT |
Yazı
kutusu kontrolündeki yazının belli bir karakter sayısı ile sınırlandırılması
amacıyla uygulama tarafından kontrole gönderilir. wParam parametresi olarak
yazının en fazla sahip olabileceği karakter sayısı geçilir. lParam parametresi
kullanılmaz, sıfır geçilir. wParam parametresi olarak sıfır geçilirse, kontrole
en büyük limit değeri atanır. Tek satırlı yazı kutusu kontrolü için en fazla
karakter sayısı 32.766, çok satırlı yazı kutusu kontrolü için en fazla karakter
sayısı 65.535 olabilir. Geri dönüş değeri yoktur. |
EM_SETMODIFY |
Yazı
kutusu kontrolünün değiştirilme bilgisini tutan bayrağının ayarlanması veya
sıfırlanması amacıyla uygulama tarafından kontrole gönderilir. Değiştirilme
bayrağı, daha önce de değindiğimiz gibi yazı kutusu kontrolündeki yazının
ayarlandıktan sonra değiştirilip değiştirilmediğini tutuyordu. Kullanıcı
kontroldeki yazıyı değiştirdiği zaman bu bayrak otomatik olarak ayarlanır.
wParam parametresi olarak bayrak değişkenine verilecek değer geçilir. lParam
parametresi kullanılmaz, sıfır geçilir. wParam parametresine TRUE geçilmesi
kontroldeki yazının değiştirildiği, FALSE geçilmesi ise değiştirilmediğini
ifade eder. Mesajın geri dönüş değeri yoktur. |
EM_SETPASSWORDCHAR |
Tek
satırlı yazı kutusu kontrolünün şifre karakterinin değiştirilmesi amacıyla
uygulama tarafından kontrole gönderilir. wParam parametresi olarak şifre
karakteri geçilir. lParam parametresi kullanılmaz, sıfır geçilir. Mesajın
geri dönüş değeri yoktur. Bu mesajı alan yazı kutusu kontrolündeki görünen
karakterler, verilen karakter kullanılarak yeniden yazılır. Kontrol ES_PASSWORD
biçimi kullanılarak oluşturulduğunda varsayılan şifre karakteri asterisks
(*) karakteri olur. EM_SETPASSWORDCHAR mesajı, wParam parametresi olarak
sıfır geçilerek yazı kutusu kontrolüne gönderildiğinde, kontrolün ES_PASSWORD
biçim özelliği kaldırılır. |
EM_SETREADONLY |
Yazı
kutusu kontrolünün sadece okunurluk özelliğinin değiştirilmesi amacıyla
uygulama tarafından kontrole gönderilir. wParam parametresi olarak sadece
okunur olup olmama özelliğini ifade eden bir değer geçilir. lParam parametresi
kullanılmaz, sıfır geçilir. wParam parametresi olarak TRUE değeri geçildiğinde
kontrol sadece okunur özelliğe sahip olur, FALSE değeri geçildiğinde kontroldeki
yazı bilgisi değiştirilebilir. İşlemin başarılı olması durumunda, sıfır
dışı bir değer, başarısızlık durumunda ise sıfır değeri geri döndürülür. |
EM_SETSEL |
Yazı
kutusundaki yazının bir bölümünün seçilir hale getirilmesi amacıyla uygulama
tarafından kontrole gönderilir. wParam parametresi olarak seçimin başlangıç
pozisyonu, lParam parametresi olarak seçimin bitiş pozisyonu geçilir. Geri
dönüş değeri yoktur. Başlangıç pozisyonu olarak sıfır, bitiş pozisyonu olarak
-1 değerleri geçildiğinde kontroldeki yazının tamamı seçilir. |
EM_UNDO |
Yazı
kutusu kontrolünde son yapılan işlemi geri almak amacıyla uygulama tarafından
kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz, sıfır geçilir.
Geri dönüş değeri tek satırlı yazı kutusu kontrolü için her zaman TRUE değeridir;
çok satırlı yazı kutusu kontrolü için geri alma işleminin başarılı olması
durumunda TRUE, aksi takdirde FALSE değeridir. |
WM_COMMAND |
Yazı
kutusu kontrolü, ana penceresine bir bilgi mesajı ileteceği zaman gönderilir. |
WM_COPY |
Yazı
kutusu kontrolündeki yazının kopyalanması istendiğimde uygulama tarafından
kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz, sıfır geçilir.
Geri dönüş değeri yoktur. |
WM_CTLCOLOREDIT |
Yazı
kutusu kontrolü herhangi bir sebepten ötürü yeniden çizileceği zaman kontrolün
ana penceresine gönderilir. wParam parametresi olarak DC’nin (Device Context)
tutamaç değeri, lParam olarak ise kontrolün tutamaç değeri geçilir. Geri
dönüş değeri fırçanın tutamaç değeridir. |
WM_CUT |
Yazı
kutusu kontrolündeki seçili olan yazının kopyalanarak silinmesi istendiğimde
uygulama tarafından kontrole gönderilir. wParam ve lParam parametreleri
kullanılmaz, sıfır geçilir. Geri dönüş değeri yoktur. |
WM_PASTE |
O
an kopyalanmış halde bellekte bulunan bilginin yazı kutusu kontrolüne yapıştırılması
istendiğinde uygulama tarafından kontrole gönderilir. wParam ve lParam parametreleri
kullanılmaz, sıfır geçilir. |
WM_UNDO |
Yazı
kutusu kontrolünde son yapılan işlemin geri alınması için uygulama tarafından
kontrole gönderilir. wParam ve lParam parametreleri kullanılmaz, sıfır geçilir. |
Şimdi uygulamamızda,
bu mesajların bir kısmını kullanalım. Yine bir sayaç tutarak, farenin sağ tuşuna
her tıklandığında sıradaki kontrole erişerek, bu kontrole bir mesaj gönderelim.
Bu amaçla global alanda ’rightCounter’ isimli bir değişken tanımlıyoruz. Bu
değişkenin değerini, farenin sağ tuşuna her tıklandığında bir artırarak, kontrollerin
tutamaç değerlerini tuttuğumuz dizide bu değişkeni sıra numarası olarak kullanalım.
Kodumuza şu eklemeleri yapıyoruz :
static int
rightCounter = 0; //...
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
   
switch(message) {
        case WM_RBUTTONDOWN :
   
        switch (rightCounter) {
                int number;
                char passChar[2];
                char lineString[20];
   
            case 0 :
                   
SendMessage(editControls[rightCounter],EM_SETLIMITTEXT,10,0);
                   
break;
                case 1
:
                   
SendMessage(editControls[rightCounter],EM_SETREADONLY,TRUE,0);
                   
break;
                case 2
:
                   
SendMessage(editControls[rightCounter],EM_REPLACESEL,FALSE,"Yeni
yazı");
                   
break;
                case 3
:
                   
number = SendMessage(editControls[rightCounter],EM_LINELENGTH,1,0);
                   
itoa(number,lineString,20);
                   
MessageBox(NULL,lineString,"Bilgi",MB_OK);
                   
break;
                case 4
:
                   
SendMessage(editControls[rightCounter],EM_GETLINE,0,lineString);
                   
MessageBox(NULL,lineString,"Bilgi",MB_OK);
                   
break;
                case 5
:
                   
passChar[0] = SendMessage(editControls[rightCounter],EM_GETPASSWORDCHAR,0,0);
                   
passChar[1] = ’\0’;
                   
MessageBox(NULL,passChar,"Bilgi",MB_OK);
                   
SendMessage(editControls[rightCounter],EM_SETPASSWORDCHAR,0,0);
                   
break;
                case 6
:
                   
number = SendMessage(editControls[rightCounter],EM_GETLINECOUNT,0,0);
                   
itoa(number,lineString,20);
                   
MessageBox(NULL,lineString,"Bilgi",MB_OK);
                   
break;
            }
            rightCounter++;
   
        break;
   
        //...
}
|
Kontrollere mesaj
göndermek için SendMessage API fonksiyonunu kullandık. Birinci kontrolümüze,
EM_SETLIMITTEXT mesajını göndererek, kullanıcının girebileceği karakter sayısını
en fazla 10 karakter olacak şekilde sınırladık. İkinci kontrolümüze, EM_SETREADONLY
mesajını göndererek, kontrole sadece okunur özellik atadık ve kullanıcının kontroldeki
yazıyı değiştirememesini sağladık. Üçüncü kontrolümüze EM_REPLACESEL mesajını
göndererek, mesaj gönderildiği anda kontrolde seçili olan yazının, lParam parametre
değişkeni yerine geçilen ’Yeni yazı’ karakter katarı ile değiştirilmesini sağladık.
Dördüncü kontrolümüze EM_LINELENGTH mesajını göndererek, kontroldeki yazının
uzunluk bilgisini aldık ve bu bilgiyi MessageBox fonksiyonu ile kullanıcıya
bir mesaj kutusu içerisinde gösterdik. Beşinci kontrolümüze EM_GETLINE mesajını
göndererek, kontroldeki yazının lParam parametresi yerine geçtiğimiz bellek
bölgesine kopyalanmasını sağladık ve bu yazıyı MessageBox fonksiyonunu çağırarak
kullanıcıya bir mesaj kutusu içerisinde gösterdik. Altıncı kontrolümüze EM_GETPASSWORDCHAR
mesajını göndererek, şifreleme karakteri olarak kullanılan karakteri öğrendik
ve bu karakteri kullanıcıya bir mesaj kutusu oluşturarak gösterdik. Hemen ardından
kontrole EM_SETPASSWORDCHAR mesajını, wParam parametre değişkeni yerine sıfır
değerini geçerek gönderdik ve kontroldeki şifreleme özelliğini kaldırdık. Artık
kontrole girilen bilgiler, olduğu gibi görünecektir. Yedinci kontrolümüze ise
EM_GETLINECOUNT mesajını göndererek kontrolün kaç satıra sahip olduğunu öğrendik
ve bu bilgiyi kullanıcıya bir mesaj kutusunda gösterdik.
Yazı
Kutusu Kontrolünün Gönderdiği Bilgi Mesajları
Kullanıcı klavye
ve fare gibi harici araçları kullanarak düzenleme taleplerinde bulunabilir.
Windows sistemleri, her talebi yazı kutusu kontrolünün ana penceresine, talebin
niteliğini belirten bir mesaj ile WM_COMMAND mesajı aracılığı ile iletir. Bu
mesaj, wParam parametresinin düşük anlamlı WORD değerinde yazı kutusu kontrolünün
tanımlayıcı değerini, yüksek anlamlı WORD değerinde kullanıcının yaptığı işlemi
ifade eden bir değeri; lParam parametresinde ise kontrolün tutamaç değerini
verir.
Uygulama, her bilgi
mesajını doğru bir şekilde işleyebilmeli ve mesaja uygun yanıtlar üretebilmelidir.
Yazı kutusu kontrolünün gönderdiği bilgi mesajları şunlardır :
YAZI
KUTUSU KONTROLÜNÜN GÖNDERDİĞİ MESAJ
|
ANLAMI
|
EN_CHANGE |
Kullanıcı
yazı kutusu kontrolündeki yazıyı değiştirdiği zaman gönderilir. Bu mesaj
gönderilmeden önce Windows, görüntüyü yeniler. |
EN_ERRSPACE |
Yazı
kutusu kontrolü, talep edilmiş bir işlem için yeterli miktarda bellek bölgesini
tahsis edemediği zaman gönderilir. |
EN_HSCROLL |
Kullanıcı
yazı kutusu kontrolünün yatay kaydırma çubuğuna tıkladığı zaman gönderilir.
Mesaj görüntü yenilenmeden önce gönderilir. |
EN_KILLFOCUS |
Kullanıcı
pencerede başka bir kontrol seçtiğinde ve yazı kutusu kontrolüne odaklanma
sonlandırıldığında gönderilir. |
EN_MAXTEXT |
Kullanıcı,
yazı kutusu kontrolü için getirilen karakter sayısı limitini aştığı zaman
gönderilir. Fazladan girilen karakterler yazılmaz. Ayrıca bu mesaj, kontrol
ES_AUTOHSCROLL pencere biçimine sahip olmadan yaratılmış ve girilen karakter
sayısı kontrolün genişliğini aşmışsa ve kontrol ES_AUTOVSCROLL pencere biçimine
sahip olmadan yaratılmış ve girilen toplam satır sayısı kontrolün yüksekliğini
aşmışsa da gönderilir. |
EN_SETFOCUS |
Kullanıcı
yazı kutusu kontrolünü seçtiğinde gönderilir. |
EN_UPDATE |
Kullanıcı
kontroldeki yazıyı değiştirdiğinde, sistem yeni yazıyı göstermek üzereyken
gönderilir. Mesaj yeni yazı alındıktan ancak henüz gösterilmiyorken gönderilir.
Bu sayede uygulama kontrolün genişliğini ayarlayabilir. |
EN_VSCROLL |
Kullanıcı
kontrolün dikey kaydırma çubuğuna tıkladığı zaman gönderilir. Mesaj, ekran
güncellenmeden önce gönderilir. |
Yazı kutusunun
görünümü güncellenmeden hemen önce, sistem, kontrolün ana penceresine WM_CTLCOLOREDIT
mesajı gönderir. Ana pencere bu mesaj ile gelen tutamaç değerini kullanarak
kontrolün yazısını ve arka plan rengini değiştirebilir.
Uygulamamızdaki
ilk üç kontrol için, EN_CHANGE, EN_KILLFOCUS ve EN_SETFOCUS mesajlarının işlenmesini
ele almak için kodumuza şunları ekleyelim :
//...
void OnEdit1TextChange();
void OnEdit2SetFocus();
void OnEdit3KillFocus(); //...
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message) {
        case WM_COMMAND :
            if (LOWORD(wParam) ==
ID_EDITBOX_1 && HIWORD(wParam) == EN_MAXTEXT)
                OnEdit1TextChange();
            if (LOWORD(wParam) ==
ID_EDITBOX_2 && HIWORD(wParam) == EN_SETFOCUS)
                OnEdit2SetFocus();
            if (LOWORD(wParam) ==
ID_EDITBOX_3 && HIWORD(wParam) == EN_KILLFOCUS)
                OnEdit3KillFocus();
            break;
        //...
    }
    return 0;
} //...
void OnEdit1TextChange()
{
    MessageBox(NULL,"1. Kontrolün maksimum yazı limiti
aşıldı..","Uyarı",MB_OK);
}
void OnEdit2SetFocus()
{
    MessageBox(NULL,"2. Kontrol seçildi...","Bilgi",MB_OK);
}
void OnEdit3KillFocus()
{
    MessageBox(NULL,"3. Kontrolden çıkıldı...","Bilgi",MB_OK);
}
|
Kaynak kod dosyamızın
başına, ele alacağımız olaylar olduğu durumda çalışmasını istediğimiz fonksiyonların
prototip bildirimlerini ekledik. Kontrollerin gönderdikleri bilgi (notification)
mesajları, pencere fonksiyonunda WM_COMMAND mesajının alınması durumunda işlenirler.
Pencere fonksiyonuna gelen wParam parametresinin düşük anlamlı WORD değeri ve
yüksek anlamlı WORD değeri, LOWORD ve HIWORD makroları ile elde edilerek, kontrolden
gelen mesaj hakkında bilgi edinilir. İlk yazı kutusu kontrolümüz için işleyeceğimiz
mesaj, kontrolün yazı limitinin aşılması durumunda gönderilen mesaj olan EN_MAXTEXT
mesajıdır. Kontrolden bu mesajın alınması durumunda çağrılmak üzere, OnEdit1TextChange
isimli fonksiyonumuzu yazdık ve bu fonksiyonda kullanıcıya yazı limitinin aşıldığına
dair bir bilgi mesajı gösterdik. İkinci yazı kutusu kontrolü için, kullanıcının
kontrolü aktif hale getirdiği sırada kontrol tarafından gönderilen EN_SETFOCUS
mesajını işledik ve bu mesajın alınması durumunda çağırmak üzere OnEdit2SetFocus
isimli fonksiyonu yazdık. Bu fonksiyonda da kullanıcıya bir bilgi mesajı gösterdik.
Üçüncü yazı kutusu kontrolümüz için, kullanıcı kontrolün aktif olan kontrolün
aktifliğini başka bir kontrol seçerek sonlandırdığı sırada kontrol tarafından
gönderilen EN_KILLFOCUS mesajını işledik ve bu mesajın alınması durumunda çağırmak
üzere OnEdit3KillFocus isimli fonksiyonu yazdık. Yine bu fonksiyonda da kullanıcıya
bir bilgi mesajı gösterdik.
EN_MAXTEXT mesajının
alınması için, kullanıcı ilk kontrole, o kontrol için belirlenen karakter sayısı
limitinden daha fazla sayıda karakter içeren bir yazı girmelidir. İlk yazı kutusu
kontrolümüzü oluştururken, bu kontrol için herhangi bir sınırlama getirmemiştik.
Ancak fareye sağ tıklayarak kontrollere mesaj gönderirken, ilk kontrolün yazısının
karakter sayısına sınırlama getirmiştik. Bu mesajın alınması için öncelikle
uygulamanın çalışması sırasında farenin sağ tuşuna tıklayarak kontrolün karakter
sayısının sınırlandırılmasını sağlamalısınız. Uygulamamızın son halini çalıştırdığımızda,
yukarıda işlenen mesajların alınması durumunda karşılaşacağımız görüntüler şöyle
olacaktır :
Bu uygulamamızda,
standart bir Windows kontrolü olan yazı kutusu kontrolünün ne olduğunu, nasıl
kullanıldığını, bu kontrole nasıl mesaj gönderildiğini, bu kontrolden gelen
mesajların nasıl işleneceğini ele aldık. Diğer standart kontrollere mesaj gönderme
ve bu kontrollerden gelen mesajları işleme de temelde aynı mantıkla yapılmaktadır.
Standart kontrolleri sırasıyla ele alacağımız önümüzdeki yazılarımızda, mesajların
işlenmesi ve gönderilmesi konularında örnek uygulamalar yapmaya devam edeceğiz.
Uygulamaya ilişkin kaynak kod dosyalarını buradan indirebilirsiniz.
Bir sonraki yazımızda
görüşmek üzere, mutlu günler dilerim.
Makale:
Windows API - Yazı Kutusu Kontrolünün Oluşturulması ve Kullanımı C ve Sistem Programlama Çiğdem Çavdaroğlu
|