CFrameWnd, CButton, CListBox, CEdit, …….–> CWnd
MFC’de kontroller CWnd sınıfından türetilmiş sınıflarla temsil edilmektedir. Örneğin push button kontrolü CButton sınıfı ile, list box kontrolü CListBox sınıfı ile, edit box kontrolü ise CEdit sınıfı ile temsil edilmiştir.
Anımsatma : Kontroller aslında birer alt penceredir ve CreateWindow API fonksiyonuyla yaratılırlar. Kontrol yaratmakta kullanılan WNDCLASS isimleri Windows yüklenirken global düzeyde register ettirilmiştir. Kontrollere ilişkin pencere fonksiyonları Windows tarafından ilk elden yazılmış olup USER32.DLL içerisine yerleştirilmiştir. Yani bir kontrol üzerinden işlem yapıldığında mesajlar thread’in ana mesaj kuyruğuna bırakılır. Mesaj dispatch edildiğinde kontrole ilişkin pencere fonksiyonu tarafından işlenir. Bir kontrol yaratıldıktan sonra SendMessage fonksiyonu ile mesaj göndererek kontrole çeşitli işlemler yaptırılabilir. Kontrollerin pencere fonksiyonları işletim sistemine ilişkin olduğuna göre bir push button üzerine click yapıldığında click mesajı da kontrolün pencere fonksiyonu tarafından işlenecektir. Peki kontrolü yaratan kişi olaydan nasıl haberdar olacaktır? İşte kontroller bir olay gerçekleştiğinde üst pencereye WM_COMMAND mesajını SendMessage ile gönderirler. WM_COMMAND mesajının parametreleri şöyledir:
HIWORD(wParam)–> Mesajın nedeni (notification code)
LOWORD(wParam)–> Kontrolün ID değeri
LParam –> Kontrolün handle değeri
MFC’de bir kontrol yaratmak için önce kontrol sınıfı türünden bir nesne tanımlanır. Sonra kontrolün Create fonksiyonu ile pencere yaratılır. Her kontrol sınıfının Create fonksiyonu vardır. Aslında bu Create fonksiyonları CWnd::Create fonksiyonunu kontrole ilişkin sınıf ismiyle çağırır. Tabii CWnd::Create fonksiyonu da CreateWindow API fonksiyonuyla kontrolü yaratacaktır. Pencere yaratıldıktan sonra kontrolün handle değeri kontrol sınıfının CWnd kısmının m_hWnd elemanında saklanır.
Tıpkı CWnd sınıfında olduğu gibi yerel bir kontrol nesnesiyle pencere yaratılırsa faaliyet alanı bittiğinde çağrılan bitiş fonksiyonu pencereyi kapatacaktır. Bu nedenle nesneyi dinamik olarak yaratmak ya da nesneyi üst pencereye ilişkin sınıfın veri elemanı olarak yaratmak uygun olur.
Kontrol üzerinde işlemler yapmak için kontrol sınıflarının çeşitli üye fonksiyonları vardır. Aslında bu üye fonksiyonlar SendMessage ile kontrole uygun mesajı göndermekten başka bir şey yapmazlar. Bu durumda bir kontrole işlem yaptırmak için API programlamada olduğu gibi kontrole mesajlar göndermek yerine kontrolün uygun üye fonksiyonunu çağıracağız.
Anımsatma : API programlamada bir alt pencere ya üst pencere yaratıldıktan sonra herhangi bir zaman ya da üst pencerenin pencere fonksiyonu içerisinde WM_CREATE mesajında yaratılır.
