Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: amaciyla degeri karakter kontrol kontrole kullanilmaz kutusu lparam mesaji parametresi pencere satirli uygulama wparam yazinin C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 6.2.2006
Okunma Sayısı : 29151
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 23.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 23.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 23.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 23.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API - Yazı Kutusu Kontrolünün Oluşturulması ve Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor