91
API Nedir? İşletim sistemlerine duyulan ihtiyaçlardan biri standart olarak her program tarafından yapılması gereken şeyleri ortak bir çatı altında toplamak ve programları sistemde belirli kurallar altında çalışmasını sağlamaktır. İşletim sistemlerinin değerini anlamak için işletim sistemi olmayan bir bilgisayar düşünün. Yaptığınız programları diske kaydetme ihtiyacınız var. İşletim sisteminiz yoksa programlarınızı diske yazacak ve okuyacak assembly kodları sizin yazmanız gerekecektir. Ve her program d iske yazma ve okuma kodlarını içinde bulundurmak zorunda olacaktır. Ayrıca diske yazacağınız programı diskin neresine yazacaksınız. Tabi ki herkes kendi programının başa yazılmasını isteyecektir. Bu da diski paylaşım sorununu çıkaracaktır. Ayrıca yazıcı için de problem vardır. Her yazıcı aynı sistemle çalışmayacağı için programınızda yazdırma işlemleri de varsa belli başlı yazıcı tipleri için gerekli kodları yazmanız gerekecektir. Bu örnekler çoğaltılabilir. İşte PC'ler ilk çıktığında disk işlemlerini kolaylaştırmak için DOS ta piyasaya çıktı. DOS disk işlemlerini yapmak için yazılım interruptlarını programcıların hizmetine sunmuştu. Diskle ilgili bir işleminiz için INT X'in Y numaralı servisini çağırıyordunuz ve bu işlemleri sizin yerinize DOS yapıyordu. Sistemler geliştikçe bilgisayar değişik alanlara da hitap etmeye başlayınca çok değişik arabirimler de çıktı. DOS'a grafik, yazıcı işlemleri gibi standart işlemler de eklendi ve sistemde bulunan standart donanımların hemen hemen hepsine DOS veya BIOS interruptlarıyla erişebiliyordunuz. Ayrıca DOS programların belleği nasıl kullanacağını da belirliyordu. DOS işletim sistemi olarak kullanıcıya herhangi bir standart arabirim sunmamıştır. Sadece programların sistemdeki standart donanımlara ulaşabilecekleri kodları kullanıcıya sunmuştur. DOS'ta yapılan programların hiçbiri bir birine benzemez. Her program kendi kullanıcı arayüzünü belirlemek zorundadır ve bunun için gerekli kodu kendisi yazmak zorundadır. DOS'ta yapılan programların kullanım ve programlanmasının zorluğu da bir ölçüde buradan kaynaklanır. DOS'un programlara standart bir arabirim sunmaması, bellek sınırlarının olması gibi sebeplerden dolayı çok çok geç kalmış olsada Windows çıktı. Windows DOS'un sağladığı standart donanıma ulaşma haricinde Ses kartları, Gelişmiş yazıcılar, Scanner'ler gibi donanımların kullanımını da programların kullanımına sunar. Ayrıca programlara standart arabirimleri (Diyalog kutuları, Formlar, Kontroller gibi) kullanma imkanı da sunmuştur. DOS kendi servislerini yazılım interruptlarıyla sunarken Windows API'lerle sunar. Şimdi şöyle bir şey düşünülebilir. DOS'ta çok program yaptım ama diske birşey yazdırmak için DOS'un interruptlarını kullanmaya hiç ihtiyaç duymadım. Evet eğer assembly program yazmadıysanız bunlara da ihtiyacınız yoktur. Çünkü kullandığınız programlama dili bu işi sizin yerinize yapıyordu. Bu VB'de yaptığınız programlarda da böyledir. API kullanacaksınız diye bir şart yok VB bunları sizin yerinize kullanır. Ancak DOS'taki programlama dillerinde olduğu gibi VB' de de programlama dilinin sunduğu işlemler her zaman işinizi görmeyebilir, bu durumda Windows API'lerini kullanma ihtiyacı duyarsınız. Basic herhalde bütün zamanların en yavaş programlar üreten dili olma özelliğini kimseye kaptırmak istemiyor. Quick Basicte yaptığınız bir program, aynı işi yapan C ile yapılmış programdan en az 5 kat daha yavaş çalışacaktır. Bu fark GWBasic'te daha da büyüktür. VB'de de durumun iç açıcı olduğunu iddia etmek çok güç. Programlarınızda API kullanmanız bu hız barajlarını aşmanızı sağlayacaktır. Ayrıca VB'nin sunmadığı bazı işlemler için de API kullanmak gerekir. Örneğin sistemdeki boş bellek miktarını verecek herhangi bir komut VB'de bulunmaz bunu da yine API kullanarak öğrenmek zorundasınız. http://alikoker.name.tr

api.nedir

Embed Size (px)

DESCRIPTION

Api ders notları

Citation preview

  • API Nedir?

    letim sistemlerine duyulan ihtiyalardan biri standart olarak her program tarafndan yaplmas

    gereken eyleri ortak bir at altnda toplamak ve programlar sistemde belirli kurallar altnda

    almasn salamaktr. letim sistemlerinin deerini anlamak iin iletim sistemi olmayan bir

    bilgisayar dnn.

    Yaptnz programlar diske kaydetme ihtiyacnz var. letim sisteminiz yoksa programlarnz

    diske yazacak ve okuyacak assembly kodlar sizin yazmanz gerekecektir. Ve her program diske

    yazma ve okuma kodlarn iinde bulundurmak zorunda olacaktr. Ayrca diske yazacanz

    program diskin neresine yazacaksnz. Tabi ki herkes kendi programnn baa yazlmasn

    isteyecektir. Bu da diski paylam sorununu karacaktr. Ayrca yazc iin de problem vardr.

    Her yazc ayn sistemle almayaca iin programnzda yazdrma ilemleri de varsa belli bal

    yazc tipleri iin gerekli kodlar yazmanz gerekecektir. Bu rnekler oaltlabilir.

    te PC'ler ilk ktnda disk ilemlerini kolaylatrmak iin DOS ta piyasaya kt. DOS disk

    ilemlerini yapmak iin yazlm interruptlarn programclarn hizmetine sunmutu. Diskle ilgili

    bir ileminiz iin INT X'in Y numaral servisini aryordunuz ve bu ilemleri sizin yerinize

    DOS yapyordu. Sistemler gelitike bilgisayar deiik alanlara da hitap etmeye balaynca ok

    deiik arabirimler de kt. DOS'a grafik, yazc ilemleri gibi standart ilemler de eklendi ve

    sistemde bulunan standart donanmlarn hemen hemen hepsine DOS veya BIOS interruptlaryla

    eriebiliyordunuz. Ayrca DOS programlarn bellei nasl kullanacan da belirliyordu. DOS

    iletim sistemi olarak kullancya herhangi bir standart arabirim sunmamtr. Sadece

    programlarn sistemdeki standart donanmlara ulaabilecekleri kodlar kullancya sunmutur.

    DOS'ta yaplan programlarn hibiri bir birine benzemez. Her program kendi kullanc arayzn

    belirlemek zorundadr ve bunun iin gerekli kodu kendisi yazmak zorundadr. DOS'ta yaplan

    programlarn kullanm ve programlanmasnn zorluu da bir lde buradan kaynaklanr.

    DOS'un programlara standart bir arabirim sunmamas, bellek snrlarnn olmas gibi sebeplerden

    dolay ok ok ge kalm olsada Windows kt. Windows DOS'un salad standart donanma

    ulama haricinde Ses kartlar, Gelimi yazclar, Scanner'ler gibi donanmlarn kullanmn da

    programlarn kullanmna sunar. Ayrca programlara standart arabirimleri (Diyalog kutular,

    Formlar, Kontroller gibi) kullanma imkan da sunmutur. DOS kendi servislerini yazlm

    interruptlaryla sunarken Windows API'lerle sunar.

    imdi yle bir ey dnlebilir. DOS'ta ok program yaptm ama diske birey yazdrmak iin

    DOS'un interruptlarn kullanmaya hi ihtiya duymadm. Evet eer assembly program

    yazmadysanz bunlara da ihtiyacnz yoktur. nk kullandnz programlama dili bu ii sizin

    yerinize yapyordu. Bu VB'de yaptnz programlarda da byledir. API kullanacaksnz diye bir

    art yok VB bunlar sizin yerinize kullanr. Ancak DOS'taki programlama dillerinde olduu gibi

    VB'de de programlama dilinin sunduu ilemler her zaman iinizi grmeyebilir, bu durumda

    Windows API'lerini kullanma ihtiyac duyarsnz.

    Basic herhalde btn zamanlarn en yava programlar reten dili olma zelliini kimseye

    kaptrmak istemiyor. Quick Basicte yaptnz bir program, ayn ii yapan C ile yaplm

    programdan en az 5 kat daha yava alacaktr. Bu fark GWBasic'te daha da byktr. VB'de de

    durumun i ac olduunu iddia etmek ok g. Programlarnzda API kullanmanz bu hz

    barajlarn amanz salayacaktr. Ayrca VB'nin sunmad baz ilemler iin de API kullanmak

    gerekir. rnein sistemdeki bo bellek miktarn verecek herhangi bir komut VB'de bulunmaz

    bunu da yine API kullanarak renmek zorundasnz.

    http://alikoker.name.tr

  • Windows'un sunduu bu API'ler gruplandrlarak bir ok DLL ve EXE dosyasna konmutur.

    VB'de kullanlan OCX dosyalarnda da API'ler bulunabilir. Bu API'lerden birini kullandnzda

    API'nin bulunduu DLL sisteme daha nce yklenmemise nce bu DLL yklenir ve API

    altrlr.

    Programnzda API kullanmak iin Declare deyimiyle API'yi tanmlamanz gerekir. Bu tanmdan

    sonra tanmladnz API'ye bir fonksiyon veya bir altprogram gibi ulaabilirsiniz.

    VB'de API Tanm

    VB'de API'ler iki ekilde tanmlanabilir. Fonksiyon veya altprogram olarak. Fonksiyon olarak

    tanmlanan API'lerden geriye bir deer dnerken, altprogram olarak tanmlananlardan bir deer

    geri dnmez.

    Alt program olarak API tanm:

    Private/Public Declare Sub isim Lib "libname" [([parametreler])]

    Fonksiyon program olarak API tanm:

    Private/Public Declare Function isim Lib libname [([parametreler])] [As tip]

    Burada isim fonksiyonun ismidir ve programda API bu isimle arlr. Libname kullanlan

    ktphanenin ismi, parametreler; fonksiyona giren parametreler, As tip; fonksiyondan dnen

    deerin tipidir.

    API'nin tanmlanaca yer formun veya modln General-Declerations ksmdr. API'yi bir

    formun decleration ksmnda tanmlarsanz API'yi yalnz o formun altprogramlarndan

    arabilirsiniz. Bir modlde tanmlarsanz programnzn her yerinde kullanabilirsiniz.

    API'yi doru olarak tanmladnz halde VB, ilgili dosyada byle bir API bulunmadn

    sylyorsa veya API ile ayn isme sahip bir VB komutu var ise bu durumda Alias isimleri

    kullanmanz gerekir.

    Private/Public Declare Function/Sub isim Lib libname Alias "isim" [([parametreler])] [As tip]

    API'yi doru olarak tanmladnz halde VB, ilgili dosyada byle bir API bulunmadn

    sylyorsa API isminin sonuna A ekleyerek Alias ismi olarak vermeniz gerekir. Bunun sebebi

    Windows iletim sisitemi farkl dilleri desteklemektedir. ANSI karakter setini destekleyen lkler

    iin sonuna A harfi, UniCode veya iki karekter geniliini kullanan lke seti iin ise sonuna W

    harfi eklemeniz gerekir.

    API tanm yaparken kullanacanz tiplerin isimlerini ise C'den VB'ye evirmeniz gerekir. Genel

    olarak tip karlklar yledir.

    C Visual Basic

    atom ByVal deiken AS integer

    bool ByVal deiken As Long

    http://alikoker.name.tr

  • byte ByVal deiken As Byte

    char ByVal deiken As Byte

    colorref ByVal deiken As Long

    dword ByVal deiken As Long

    hwnd,hdc,hmenu vb ByVal deiken As Long

    int,uint ByVal deiken As Long

    long ByVal deiken As Long

    lparam ByVal deiken As Long

    lpdword deiken As Long

    lpint,lpuint deiken As Long

    Iprect deiken As type

    Ipstr,Ipcstr ByVal deiken As String

    Ipvoid deiken As Any

    lpword deiken As Integer

    lresult ByVal deiken As Long

    null deiken As Any veya ByVal deiken As Long

    short ByVal deiken As Integer

    void Sub procedure

    word ByVal deiken As Integer

    wparam ByVal deiken As Long

    16 bit ByVal deiken As Integer

    32 bit ByVal deiken As Long

    float ByVal deiken As Single

    double ByVal deiken As Double

    Parametrelerden biri iki farkl tipte deer alabiliyorsa bunu As Any olarak tanmlamanz gerekir.

    Hangi parametrenin Any olarak tanmlanmas gerektiine ancak dosyadaki bilgileri okuyarak

    anlayabilirsiniz. rnein bir parametre hem string ierebiliyor ve hemde Null ierebiliyorsa bu

    parametre Any olarak tanmlanmaldr.

    Yaptklar ilere gre API'lerin bulunduklar dosyalar ise unlardr :

    DLL Fonksiyonlar

    Advapi32.dll ifre ve Kayt dosyas ilemleri gibi gelimi bir ok API'ler

    Comdlg32.dll Diyalog pencereleri ile ilgili API'ler

    Gdi32.dll Grafik API'leri

    Kernel32.dll ekirdek Windows API'leri

    Lz32.dll 32 bit sktrma API'leri

    Mpr.dll Multiple Provider Router API'leri

    Netapi32.dll 32-bit Network API'leri

    Shell32.dll 32-bit Shell API'leri

    User32.dll Kullanc arabirimi API'leri

    Version.dll Versiyon ilemleri API'leri

    Winmm.dll Multimedia API'leri

    Winspool.drv Print spooler API'leri

    http://alikoker.name.tr

  • http://alikoker.name.tr

  • 1

    Windows letim Sisteminin zellikleri

    Windows'un Tarihi

    Windows zerinde ilk almalara 1985 ylnda balamtr. lk rn Windows

    1.0 idi. Windows 3.0 srm ile iletim sistemine benzeyen zellikler kazanmtr.

    Windows'un en uzun sre pazarda kalan srm 3.1'dir. Windows 3.1 kadar(3.1 dahil)

    Windows sistemleri 16 bit mikro ilemcilerde alabilecek biimdeydi. 1995'te

    Windows 95 piyasaya srld ve bunu Windows 98 izledi. Win95/98/NT sistemleri

    32 bitlik Windows sistemleridir. 32 bit Windows sistemleri birbirine ok benzer

    sistemleridir. Programlama bakmndan bu sistemlerin hepsi yksek dzeyde

    uyumludur(.obj ve .exe dosyalar da tamamen uyumludur). Windows sistemleri

    yalnzca Intel tabanl mikro ilemciler iin dnlmemi. eitli risc tabanl

    sistemlerde de Windows iletim sistemi kullanlabilmektedir. Windows CE, Windows

    sisteminin kltlerek el bilgisayarlarna uyarlanm biimidir. Bu sistemin

    programlama biimi dier Windows sistemleriyle uyumludur.

    Windows Sisteminin Temel zellikleri

    1. Windows grafik tabanl bir iletim sistemidir.

    Windows grafik mode'da alan bir sistemdir. Oysa DOS ve UNIX temelde

    text mode'da alr. Ancak bu iletim sistemlerinin de kullanmn kolaylatrmak iin

    grafik arabirimleri vardr. Ancak yalnzca Windows'da grafik mode'da program

    yazmak zorunlu deildir. Bir Windows program Windows'un grafik zelliini

    kullanabilir. Bu tr programlara GUI(graphical user interface) programlar denir.

    Zaten Windows program denilince bu tr programlar anlalr. Baz Windows

    programlar text mod'da alabilir. Byle programlara console programlar denir.

    Console programlar iin zel bir bilgiye gereksinim yoktur. Programlar DOS ve

    UNIX'te olduu gibi organize edilir.

    2. Windows aygt bamsz grafik zelliine sahiptir.

    Windows'da oluturulan grafiksel grntler ekran kartna, ekran moduna ve

    monitr tipine bal deildir. Yeni bir grafik kart takldnda nceki kart iin

    yazlm program ayn biimde alr. Yani bu deiimlerden programlama sistemi

    etkilenmez.

    3. Windows ok ilemli bir iletim sistemidir.

    Windows ayn anda birden fazla programn bir arada altrlabildii ok

    ilemli(multi processing) bir iletim sistemidir. ok ilemli alma zaman paylaml

    bir biimde yaplr. Yani her program bir sre altrlarak braklr. Programlarn

    altrlp braklma ilemleri belli bir algoritma ile yrtlr. Bu algoritmaya

    izelgeleme algoritmas denir. Windows sistemleri dngsel izelgeleme(round

    robind scheduling) sistemi kullanr. Programlarn altrlp braklma sresine quanta

    denir. Windows sistemleri 20 ms'lik quanta sistemi kullanr. Bir programn braklarak

    dier bir programn altrlmas ilemine grevler aras gei(task switch) denir.

    Ancak programlar ou zaman dsal bir takm olaylar beklerler(klavyeden bir tuun

    baslmasn, porttan bir bilgi gelmesini, dosyadan veri okunmas vs..). O zaman

    http://alikoker.name.tr

  • 2

    iletim sistemi ilgili program izelge d brakr. Bu ileme programn bloke edilmesi

    denir. Bu dsal olaylar gerekletiinde iletim sistemi program tekrar izelgeye

    yeniden dahil eder. Ancak Windows iletim sisteminde olduu gibi baz sistemler

    ncelikli dngsel izelgeleme kullanabilirler. Her programn 0-31 arasnda bir

    ncelik derecesi vardr. Sistem en yksek ncelikteki programlar arasnda izelgeleme

    yapar. Ancak onlar bittikten sonra dierleriyle uralr.

    Dk ncelikli programlar yine de alr. nk yksek ncelikli programlarn

    hepsinin bloke olma olasl vardr. Tabii isterse programc yazlm yoluyla da bloke

    olabilir. Windows'da bir programn minimize edilmesi bloke edilmesi anlamna

    gelmez.

    4. Windows "preemtive" bir iletim sistemidir.

    Preemtive sistemlerde iletim sistemi grevler aras gei ilemiyle bir

    program altrr, quanta sresi bittiinde kontrol tekrar ele geirerek baka bir

    program altrr. Oysa preemtive olmayan sistemlerde bir program altrldnda

    grevler aras geiin olumas iin programcnn kontrol iletim sistemine geri

    vermesi gerekir. Eer vermezse tm sistem olumsuz ynde etkilenir ve hatta

    kilitlenebilir. Windows 3.x sistemleri preemtive deildir. Ancak Windows 95/98/NT

    sistemleri preemtive'dir.

    5. Windows alt ilemli almann mmkn olduu bir sistemdir.

    Alt ilem(thread) bir programn bamsz olarak izelgelemeye giren bir

    parasna denir. C'de herhangi bir fonksiyon alt ilem olarak tanmlanabilir.Ancak bu

    fonksiyonun alt ilem olarak sisteme tantlmas gerekir. Her program en azndan bir

    alt ilem ierir, bu da programn kendisidir. Alt ilemler programn alma zaman

    srasnda oluturulur. Yani C program main'den almaya baladnda tek alt ileme

    sahiptir. Sonra programn ak CreateThread fonksiyonuna gelir ve bir fonksiyon

    yeni bir alt ilem olarak devreye girer. Aslnda btn izelgeleme alt ilem dzeyinde

    yaplr. rnein 3 proses sz konusu olsun, p1, p2, p3 adl program alyor olsun.

    http://alikoker.name.tr

  • 3

    ok ilemli alma pek ok algoritmann gerekletirilmesini kolaylatrmaktadr.

    Birden fala cpu'nun bulunduu makinalarda hz ciddi biimde artar. Ayn programn

    alt ilemleri arasndaki task switch zaman farkl programlarn alt ilemleri arasndaki

    task switch zamanndan daha azdr.

    ok ilemliliin avantajlar:

    - ok alt ilemden oluan programlarda dsal bir olay gerekletiinde programn

    tamam bloke olmaz, yalnzca bir alt ilem bloke olur. Bir dng ierisinde bir olayn

    gereklemesi ile ilgili ilemler yapan kodlar daha kolay tasarlanrlar.

    6. Windows Intel sistemlerinde 4 Gb bellek kullanabilir.

    DOS iletim sistemi ancak 1 Mb bellei kontrol edebilir. stelik bu 1 MB

    bellein yalnzca 640 Kb'lik blmn programlar iin kullanabilir. Oysa programlar

    ayrntl zelliklere sahip olduka bellek gereksinimi de artar. Bir Windows exe

    program istenildii kadar uzun olabilir.

    7. Windows sanal bellek kullanan bir iletim sistemidir.

    Sanal belek(virtual memory) programn belli bir ksmnn RAM'e yklenerek

    disk ile yer deitirmeli olarak altrlmas iin kullanlr. Programn belirli bir

    blm RAM'e yklenerek almaya balar, program kod ya da data bakmndan

    RAM'de olmayan ksma erimek istediinde iletim sistemi programn RAM'deki bir

    blmn disk'e diskteki blmn RAM'e ekerek kesiksiz almay salar. Btn

    sanal bellek kontrol; rnein programn neresinin diskte tutulup tutulmayaca gibi

    ilemler iletim sisteminin kontrol altndadr. Programcnn sanal bellek kullanm

    zerindeki kontrol son derece azdr. Btn bu ilemler iletim sistemi tarafndan

    otomatik olarak gerekletirilir.

    Sanal bellek kullanm hem mikro ilemcinin hem de iletim sisteminin

    ortaklaa salad bir ilemdir. Intel ilemcileri 80286 ile birlikte segment tabanl

    sanal bellek, 80386 ile birlikte sayfa tabanl sanal bellek kullanmna uygun

    tasarlanmtr. Yani Windows altnda toplam bellek RAM + bo disk alan kadardr.

    Programn disk ile RAM arasnda tanmasna yer deitirme(swap) denir. Program

    uzun RAM azsa fazla sayda yer deitirme olur, program da yava alr.

    Fiyat/Performans bakmndan optimum RAM Windows 3.1 iin 16Mb, 32 bit

    Windows sistemleri iin 64 Mb civarndadr. Dinamik bellek fonksiyonlaryla heap

    zerinde yaplan tahsisatlar da sanal bellek kullanlarak gerekletirilir. rnein Excel

    byk bir tabloyu ykleyebilmek iin malloc fonksiyonu ile 200 Mb bellek isteyebilir,

    sistem bunu RAM'de bulamazsa disk zerinde yer deitirme dosyas zerinde tahsis

    eder. Bu alan kullanlmak istendiinde iletim sistemi otomatik olarak yer deitirme

    yapar.

    8. Win32 sistemlerinde her program sanki bellei tek bana kullanyormu gibi

    alr.

    Win32'de grevler aras gei srasnda bir program bellekten tamamen atlr,

    dieri bellee tamamen yklenir. Yani bir program alrken dier programlar

    bellekte deildir ve onlara eriilemez. Tipik bir Windows'daki bellek ynetimi dk

    seviyeli 2Gb'lk sana bellek programlar iin, yksek anlaml 2GB'lk sanal bellek ise

    iletim sistemi iindir.

    http://alikoker.name.tr

  • 4

    alma sras programa geldiinde sanal bellek desteiyle program 2Gb'lk alana

    yklenir. Win32'de btn gstericiler 4 byte uzunluundadr ve btn bellei

    grebilir. rnein iki farkl programda malloc fonksiyonu ayn adresi vermi olabilir,

    ancak bu iki program tamamen izole altna gre iki adresin birbirleriyle hi

    ilikisi yoktur. Yani Windows'da bir adres sz konusu olduu zaman o adresin hangi

    programa ilikin olduunu da bilmek gerekir. Yksek anlaml 2 Gb'lk alan grevler

    aras geiten etkilenmez.

    9. Windows dosya formatlar.

    lk obj format 1978'deki Intel OMF(dos) formatdr. Win32 sistemleriyle

    beraber COFF formatna geilmitir.

    lk exe format DOS'ta MZ(Mark Zibikowski) format olarak, Windos 3.x ile

    beraber NE(new executable) format kullanlmaya balanmtr. Win32 sistemleriyle

    beraber PE(portable executable) format kullanlmaya balanmtr. PE format mikro

    ilemciden ve iletim sisteminden bamsz bir format olma iddiasndadr.

    10. Kaynak kullanm.

    Bir Windows programndaki bitmap, dialog penceresi, menu, icon, string gibi

    grsel elemanlara kaynak(resource) denir. Kaynaklar ya dorudan kaynak dili

    kullanlarak yazlrlar ya da grsel olarak kaynak editrlerinde oluturulurlar. Tabii

    kaynak editr bu grsel belirlemelerden kaynak kodunu oluturur. Kaynak dilinde

    yazlm kaynak programnn uzants rc'dir. Bu program ismine kaynak derleyicisi

    denilen zel bir derleyicide derlenir ve kaynak verisi res uzantl bir dosya halinde

    oluturlur. Bu res dosyas linker tarafndan PE formatnn kaynak blm denilen bir

    blmne yerletirilir(resource binding). Rc dosyas derlenirken gerekli btn grafik

    dosyalar bulundurulmaldr. Ancak derlendikten sonra bu dosyalarn ierisindeki

    veriler res dosyasna aktarlr, yani rs dosyas btn grafik bilgilerini ierir. Bu res

    dosyas PE formatna yazldktan sonra grafik dosyalarna, rc dosyasna, res dosyasna

    programn almas iin gereksinim kalmaz. PE formartnn kaynak blm tamamen

    dokmante edilmitir. Bu kaynak blmnde deiiklik yaplmasna izin veren

    kaynak editrleri vardr. Kaynak kullanmndan ama bir programda hi onu derleyip

    link etmeden grsel deiiklikleri kaynak editr kullanarak yapabilmektir(res

    dosyas zerinde dorudan deiiklik yaplmas uygun deildir. Bu kaynak ksm PE

    formatndan kartylabilir ve yeni bir kaynak kodu oraya yerletirilebilir.).

    http://alikoker.name.tr

  • 5

    11. Windows sisteminde dinamik ktphaneler youn olarak kullanlr.

    Ktphane dosyalar lib ve dll uzantl olmak zere ikiye ayrlr. Lib dosyas

    ierisinden bir fonksiyon arlm olduunda linker fonksiyonlarn kodlarn alarak

    exe dosyasnn ierisine yazar. Yani dosyay altrmak iin lib dosyasna ihtiya

    olmaz. Oysa dll ierisindeki bir fonksiyon arldnda linker yalnzca fonksiyonun

    hangi dll ierisinde olduunu PE formatnn import blmne yazar. Program

    altrlaca zaman Windows, PE formatnn import blmn okur, bu programn

    hangi dll dosyalarn kullandn tespit eder, programla birlikte bu dll dosyaslarn da

    ykler. Bu durumda dinamik ktphane kullanan bir program ancak bu dinamik

    ktphanelerle birlikte tanarak altrlabilir. Dll dosyalar tamamen PE

    formatndadr. Yani bir exe dosya da bir dll'mi gibi kullanlabilir.

    12. Windows sistemleri UNICODE tablosunu desteklemektedir.

    Bir yaz ASCII tablosunda her karakteri 1 byte olacak biimde temsil edilir.

    Bu durumda 256 deiik karakter bulunabilir. Oysa UNICODE tablosunda her

    karakter 2 byte ile belirtilir. Dnyada kullanlan btn semboller bu tabloya

    yerletirlimitir. Bir yaznn balang adresini parametre olarak alan Windows API

    fonsiyonlarndan 2 tane vardr. Bir tanesi yazy ASCII tablosuna bakarak yorumler,

    dieri UNICODE tablosuna bakarak yorumlar. Eer UNICODE sistemi kullanlrsa

    programdaki yazlar dilden bamsz hale getirilir.

    Macar Notasyonu

    Macar notasyonu Microsoft alanlarndan Charles Simoney tarafndan

    gelitirilmitir. Macar notasyonu deikenlere isim verme ile ilgili belirlemelerden

    oluur. Ama bir deikene bakldnda onun trnn ve hangi amala

    kullanldnn tespit edilmesidir.

    zellikleri:

    - Deiken isimleri deikenin trn anlatan kk harf n eklerle balar, daha sonra

    her szcn ilk harfi byk harfle balar.

    nek Anlam

    l long

    w WORD (iaretsiz iki byte)

    dw DWORD (iaretsiz drt byte)

    d double

    c char

    p gsterici

    pl long gsterici

    pv void gsterici

    psz sonu NULL ile biten yazya ilikin char gstericisi

    f flag(ayn zamanda float)

    b bool

    lp uzak gsterici

    u unsigned int

    http://alikoker.name.tr

  • 6

    int tr ok fazla kullanld iin n ek almaz. Ancak kk harfle balatlr, sonraki

    szcn ilk harfi byk harfle balatlr(totalCost gibi).

    - Macar notasyonunda alt tire kullanlmaz. Fonksiyon isimlerinin her szcnn ilk

    harfi byk yazlr(CreateWindow gibi). Fonksiyon isimleri nce eylemle balar

    nesneyle devam eder.

    - Deiken isimleri uzun olma eilimindedir.

    Macar notasyonu Windows iletim sisteminin programlamaya ilikin

    dokmantasyonlarnda Microsoft tarafndan youn bir biimde kullanlmaktadr.

    Windows programlamada Macar notasyonunun kullanlmas gelenek haline gelmitir.

    - Yap trnden deikenlere n ek getirilmez. lk szck kk harf sonraki btn

    szcklerin ilk harfleri byk harfle yazlr.

    Windows.h Dosyas

    Windows programlamasnda windows.h isimli balk dosyas n ilemci ve

    derleyici iin include edilmelidir. Bu dosyann ierisinde API fonksiyonlarnn

    prototipleri, sembolik sabitler, typedef isimleri, yap bildirimleri vs gibi bildirimler

    vardr. Bu dosya n ilemci tarafndan aldnda ok byk bir kod derleme

    ilemine sokulur.

    API(Application Programming Interface) Fonksiyonlar

    Bir iletim sisteminin alrken kendisinin kulland, programcnn da

    dardan arabilecei fonksiyonlar vardr. Bunlara sistem fonksiyonlar denir.

    Sistem fonksiyonlarna unix'te System Call, Windows'da ise API denilmektedir.

    Sistem fonksiyonlar iletim sistemiyle birlikte bellee yklenirler. API fonksiyonlar

    btn programlama dillerinde ve gelitirme ortamlarnda ilemleri yapabilmek iin

    derleyici sistemleri tarafndan arlr. rnein Visual Basic'te programc API

    kavramn bilmese de aslnda derleyici sistemi btn ilemlerini sistem

    fonksiyonlarn ararak gerekletirir. Windows API fonksiyonlar dll dosyalar

    ierisindedir ve sistemle beraber otomatik olarak yklenirler. API fonksiyonlar

    gruba ayrlr:

    1. Kernel API'ler: Kernel32.dll ierisindedir. Sistemin aa seviyeli almalaryla

    ilgili sistem fonksiyonlar bulunur.

    2. User API'ler: User32.dll ierisindedir. Programcnn dorudan zerinde alt

    konularla ilgili olan sistem fonksiyonlardr. rnein pencere ilemleri iin gereken

    API'ler, kontrollere ilikin API'ler vs.

    3. Graphics API'ler: Gdi32.dll ierisindedir. Btn grafik izimlerine ilikin sistem

    fonksiyonlarn ierir.

    Bir Windows Programnn Derlenerek altrlmas

    Bir Windows programnn exe uzantl hale getirilebilmesi iin birka aama

    gereklidir. nce uzants c olan dosyalar derleyici tarafndan derlenerek obj dosyalar

    http://alikoker.name.tr

  • 7

    dntrlr, sonra uzants rc olan kaynak dosyalar kaynak derleyicisi tarafndan

    derlenerek res uzantl hale getirilir, en sonunda linker tarafndan obj ve res dosyalar

    link edilerek exe uzantl dosya elde edilir.

    c dosyalar rc dosyalar

    Derleyici Kaynak derleyicisi

    obj dosyalar res dosyalar

    linker

    exe (PE format)

    Aslnda linker program exe dosyasnn ierisine res dosyasn yeletirebilecek

    biimde yazlmtr. Yani ilemler yle de yrtlebilir: nce yalnzca obj'larla exe

    elde edilir, daha sonra res dosyas tekrar linker kullanlarak exe ierisine

    yerletirilir(resource binding). Burada aklanan ilemler komut satrndan manual

    olarak yaplabilir. Ancak derleyici sistemleri proje dosyas kullanmyla bu ilemleri

    kolaylatrmaktadr. Bu alma biimine gre nce bir proje dosyas alr, sonra bu

    dosya ierisine c ve rc dosyalar yerletirilir. Program altrlaca zaman derleyici

    sistemi nce c dosyalarn c derleyicisiyle, rc dosyalarn ise kaynak derleyicisi ile

    derler ve hep birlikte link eder.

    Windows.h erisindeki typedef simleri

    Windows programlamasnda tanabilirlik salamak amacyla tr belirten

    anahtar szckler yerine typedef isimleri youn olarak kullanlr. Bu tr

    tanmlamalarnn balcalar unlardr:

    typedef unsigned char BYTE

    typedef unsigned short int WORD

    typedef unsigned long int DWORD

    typedef int BOOL /*rnein BOOL bir fonksiyonun

    baarl ya da baarsz olduu bilgisi iin

    kullanlabilir. BOOL demek aslnda int

    demektir ancak okunabilirlii arttrr. Ayn

    zamanda BOOL trne elik eden iki makro

    vardr. TRUE ve FALSE. #define FALSE 0

    #define TRUE 1*/

    typedef unsigned int UINT /*Aslnda Win32'de UINT ile DWORD

    arasnda ilevsel bir fark yoktur. nk int

    tryle long tr ayn uzunluktadr.*/

    typedef int INT

    typedef float FLOAT

    /*

    DOS ve Win3.1 sistemlerinde yakn ve uzak gsterici kavramlar vardr. Dolaysyla

    near ve far anahtar szckleri geerli bir biimde kullanlr. Oysa 32 bit Windows

    sistemlerinde yakn ve uzak gsterici diye kavramlar yoktur. Btn gstericiler 4 byte

    uzunluundadr. Win32'de near ve far anahtar szckleri tanml deildir, kullanlmas

    error oluturur. Ancak Win3.1 sistemleriyle uyumu korumak iin near ve far anahtar

    szckleri windows.h ierisindeki

    http://alikoker.name.tr

  • 8

    #define far

    #define near

    satrlaryla silinirler. Yani biz near ya da far anahtar szcklerini kullansak bile

    windows.h dosyas include edildii iin bu szckler koddan kartlr. Bylece error

    olumaz. Bu iki satr Win3.1 programlarnn Win32'de hi deiiklik yaplmadan

    kullanlabilmesini salamak iin konulmutur. Gstericilere ilikin typedef

    tanmlamalar Win3.1'de oluturulmutur. Dolaysyla yakn ve uzak gsterililer iin

    farkl isimler uydurulmutur.

    */

    typedef char far *LPSTR;

    typedef char *PSTR; /*far anahtar szc silindii iin

    LPSTR ile PSTR ayn trdr, karakter

    trnden gsterici anlamna gelir. Ancak

    hala Win3.1'den alkanlkla LP n ekli

    typedef isimleri daha fazla

    kullanlmaktadr.*/

    typedef unsigned short int *PWORD, *LPWORD;

    typedef int * PBOOL;

    typedef unsigned int *LPUINT, *PUINT;

    typedef const char *LPCSTR, *PCSTR;

    typedef unsigned int WPARAM;

    typedef long int LPARAM; /*Win3.1'de WPARAM 2 byte LPARAM

    ise 4 byte uzunluunda iaretsiz tam say

    biimindeydi. Win32'de aralarnda fark

    yoktur.*/

    #define CONST const /*CONST yerine const yerletirilir.*/

    typedef void *PVOID, *LPVOID;

    Handle Trleri

    smine handle denilen ve ilk harfi 'H' ile balayan btn tr isimleri gerekte

    void trnden gsterici anlamndadr.

    HWND

    WICON

    HCURSOR

    Macar notasyonunda bu trde deiken tanmlanrken deiken isminin nne 'h'

    getirilir. rnein: HWND hwnd; /*veya void *hwnd;*/

    Bir Windows Programnn Organizasyonu

    Bir Windows program DOS ve UNIX'te olduu gibi main fonksiyonundan

    deil, WinMain fonksiyonundan almaya balar. WinMain fonksiyonunun

    parametreleri main fonksiyonundan farkldr ve iletim sistemi tarafndan geirilir.

    WinMain fonksiyonunun geri dn deeri int olmak zorundadr.

    Fonksiyonun geri dn deerinin soluna yazlan anahtar szce fonksiyonun

    arma biimi(calling convention) denir. Bu arma biimleri pascal, cdecl veya

    stdcall olabilir. Microsoft firmas bu anahtar szckleri _pascal, _cdecl, _stdcall

    olarak tanmlamtr. Ancak daha sonra ANSI uyuumu salamak iin ift alt tireli

    ekillerini standartlatrmtr. Bugn btn derleyiciler biimi de

    desteklemektedir. Bu anahtar szcklerden hibiri yazlmazsa C'deki fonksiyonlar

    http://alikoker.name.tr

  • 9

    iin __cdecl yazlm kabul edilir. C++'taki snfa ilikin ye fonksiyonlar iin

    varsaylan durum __stdcall biimindedir. Windows.h ierisinde #define WINAPI

    __stdcall tanmlamas vardr. WinMain fonksiyonunun arlma biimi __stdcall

    olmak zorundadr. WINAPI zaten bu demektir(Eer burada WINAPI ya da __stdcall

    yazmazsak default olarak __cdecl anlalr, bu da programn hatal almasna yol

    aar).

    WinMain Fonksiyonunun Parametreleri

    Bu parametreler iletim sistemi tarafndan geirilir.

    - HINSTANCE hInstance

    Buraya geirilen deer exe dosyann altrlma srasnda bellee yklenme

    adresidir. Programn yklenme adresi aslnda PE formatnn ierisine yazlmaktadr.

    Ykleme adresi derleyici seeneklerinden eitli biimlerde deitirilebilir. Ancak

    deitirilmesi iin ciddi bir neden yoktur. Win9x sistemlerinde bu ykleme adresi

    default olarak 0x400000(4 Mb), WinNT sistemlerinde 0x100000(1Mb) biimindedir.

    Yani farkl programlarn hInstance deerleri farkl olabilir.

    16 bit Windows'da hInstance deeri programn yklenme adresi deil

    programn module database adresidir. Yani 16 bit Windows'da her programn

    hInstance deeri birbirinden farkldr. hInstance deeri pekok API fonksiyonuna

    parametre olarak geirilmektedir. rnein kaynak(resource) zerinde ilem yapan bir

    API fonksiyonu bu deeri parametre olarak ister, aslnda fonksiyon bu deerden

    faydalanarak PE formatnn yklenme adresini alr. PE format ierisinde kaynak

    blmnn nerede balad bilgisi vardr. Fonksiyon kaynak bilgilerine bu biimde

    eriir. hInstance deeri WinMain ierisinde global bir deikene atanrsa her

    fonksiyon ierisinden kullanlabilir.

    - HINSTANCE hPrevInstance

    Bu deer 32 bit Windows sistemlerinde her zaman NULL olarak geirilir. 16

    bit Windows'da hPrevInstance programn kopyas birden fazla altrlyorsa nceki

    kopyasnn hInstance deeri olarak geirilir. Tabii program ilk kez altrldnda

    hPrevInstance 0 olacaktr. 16 bit Windows'da bir programn birden fazla altrlmas

    istenmiyorsa aadaki gibi bir ilem yaplabilir.

    if (hPrevInstance)

    return 0;

    Baz ilemlerin yalnzca programn ilk altrlmasnda yaplmas isteniyorsa:

    if (!hPrevInstance) {

    ...........

    ........

    ........

    ........

    }

    32 bit Windows sistemlerinde hPrevINstance her zaman NULL olduuna gre

    programn ilk kez altrlp altrlmad bu yntemle anlalamaz(Bu ilem iin

    mutex nesneleri kullanlmaldr).

    http://alikoker.name.tr

  • 10

    - LPSTR lpszCmdParam

    Komut satr argmanlarn gsteren yaznn balang adresini belirtir. Komut

    satr argmanlar tek yaz olarak tutulur.

    - int nCmdShow

    Programn ana penceresinin program altrldnda hangi byklkte ilk kez

    grntleneceini belirtir. Bu parametre 3 seenek alabilir. Bunlar:

    SW_MAXIMIZE

    SW_MINIMIZE

    SW_RESTORE

    Bir Windows program hibir pencere olmadan da alabilir. Ancak tabi

    istenen bu deildir.

    Programn Ana Penceresinin Yaratlmas

    Programa ilikin btn pencerelerin yaratlmas CreateWindow API

    fonksiyonu ile yaplmaktadr. Bu fonksiyonun birinci parametresi WNDCLASS

    trnden bir yap deikeninin adresini alr. Bu durumda nce WNDCLASS trnden

    bir yap deikeni tanmlanp iinin doldurulmas gerekir. CreateWindow bu yapnn

    ierisindeki bilgileri kullanmaktadr.

    WNDCLASS Yaps

    WNDCLASS yaps bir pencerenin temel zelliklerini barndran bir yapdr.

    WNDCLASS Yapsnn Elemanlar

    - UINT style

    Pencerenin genel tryle ilgili bilgileri ierir. Bu eleman aslnda her biti bir

    zellik olarak ele alnacak biimde dnlmtr. Bu elemana genellikle

    CS_HREDRAW | CS_VREDAW deeri girilir(Windows.h ierisinde birok

    sembolik sabit vardr. Bu sembolik sabitlerin hangi amala kullanldnn kolay

    anlalabilmesi iin isimlendirilmeleri de okunabilir bir biimde yaplmtr. Bir

    sembolik sabitin isimlendirilmesi genel olarak XX_ISIM biimindedir. Burada XX

    sembolik sabitin hangi konuyla ilgili olduunu anlatan bir n ektir).

    - WNDPROC lpfnWndProc

    Pencere fonksiyonunun balang adresini tutan gstericidir.

    - int cbClsExtra

    int cbWndExtra

    Pencere biimine ilikin yap iin ayrlacak ekstra alanlarn byte cinsinden

    deeridir. Ekstra alana nadiren gereksinim duyulur, genelde deeri sfrdr.

    - HANDLE hInstance

    Bu elemana WinMain fonksiyonuna geirilen hInstance deeri geirilmelidir.

    http://alikoker.name.tr

  • 11

    - HICON hIcon

    Program minimize edildiinde gsterilecek icon grntsn belirlemek iin

    kullanlr. Genellikle bu elemana Windows'un nceden tanmlanm standart

    icon'larndan biri yerletirilir. skelet programda bu elemana LoadIcon API

    fonksiyonu arlarak deer atanmtr. LoadIcon(NULL, IDI_QUESTION);

    - HCURSOR hCursor

    Windows programlamasnda cursor mouse'un hareket ettirildiindeki gsterici

    ekili olarak kullanlr. Mouse oku bir pencerenin snrlar ierisinde gezdirildiinde

    istenilen bir ekle dntrlebilir. Bu eleman bu eklin belirlenmesinde kullanlr.

    skelet Windows programnda bu elemana LoadCursor API fonksiyonunun geri dn

    deeri atanmtr. LoadCursor(NULL, IDC_ARROW);

    Burada belirlenen mouse ekli ok biimindedir.

    - HBRUSH hbrBackground

    Bu eleman pencerenin zemin rengini belirlemekte kullanlr. Bu elemana

    iskelet Windows programnda GetStockObject fonksiyonuyla elde edilen deer

    atanmtr. GetStockObject(WHITE_BRUSH);

    - LPCTSTR lpszMenuName

    Program menuye sahip olabilir ya da olmayabilir. Eer olacaksa buraya menu

    kaynann ismi girilmelidir.

    - LPCTSTR lpszClassName

    Her WNDCLASS yapsnn bir ismi vardr. Bu isim CreateWindows

    fonksiyonuna parametre olarak geirilir. Yani aslnda CreateWindow fonksiyonu bu

    isimden hareketle bu yapnn ierisindeki bilgileri elde eder.

    WNDCLASS yapsnn ii doldurulduktan sonra bu yapnn sisteme

    tantlmas gerekir. Bu tantma ilemi RegisterClass API fonksiyonu ile yaplr. Bu

    API fonksiyonu WNDCLASS trnden bir yap deikeninin adresini parametre

    olarak alr. WNDCLASS yapsnn sisteme tantlmas ilemi 32 bit Windows

    sistemlerinde programn her kopyas iin yaplmak zorundadr. Ancak 16 bit

    Windows sistemlerinde bu ilem yalnzca ilk kopya iin yaplmaldr. Bunu yapan kod

    16 bit Windows sistemleriyle uyumu korumak iin if (!hPrevInstance) { }kod

    blounun iinde yaplr. RegisterClass fonksiyonu WNDCLASS yapsna ilikin bu

    bilgileri sistem blgesine kopyalar. Herhangi bir API fonkiyonu isterse bu bilgilere

    ulaabilir(Win32'de program sonlandrldnda o programn sisteme tantt btn

    WNDCLASS bilgileri sistemden boaltlr).

    http://alikoker.name.tr

  • 12

    Programn Ana Penceresinin Yaratlmas

    Pencerenin yaratlmas CreateWindow API fonksiyonu ile yaplr.

    CreateWindow Fonksiyonunun Parametreleri

    - LPCTSTR lpszClassName

    Bu parametre daha nce sisteme tantlm olan WNDCLASS yapsnn ismini

    verir. Bu ismi alan CreateWindow sistem alanna ulaarak sisteme tantlm olan

    btn yaplar arasndan uygun olan alr.

    - LPCTSTR lpszWindowName

    Pencerenin balk yazsn belirlemek iin kullanlr.

    - DWORD dwStyle

    Pencerenin grnt biimini belirlemekte kullanlr. Bu deiken 32 bitten

    olumaktadr. Her bit bir zelliin olduunu ya da olmadn belirlemekte kullanlr.

    Pencere biimlerine ilikin windows.h ierisinde tanmlanm WS_ ile balayan bir

    grup sembolik sabit vardr. Bu sembolik sabitlerin yalnzca bir biti 1 dier bitleri 0'dr.

    Bu sembolik sabitler bit OR ilemine sokularak eitli zelliklerin birlikte salanmas

    iin kullanlabilirler.

    Balca Pencere Biimleri

    - WS_VISIBLE

    Yaratlr yaratlmaz pencerenenin grntlenmesini salar.

    - WS_BORDER

    Penerenin snr izgilerinin grnmesini salar.

    - WS_CAPTION

    Balk ksmnn olmasn salar.

    - WS_SYSMENU

    Sistem mensnn grntlenmesini salar.

    - WS_OVERLAPPED

    Pencerenin balk ksm ve snr izgilerinin olmasn salar.

    - WS_OVERLAPPEDWINDOW

    Windows.h ierisindeki bir sembolik sabit biimindedir. WS_CAPTION |

    WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME |

    WS_MINIMIZEBOX | WS_MAXIMIZEBOX.

    skelet programda pencere biimi olarak WS_OVERLAPPEDWINDOW olarak

    seilmitir. En sk kullanlan pencere biimi budur.

    - int x

    int y

    int nWidth

    int nHeight

    Pencerenin ekrandaki ilk araboyut(restore) koordinatlardr. x, y sol st

    kenin koordinatlardr. nWidth, nHeight yatay ve dey uzunluklardr. skelet

    programda bu deerler,

    CW_USEDEFAULT

    0

    http://alikoker.name.tr

  • 13

    CW_USEDEFAULT

    0

    olarak girilmitir. Pencerenin ilk grnts masastn ortalayacak biimde

    yerletirilir.

    - HWND hWndParent

    Pencereler st pencere(parent window) ve alt pencere(child window) olmak

    zere iki ksma ayrlr. st pencereler masa stnde herhangi bir yere hareket

    ettirilebilirler. Oysa alt pencereler st pencerelerin snrlar darsna kartlamaz. Alt

    pencerenin de alt penceresi olabilir(Aslnda st pencere masa stnn alt

    penceresiymi gibi de dnlebilir). Aslnda Windows'un push button, radio button,

    check box gibi grsel elemanlar birer alt pencerdir. Bu tr zel alt pencerelere control

    denir. CreateWindow fonksiyonunun geri dn deeri HWND trndendir. Bu

    deere pencerenin handle deeri denir. Bir pencere yaratldnda pencerenin btn

    bilgileri sistem ierisinde gizli bir blgeye aktarlr. Fonksiyon aslnda bu bilginin

    aktarld blgenin balang adresini verir. Pencereyle ilgili ilem yapan btn API

    fonksiyonlar bu handle deerini parametre olarak alrlar. Handle deerini alan API

    fonksiyonlar ilgili pencerenin btn bilgilerine eriebilir. Yani handle deeri hangi

    pencereyle ilgili ilem yaplacan belirlemekte kullanlr. CreateWindow fonksiyonu

    hem st pencere hem de alt pencere yaratlmasnda kullanlmaktadr. Eer st pencere

    yaratlacaksa hWndParent parametresi NULL olarak, alt pencere yaratlacaksa hangi

    st pencerenin alt penceresi olduunu belirtmek iin st pencerenin handle deeri

    olarak girilmesi gerekir. skelet programda st pencere yaratlmas sz konusu olduu

    iin NULL deeri girilmitir.

    - HMENU hMenu

    Pencere menye sahip olabilir. Eer bu men WNDCLASS yaps ierisinde

    belirlenmemise burada belirlenebilir. skelet programda men olmad iin bu

    parametre NULL olarak girilmitir.

    - HANDLE hInstance

    WinMain fonksiyonundan alnan hInstance deeri bu parametreye girilmelidir.

    - LPVOID lpParam

    Pencere yaratldnda ek bir veri alan oluturmak istenebilir. Bu parametre

    bu alann balang adresini tutar. skelet programda NULL olarak girilmitir. Bu

    deer byle bir alann kullanlmayacan belirtir.

    CreateWindow Fonksiyonunun Geri Dn Deeri

    Fonksiyonun geri dn deeri pencere baarl bir biimde yaratlmsa

    pencerenin handle deeridir, baarszlk durumunda fonksiyon NULL deeri ile geri

    dner. skelet programda yaratlma ileminin baars kontrol edilmemitir. Aslnda

    bu ilemin baarsnn kontrol edilmesi tavsiye edilir. Pencerenin yaratldnda

    grntlenip grntlenmeyecei pencere biimindeki WS_VISIBLE parametresine

    baldr. skelet programda yaratlr yaratlmaz grntlenmemektedir.

    http://alikoker.name.tr

  • 14

    Yaratlm Pencerenin Grntlenmesi

    Bir pencere WS_VISIBLE pencere biimiyle yaratlmsa yaratlr yaratlmaz

    zaten grntlenir. Ancak deilse ShowWindow API fonksiyonu ile grntlenir.

    BOOL ShowWindow(HWND hWnd, int nExitCode);

    Fonksiyonun birinci parametresi grntlenecek pencerenin handle deeri,

    ikinci parametresi ise grntlenme biimidir. Grntlenme biimi

    SW_MAXIMIZE, SW_MINIMIZE, SW_RESTORE olabilir.

    (Bir fonksiyonun geri dn deeri BOOL ise baar bilgisinin verildii anlalr.

    BOOL deer mantksal olarak 0 ya da 0 d bir deer olarak deerlendirilir. rnein

    ShowWindow baarl ise 1'e deil 0 d herhangi bir deere geri dnmektedir.)

    Ana pencere yaratldktan sonra isel grntnn gncelletirilmesi iin

    WM_PAINT mesaj gerekebilir. Bunu salamak iin UpdateWindow API fonksiyonu

    arlr.

    skelet Programn Aamalar

    Pencereli bir Windows program tipik olarak 3 aamadan geilerek

    oluturulur.

    1. WNDCLASS yapsnn ii doldurularak sisteme tantlmas aamas,

    2. Pencerenin yaratlarak grntlenmesi aamas,

    3. Mesaj dgsnn oluturulmas ve pencere fonksiyonunun tasarm.

    Mesaj Kavram

    DOS iletim sisteminde klavye ve mouse bilgileri programcnn koda

    yerletirdii fonksiyonlar yardmyla elde edilir. rnein getchar() fonksiyonu

    klavyeden bir tua baslana kadar bekler, baslan tuun bilgisini alarak ilemini

    sonlandrr. Oysa Windows sistemlerinde klavye ve mouse gibi giri bilgileri

    programcnn ard bir fonksiyonla deil, Windows sistemlerinin kendisi

    tarafndan ilk elden alnr. Windows sistemlerinde sistem tarafndan tespit edilen girdi

    bilgilerine mesaj denir. Her girdi bilgisinin yani mesajn hangi nedenden dolay

    olutuunu aklayan bir tr vardr. rnein mesaj klavyede bir tua baslmasndan

    dolay olumu olabilir ya da mouse ile tek tklama ya da ift tklama sonucunda

    olumu olabilir. Windows oluan bu mesaj MSG yaps biiminde ifade ederek

    programn mesaj kuyruuna yerletirir. Her programn(32 bit Windows sistemlerinde

    aslnda her alt ilemin) bir mesaj kuruu vardr. Mesaj kuyruu aslnda MSG

    trnden bir yap dizisi biimindedir. MSG yaps yledir:

    typedef struct tagMSG { // msg

    HWND hwnd;

    UINT message;

    WPARAM wParam;

    LPARAM lParam;

    DWORD time;

    POINT pt;

    } MSG;

    http://alikoker.name.tr

  • 15

    MSG Yapsnn Elamanlar

    - HWND hWnd

    Her pencerenin bir mesaj kuyruu yoktur. Her programn bir mesaj kuyruu

    vardr. Yani bir program 10 tane pencere yaratm olsa bile bu pencerelerin herhangi

    birisinde oluan girdi ilemi ayn kuyrua yazlacaktr. Yapnn bu eleman programn

    hangi penceresine ilikin bir mesaj olutuunu belirtir.

    - UINT message

    Bu eleman mesajn hangi sebepten kuyrua yazldn anlatan bir say

    ierir. Bir mesaj yzlerce sebepten dolay kuyrua yazlabilir. Ancak mesajn

    nedenleri saysal dzeyde konuulmaz. Windows.h ierisinde tm bu saylar WM_ ile

    balayan sembolik sabitlerle tanmlanmtr. Yani rnein 108 numaral mesaj yerine

    WM_XXXXX mesaj biiminde durum ifade edilir.

    - WPARAM wParam

    LPARAM lParam

    WPARAM aslnda unsigned int trdr. Unsigned int tr 16 bit Windows

    sistemlerinde 2 byte uzunluundayd. Ancak 32 bit Windows sistemlerinde 4 byte'lk

    bir bilgidir. Burada W n eki 16 bit Windows sistemleri kullanlrken

    isimlendirilmitir. 32 bit sistemlere geildiinde bu isimlendirmenin kullanlmasna

    devam edilmitir. LPARAM unsigned long trdr ve her iki sistemde de 4 byte

    uzunluundadr. Bu elemanlara mesaja bal olan ek bilgiler yerletirilir. rnein

    WM_CHAR mesajnda wParam baslan tuun ASCII sra numarasn ierirken

    WM_LBUTTONDOWN mesajnda baslan noktann koordinat bilgisini iermektedir.

    Her mesaj iin bu elemanlara hangi bilgilerin yerletirildii ayrca renilmelidir.

    - DWORD time

    Mesajn gnderildii zaman bilgisidir.

    - POINT pt

    Bu eleman baz mesajlarda ekrana ilikin koordinat bilgisini tutmak

    amacyla kullanlr.

    Mesaj Dngs

    Mesajlar sistem tarafndan kuyrua yazlr, ancak bu mesajlarn alnarak

    ilenmesi programc tarafndan yaplr. Programc mesajlar alarak nce bu mesajlar

    anlamlandrr, daha sonra uygun ilemleri yapacak kodlar altrr. Programa ilikin

    pencere kapatlp program sonlandrlaca zaman bu ilem de Windows tarafndan

    WM_QUIT mesaj olarak kuyrua yazlr. Yani bir dng ierisinde mesajlarn

    srekli alnarak ilenmesi WM_QUIT mesaj grldnde de dng sonlandrlarak

    programn bitirilmesi gerekir.

    GetMessage Fonksiyonu

    GetMessage kuyrukta bulunan ilk mesaj alr ve bu mesaj kuyruktan siler.

    Fonksiyonun prototipi:

    http://alikoker.name.tr

  • 16

    BOOL GetMessage(

    LPMSG lpMsg,

    HWND hWnd,

    UINT wMsgFilterMin,

    UINT wMsgFilterMax

    );

    Fonksiyonun birinci paranmertesi MSG trnden bir gstericidir. Bu

    parametreye MSG trnden bir yapnn adresi geirilmelidir. GetMessage kuyrukta

    srada bulunan mesaj alarak bu yapnn ierisine yerletirir. kinci parametre

    programa ilikin hangi pencerenin mesajlarnn alnacan belirtir. Yani GetMessage

    ile zellikle bir pencereye ilikin mesajlar alnabilir. Bu parametre NULL girilirse

    btn pencerelere ilikin mesajlar alnr. Fonksiyonun nc ve drdnc

    parametreleri hangi aralktaki mesajlarn kuyruktan alnacan belirtir. rnein bu

    parametrelere 100 ve 120 girilirse yalnzca bu aralkta numaralara sahip olan mesajlar

    alnr. Eer bu iki parametreye 0 girilirse tm mesajlarn alnaca anlamna gelir.

    skelet programda tm mesajlar alnmaktadr. Fonksiyon eer WM_QUIT mesajn

    aldysa 0 deerine, WM_QUIT dndaki bir mesaj aldysa 0 d herhangi bir deere

    geri dner. GetMessage eer kuyrukta mesaj yoksa programn izelgeleme d

    braklp bloke edilmesine yol aar. Yani programc bak asyla programn ak

    GetMessage ierisinde beklemektedir. Kuyruktan srekli olarak mesaj alan

    WM_QUIT grnce ilemi sonlandran bir dng yle kurulabilir:

    while (GetMessage(&msg, NULL, 0, 0)) {

    ...........

    ..........

    .........

    }

    Mesaj dngsnden kldnda WinMain fonksiyonu da biter, bu fonkiyon

    bitince de program biter. GetMessage fonksiyonu ile mesaj alndktan sonra

    anlamlandrlp ilenmelidir, ancak prensip olarak mesajn mmkn olduu kadar

    abuk bir biimde ilenmesi istenir. Eer mesajn ilenmesi uzun srerse GetMessage

    bir sonraki mesaj kuyruktan alamaz. Bylece programda herhangi bir ilerleme sz

    konusu olamaz. Ancak yine de mesajn ilenmesini geciktirecek ciddi sebepler

    olabilir. O zaman programn aknn devam etmesi nasl salanacaktr? te alt ilemli

    programlama sistemi(multi-threading) bu tr problemlere zm bulmaktadr.

    Mesajlarn lenmesi ve Pencere Fonksiyonu

    Mesajlarn ilenmesi ismine pencere fonksiyonu denilen bir fonksiyon

    tarafndan yaplr. Kuyruktan mesaj alndnda DispatchMessage API fonksiyonu

    arlr. DispatchMessage fonksiyonuna parametre olarak kuyruktan alnan mesajn

    bulunduu deikenin adresi geirilmektedir. DispatchMessage mesajn hWnd

    elamanna bakarak mesajn hangi pencereye ilikin olduunu anlar. O pencere ilikin

    pencere fonksiyonunu arr. Bir pencere yapsnn parametrik yaps yle olmak

    zorundadr:

    http://alikoker.name.tr

  • 17

    LRESULT CALLBACK WndProc(

    HWND hWnd,

    UINT message

    WPARAM wParam

    LPARAM lParam

    );

    Fonksiyonun geri dn deeri LRESULT yani long olmak zorundadr.

    arma biimi __stdcall olmak zorundadr. Zaten CALLBACK sembolik sabiti

    __stdcall anlamna gelmektedir. DispatchMessage fonksiyonu mesaj alp mesaj

    ierisindeki hWnd, message, wParam, lParam elemanlarn ayrtrarak bu elemanlar

    pencere fonksiyonunun parametresi yapmak suretiyle pencere fonksiyonunu arr.

    Yani programn ak pencere fonksiyonumuzdan ktnda ak DispatchMessage

    ierisinden devam eder.

    Mesaj dngsnn ierisinde TranslateMessage API fonksiyonu da

    arlmaktadr. Bu fonksiyonun mesaj ilenme mekanizmasyla ciddi bir balants

    yoktur. ASCII tularna basldnda WM_CHAR mesajnn oluumunu salar.

    Pencere Fonksiyonunun Tasarm

    Bunun iin nce mesajn ne mesaj olduunun tespit edilmesi gerekir. Bu

    ilem bir switch deyimiyle yaplabilir. Daha sonra mesaj parametreleri yorumlanarak

    case ifadeleri ilenir.

    Windows Programnn Sonlandrlmas

    Bir Windows program programn ak mesaj dngsnden kp WinMain

    fonksiyonunun bitmesiyle sonlanr. Program aknn mesaj dngsnden kmas

    GetMessage fonksiyonunun 0 ile geri dnmesiyle salanr. GetMessage fonksiyonu

    WM_QUIT mesajn grdnde 0'a geri dner.

    DefWindowProc API Fonksiyonu

    Bir programn en basit ilemleri yapacak biimde salkl alabilmesi iin bir

    takm kritik mesajlarn ilenmesi gerekir. Oysa bunlarn ilenmesi ve bu mesajlara

    karlk default baz ilemleri yaplmas uzun bir ilem yk gerektirir. te

    DefWindowProc fonksiyonu bir mesaj iin default kritik ilemleri yapabilen bir

    fonksiyondur. Yani pencere fonksiyonu ierisinde mesajlar ilenir, ilenmeyen

    mesajlar bu API fonksiyon arlarak iletilir. O halde en basit bir pencere

    fonksiyonu yle tasarlanabilir:

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT, message, WPARAM wParam, LPARAM

    lParam)

    {

    return DefWindowProc(hWnd, message, wParam, lParam); } /*Tm mesajlar default olarak ilenecektir*/

    DefWindowProc fonksiyonunun gelen mesajlara kar hangi kritik ilemleri

    yapt baz tr ilemlerde programc tarafndan bilinmek zorundadr.

    lenen mesajlar iin DefWindowProc fonksiyonu arlmamaldr. O halde

    bu fonksiyon tipik olarak switch'in default ksmna yerletirilmelidir.

    http://alikoker.name.tr

  • 18

    Pencere Fonksiyonunun Geri Dn Deeri

    Pencere fonksiyonunun geri dn deeri DispatchMessage fonksiyonu

    tarafndan yorumlanr. Fonksiyonun geri dn deeri mesajdan mesaja deiir. Yani

    hangi mesaj geldiinde neyle geri dnlecei nceden bilinmek zorundadr. Ancak

    aksi sylenmedii srece pencere fonksiyonu eer mesaj ilemise 0 ile geri

    dnmelidir. lememise DefWindowProc fonksiyonunun geri dn deeriyle geri

    dnmelidir.

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT, message, WPARAM wParam, LPARAM

    lParam);

    {

    switch(message) {

    case .......... :

    ........

    ........

    break;

    case .......... :

    ........

    ........ break;

    default:

    return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

    }

    Pencerenin Kapatlmas Srasnda Gerekleen lemler

    Bir pencereye kapatmak iin klik yapldnda ya da klavye ile Alt+F4

    tularna basldnda Windows yalnzca mesaj kuyruuna WM_CLOSE mesajn

    brakr. Bu mesaja karlk DefWindowProc DestroyWindow API fonksiyonunu

    armaktadr. Bu API fonksiyonu pencereyi kapar ve mesaj kuyruuna

    WM_DESTROY mesajn koyar. WM_DESTROY mesaj genellikle programc

    tarafndan ilenir. Programc bu mesaj karlnda PostQuitMessage API

    fonksiyonunu armaldr(zaten DefWindowProc fonksiyonu da default olarak

    PostQuitMessage fonksiyonunu arr), bu fonksiyon yalnzca kuyrua WM_QUIT

    mesajn yerletirir. GetMessage fonksiyonu da bu mesaj alarak 0 ile geri dner ve

    WinMain sonlanr.

    http://alikoker.name.tr

  • 19

    Visual C++ Gelitirme Sisteminin Kullanlmas

    Windows altnda gelitirme ortamlarnda programlama sistemi karmak

    olduu iin mutlaka proje dosyas oluturularak allr. Uygun bir proje dosyas

    oluturabilmek iin File => New seilir. Eer Win32 Console Application seilirse

    konsol program yazlabilir. Bir konsol program tamamen DOS'teki bilgilerle

    yazlabilir. Ancak Windows'un grafik zellikleri kullanlamaz. Eer Win32

    Application seilirse API dzeyinde programlama yaplabilir. 6.0 srmnde iskelet

    program oluturan bir wizard da yerletirilmitir. Tm projeler iin ayr bir dizin

    alr ve proje dosyalar o dizin ierisine yerletirilir. Dizin proje ismiyle ayn isimde

    olur. Alan dizin ierisine projedeki btn kaynak dosyalar yerletirilir. Proje

    dizininin altnda res ve debug/release isimli iki dizin oluturulur(bu genellikle debug

    olur, program kaynak kullanmamsa res dizini almaz). Res dizini ierisinde kaynak

    kullanmna ilikin dosyalar bulunur. Debug/release'in ierisinde btn obj modller,

    exe dosyalar ve precompiled header dosyas bulunur. Precompiled header dosyas

    balk dosyalarn abuk analiz etmek iin gerekir, ok byk bir dosyadr. Bir projeyi

    diskete almak iin nce debug/release dizini silinmeli ve proje tm alt dizinleriyle

    beraber alnmaldr. Bir proje yaratldnda btn proje ilemleri ismine proje

    alma alan(project workspace) denilen bir pencere yardmyla yrtlr. Proje

    alma alan penceresi kapatlabilir(projenin kapand anlamna gelmez), daha sonra

    Alt+0 tular ile alabilir. Bir projenin tamamen kapatlmas iin File=>Close

    Workspace seilmelidir. Proje alma alan penceresinin 4 alt penceresi vardr.

    Class View: Burada btn C++'taki snflar C'deki fonksiyonlar listelenir.

    Buradaki bir elemann zerine double click yaplrsa o fonksiyonun

    tanmlamasnn bulunduu yere gidilebilir.

    File View: Burada projenin iindeki dosyalarn listesi bulunur. Bu pencere

    ayn zamanda projeye dosya eklemek ve projeden dosya karmak

    iin de kullanlr. Eklemek iin projenin zerinde sa fare tuuna

    baslp Add Files To Project seilerek yaplr.

    Resource View: Bu pencere program kaynak kullanyorsa yaratlr. Kaynak

    ilemleri bu pencereden izlenebilir.

    Info View: Yardm almakta kullanlr.

    Programn Derlenmesi ve altrlmas

    Editrdeki program Build=>Compile mensyle derlenir(Ctrl+F7). Proje

    ierisindeki btn dosyalar ve kaynak dosyasn derleyip hep beraber link ederek exe

    yapmak iin Build=>Build seilir(F7). Bu seenek yalnzca deimi olan dosyalar

    yeniden derler. Koulsuz btn dosyalar derleyip exe yapmak iin Build=>Rebuild

    seilir. Bir program altrmak iin Build=>execute seilir(Ctrl+F5). Tabii deien

    dosyalar bu arada tekrar derlenir. Bir projeyi amak iin File=>Open Workspace.

    Bir fonksiyonun pencere fonksiyonu olduunu belirtmek iin o fonksiyon

    isminin WndClass yapsnn lpfnWndProc elemanna yazlmas gerekir.

    http://alikoker.name.tr

  • 20

    Windows Programlamada Yardm lemleri

    Windows altnda programlama iin iyi bir yardm desteinin olmas gerekir.

    Visual C++ gelitirme ortamnn Online Book diye isimlendirilen bir yardm destei

    vardr. Visual C++ 6.0 srmnde yardm destei MSDN programnn ayrca install

    edilmesiyle salanr. Online Book ierisinde sistemin orijinal kitaplar

    bulundurulmaktadr.

    Mouse Mesajlar

    Bir pencerenin balk ksm kartlm blgesine alma alan(client area)

    denir. alma alannn sol st kegeni pek ok ilem iin orijin noktas belirtir.

    Mouse pencerenin alma alan ierisinde bir yerde tklandnda ve ekildiinde

    Windows mesaj kuyuruuna WM_LBUTTONDOWN, WM_RBUTTONDOWN,

    WM_LBUTTONUP, WM_RBUTTONUP mesajlarn ekler. Bu mesajlarn lParam ve

    lParam parametreleri u bilgileri ierir:

    wParam: Click yapldnda ayn zamanda bir tua baslp baslmadn belirtir.

    unlardan oluur:

    MK_CONTROL

    MK_LBUTTON

    MK_RBUTTON

    MK_MBUTTON

    MK_SHIFT

    lParam: Mouse'un click yapld pixel pozisyonudur. xPos = LOWRD(lParam);

    yPos = HIWORD(lParam);

    LOWORD ve HIWORD makrolar 32 bit bir bilginin yksek anlaml ve dk

    anlaml 2 byte'n elde etmek iin kullanlr. #define HIWORD(x) ((WORD) (x) >> 16)

    #define LOWORD(x) ((WORD) (x)) Bu makrolar windows.h ierisinde tanmlanmtr.

    MessageBox Fonksiyonu

    Windows'ta acil bir mesaj basmak iin MessageBox API fonksiyonu

    kullanlr. Bu fonksiyon ile pencere bal, pencerenin ierisindeki mesaj, istenen tu

    takm ve grntlenecek ikon belirlenebilir.

    int MessageBox(

    HWND hWnd,

    LPCTSTR lpText,

    LPCTSTR lpCaption

    UINT uType

    );

    Fonksiyonun birinci parametresi messagebox penceresinin kartlaca st

    pencerenin handle deeridir. Bu parametre NULL olarak girilebilir(messagebox

    yaratmak iin bir pencere yaratmak gerekli deildir). Yani programn hibir pencereyi

    olmasa bile messagebox kartlabilir. kinci parametresi pencerenin iine yazlacak

    http://alikoker.name.tr

  • 21

    yaznn balang adresini alr. nc parametresi pencerenin balk yazsn belirtir.

    Drdnc parametresi tu takm ve ikon grntsn belirler. Tu takmlar unlar

    olabilir:

    MB_ABORTRETRYIGNORE

    MB_OK

    MB_OKCANCEL

    MB_YESNO

    MB_YESNOCANCEL

    kon grnts unlar olabilir:

    MB_ICONEXCLAMATION

    MB_ICONWARNING

    MB_ICONINFORMATION

    MB_ICONASTERIKS

    MB_ICONQUESTION

    MB_ICONSTOP

    Tu takmyla ikon grnts bit OR ilemine sokularak birletirilebilir.

    rnein: MB_OK | MB_ICONEXCLAMATION

    Tu takmlarndan bir tanesi default olarak seilebilir. Default tu enter tuuna

    basldnda seilmi kabul edilen tutur. Default tuu belirlemek iin 3 tane sembolik

    sabit vardr:

    MB_DEFBUTTON1

    MB_DEFBUTTON2

    MB_DEFBUTTON3

    Bu sembolik sabitler de dierleriyle birletirilerek kullanlrlar. rnein:

    MB_YESNOCANCEL | MB_ICON_EXCLAMATION | MB_DEFBUTTON3

    Fonksiyonun geri dn deeri hangi tua baslarak pencerenin kapatld bilgisini

    verir. unlardan bir tanesi olabilir:

    ID_ABORT

    ID_CANCEL

    ID_IGNORE

    ID_NO

    ID_OK

    ID_RETRY

    ID_YES

    Mouse'un sol tuuna basldnda messagebox kartan uygulama:

    http://alikoker.name.tr

  • 22

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message,

    WPARAM wParam, LPARAM lParam)

    {

    switch (message) {

    case WM_DESTROY:

    PostQuitMessage(0); break;

    case WM_LBUTTONDOWN:

    MessageBox(hwnd, "Deneme", "Deneme", MB_YESNOCANCEL |

    MB_ICONSTOP | MB_DEFBUTTON2);

    break;

    default:

    return DefWindowProc(hwnd, message, wParam, lParam);

    }

    return 0;

    }

    Snf almas: Farenin sol tuuna basldnda yesnocancel messagebox' gzkecek,

    bunlardan bir tanesi seildiinde baka bi messagebox ile hangi tu'a basld

    yazdrlacak.

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message,

    WPARAM wParam, LPARAM lParam)

    {

    switch (message) {

    case WM_DESTROY:

    PostQuitMessage(0);

    break; case WM_LBUTTONDOWN:

    iMsgBoxReturnValue = MessageBox(hwnd, "Deneme yapyom ben",

    "Deneme dedik aaada", MB_YESNOCANCEL | MB_ICONSTOP |

    MB_DEFBUTTON2);

    switch (iMsgBoxReturnValue) {

    case IDYES:

    MessageBox(hwnd, "Yes'e bastn karde", "Deneme", MB_OK |

    MB_ICONSTOP);

    break;

    case IDNO:

    MessageBox(hwnd, "No'ya bastn karde", "Deneme", MB_OK |

    MB_ICONSTOP); break;

    case IDCANCEL:

    MessageBox(hwnd, "Cancel'a bastn karde", "Deneme", MB_OK |

    MB_ICONSTOP);

    break;

    }

    break;

    default:

    return DefWindowProc(hwnd, message, wParam, lParam);

    }

    return 0; }

    DestroyWindow Fonksiyonu

    CreateWindow fonksiyonu pencereyi yarattktan sonra pencereye ilikin btn

    bilgileri dinamik olarak tahsis ettii isel bir yapda saklar. Aslnda CreateWindow

    fonksiyonunun vermi olduu bu geri dn deeri bu isel yapnn balang

    http://alikoker.name.tr

  • 23

    adresidir. DestroyWindow fonksiyonu pencereyi ekrandan grntsel olarak siler ve

    CreateWindow fonksiyonu tarafndan dinamik olarak oluturulmu olan bu isel

    yapy da free hale getirir. DestroyWindow fonksiyonu DefWindowProc tarafndan

    WM_CLOSE mesajna kar otomatik olarak arlr. Tabii istenildii zaman

    programn ana penceresi kapatlmak isteniyorsa DestroyWindow programc

    tarafndan arlmaldr. DestroyWindow pencere grnts ekrandan sildikten sonra

    programcy haberdar etmek iin WM_DESTROY mesajn gnderir.

    DestroyWindow ayn zamanda pencerenin btn alt pencerelerini de DestroyWindow

    fonksiyonunu ararak siler. WM_DESTROY mesaj geldiinde pencere ve alt

    pencereler ekranda grnr deildir, ancak bunlara ilikin veri yaplar hala

    durmaktadr.

    BOOL DestroyWindow(HWND hWnd);

    Fonksiyon silinecek pencerenin handle deerini parametre olarak alr.

    WM_CREATE Mesaj

    Bu mesaj CreateWindow fonksiyonu tarafndan pencerenin yaratldn

    bildirmek amacyla gnderilir. Pencere yaratldnda yaplmak istenen ilk ilemler

    WM_CREATE mesaj ilenerek yaplabilirler. WM_CREATE mesaj gnderildiinde

    pencere henz grnr deildir(henz CreateWindow fonksiyonundan klmamtr).

    lParam parametresinde CREATESTRUCT isimli bir yapnn adresi bulunur. Bu

    yapnn ii CreateWindow tarafndan doldurulmutur ve faydal bilgiler iermektedir.

    Bu yap ierisindeki bilgilere u biimde eriilebilir:

    case WM_CREATE:

    {

    CREATESTRUCT *pStruct;

    pStruct = (LPCREATESTRUCT ) lParam;

    .............

    .............

    .............

    }

    break;

    SendMessage ve PostMessage Fonksiyonlar

    Mesaj kuyruuna mesajlar PostMessage fonksiyonuyla programc tarafndan

    bilinli olarak da braklabilirler. Tabii bu mesaj normal olarak kuyruun sonuna

    braklrlar. Mesajn kuyrua braklmasyla ilenmesi arasnda belli bir zaman kayb

    sz konusu olabilir. Yani PostMessage fonksiyonu pencere fonksiyonu ierisinde

    kullanldnda programn ak PostMessage fonksiyonundan kar, mesaj kuyruuna

    girilerek sradaki mesajlar ilenir. En sonunda kuyrua PostMessage ile programc

    tarafndan braklan mesaj alnarak ilenir. Oysa SendMessage fonksiyonu mesaj

    kuyrua brakmaz, dorudan pencere fonksiyonunu ararak hemen iler. Yani

    programn ak SendMessage'den ktnda mesaj ilenmi olur. Her iki fonksiyonun

    da parametrik yaps ayndr.

    http://alikoker.name.tr

  • 24

    LRESULT SendMessage(

    HWND hWnd,

    UINT Msg,

    WPARAM wParam,

    LPARAM lParam

    );

    BOOL PostMessage(

    HWND hWnd,

    UINT Msg,

    WPARAM wParam,

    LPARAM lParam

    );

    Fonksiyonlarn birinci parametresi mesajn gnderilecei pencerenin handle deeridir.

    Yani bu fonksiyonlar bu handle'a ilikin pencerenin yaratlmas srasnda belirtilen

    pencere fonksiyonunu arrlar. Fonksiyonlarn ikinci parametresi gnderilecek

    mesajn numarasdr. nc ve drdnc parametreler mesajn wParam ve lParam

    parametreleridir. PostMessage fonksiyonunun geri dn deeri BOOL trndendir,

    ilemin baarsn bildirir. Oysa SendMessage fonksiyonunun geri dn deeri

    arlan pencere fonksiyonunun geri dn deeridir.

    Kaynaklarn Program erisinden Kullanlmas

    Normal olarak kaynaklar rc uzantl bir text dosyas ierisine kaynak dili

    kullanlarak yazlrlar. Kaynak derleyicisi tarafndan derlenip res uzantl yaplrlar ve

    linker tarafndan PE formatndaki exe dosyann iindeki kaynak blmne

    yerletirilirler. Visual C++ gelitirme sisteminde rc dosyas proje dosyasna eklenirse

    bu ilemler otomatik olarak yaplr.

    Her kaynan kaynak dilinde nasl yazlaca nceden belirlenmitir ve belli

    bir syntax kural vardr. Ancak kaynaklarn programc tarafndan bu biimde

    yazlmas, yani kaynak dilinin renilmesi ok zahmetlidir. Bunun iin tm gelitirme

    sistemlerinde kaynaklar ismine kaynak editr(resource editor) denilen bir ortamda

    grsel olarak hazrlanrlar. Kaynaklar grsel olarak belirlendikten sonra gelitirme

    sistemi bunun kaynak dilindeki karln rc dosyas biiminde oluturur. Her

    kaynan bir ismi vardr. Bu isim alfabetik ya da saysal biimde verilebilir. Eer

    kaynak isminin ilk harfi alfabetik bir karakterle balyorsa kaynak alfabetik olarak

    isimlendirilmitir, saysal bir karakterle balyorsa kaynak saysal olarak

    isimlendirilmitir(Eer bir say alfabetik bir isim olarak kullanlacaksa ift trnak iine

    alnmaldr). Genel olarak saysal biimde isimlendirilmi kaynaklar ile daha hzl

    ilem yaplr. Bir kayna bir programn iinde kullanmak iin kayna hazr hale

    getirmek gerekir. Bu ilem srasnda kaynak exe dosyann kaynak blmnden alnr,

    bellekte dinamik olarak yaratlan bir veri yapsnn ierisine ekilir. kayna hazr hale

    getiren fonksiyonlarn isimleri Loadxxxx biimindedir. Kayna hazr hale getiren

    Loadxxxx fonksiyonlarnn iki parametresi vardr. Birincisi exe dosyann bellekteki

    ykleme adresi olan hInstance adresidir, ikincisi ise kaynan ismidir(Bu

    fonksiyonlarn exe dosyasnn kaynak blmne eriebilmesi iin exe dosyasnn

    bellekteki ykleme adresini bilmeleri gereklidir). Loadxxxx fonksiyonlarnn geri

    dn deerleri kaynaa ilikin handle deerleridir. rnein HCURSOR, HICON,

    HMENU biiminde olabilir(hepsi aslnda void *).

    http://alikoker.name.tr

  • 25

    Men Kaynann Kaynak Dilinde Oluturulmas

    Kaynak dilinde her kaynak nce kaynak ismiyle balar, sonra onu kaynan

    trn belirten bir anahtar szck izler, sonra kaynaklara gre deiebilen parametrik

    bilgiler yazlr. Bir men men ubuu ve popup menlerden oluur. Popup mennn

    ierisinde baka bir popup men bulunabilir. Bir men popup menlerden, popup

    menler de men elemanlarndan oluur. Kaynak derleyicileri C'nin n ilemci

    komutlarn ayn biimde kullanabilir. Popup menlerin bir numaras yoktur ama her

    men elemannn bir numaras olmak zorundadr. Men elemanlarnn numaralar

    istenildii gibi seilebilir(Ancak 100'den byk olmas tavsiye edilir). Ancak her

    men elemannn numaras dierinden farkl olmaldr.

    Kaynak dilinde yazlm kaynaklar eitli saylar kullanabilirler. Bu saylarn

    ayr bir balk dosyasnda sembolik sabit olarak tanmlanmalar nerilmektedir. Bu

    durumda kaynak kullanm iin bir rc dosyas, bir de h dosyas oluturulur. Bu rc

    dosyas ierisinden h dosyas include edilir. rnein Visual C++ gelitirme

    sisteminde bir kaynak dosyas yaratldnda otomatik olarak resource.h dosyas da

    yaratlr.

    Men Kaynann Program erisinden Kullanlmas

    Bir men kaynan programa dahil edebilmek iin yntem vardr:

    1. WNDCLASS yapsnn lpszMenuName elemanna men kaynak ismi girilirse

    men otomatik olarak grntlenir.

    2. WNDCLASS yapsnn lpszMenuName eleman NULL olarak girilirse men yine

    de CreateWindow fonksiyonunda yaratlabilir. Bunun iin nce LoadMenu

    fonksiyonuyla men kayna hazrlanr, sonra buradan alnan handle deeri

    CreateWindow fonksiyonunun hMenu parametresi olarak verilir.

    HMENU hMenu;

    hMenu = LoadMenu(hInstance, "SAMPLE_MENU");

    CreateWindow(.........................., hMenu, ......);

    3. Men CreateWindow fonksiyonundan sonra programn herhangi bir yerinde

    SetMenu API fonsiyonuyla da yaratlabilir.

    Alt Pencerelerle lemler

    Alt pencereler CreateWindow fonksiyonuyla yaratlrlar. Verilen koordinatlar

    st pencerenin alma alan(client area) referans alnarak oluturulurlar(st

    pencerelerin referans noktas masast penceresinin sol st kesidir). Alt pencere

    yaratlrken st pencerenin handle deerine gereksinim duyulur. Alt pencerelerin

    handle deerlerinin yansra bir de id deerleri vardr. Alt pencere id deerleri

    iaretsiz tam say biimindedir ve normal olarak WORD snrlar ierisindedir.

    CreateWindow fonksiyonunun dokuzuncu parametresi HMENU trndendir.

    HMENU parametresi st pencerelerde men ilemleri iin kullanlrken, alt

    pencerelerde pencere id deerinin belirlenmesi amacyla kullanlr. Tabii bu

    parametrenin alt pencere id'si olarak girilmesi durumunda tr dntrmesi yaplmas

    gerekir. rnein (HMENU) 100, ya da sembolik olarak (HMENU) CHILD_ID.

    Pencere id deeri WORD snrlarnda sfrdan farkl herhangi bir deer olabilir. Alt

    pencerelerin id deerleri aslnda tamamen programlamay kolaylatrmak amacyla

    http://alikoker.name.tr

  • 26

    dnlmtr. Hem handle deeri hem de id deeri her ikisi de bir pencereyi tehis

    etmek amacyla kullanlabilir. Ancak id deerinin tam say trnden olmas

    programlamada eitli biimlerde kolaylk salamaktadr. Zaten alt pencerenin handle

    deeriyle id deerinin bir tanesinin bilinmesi durumunda dierinin elde edilmesini

    salayan API fonksiyonlar vardr. Alt pencerelerin ve st pencerelerin farkl pencere

    fonksiyonlar olabilir. Alt pencereyle st pencerenin pencere fonksiyonlarnn farkl

    olabilmesi iin bu iki pencerenin farkl WNDCLASS yaplaryla yaratlmas gerekir.

    nk pencere fonksiyonunun belirlenmesi WNDCLASS ile yaplmaktadr. Bir

    program ierisinde ne kadar ok alt pencere ve st pencere yaratlm olursa olsun bu

    pencerelere ilikin mesajlar programn(aslnda alt ilemin(thread)) mesaj kuyruuna

    yerletirilirler. Yani her programn(aslnda alt ilemin) yalnzca bir tane mesaj

    kuyruu vardr, o programn yaratt btn pencerelere ilikin mesajlar ayn kuyrua

    yerletirilir. Programn tek bir mesaj dngs vardr. GetMessage fonksiyonu tm

    pencereler iin gnderilmi olan mesajlar alabilmektedir. Mesaj karlnda hangi

    pencere fonksiyonunun arlaca karar DispatchMessage fonksiyonu tarafndan

    verilir. DispatchMessage fonksiyonu mesajn hWnd parametresine bakarak

    pencerenin hangi WNDCLASS yapsyla yaratlm olduunu tespit eder ve buradan

    ilgili pencere fonksiyonunu bularak arr. DestroyWindow fonksiyonu ile st

    pencere yok edilince DestroyWindow fonksiyonu nce alt pencereleri yok eder, daha

    sonra ilgili pencereyi yok eder.

    Uyar: DefWindowProc fonksiyonu WM_CLOSE mesaj ilenmemise default olarak

    DestroyWindow fonksiyonunu arr. Ancak WM_DESTROY iin

    PostQuitMessage'i armaz. Eer WM_DESTROY mesaj ile PostQuitMessage

    arlmamsa pencere silinir ama program sonlanmaz.

    st ve Alt Pencereler Aras Mesaj Al-Verii

    SendMessage ve PostMessage fonksiyonlaryla st pencere alt pencereye, alt

    pencere de st pencereye mesaj gnderebilir. Aslnda bu fonksiyonlarla handle deeri

    bilindikten sonra her trl pencereye mesaj gnderilebilmektedir.

    Alt Pencere Nerede Yaratlmal?

    Alt pencere st pencere yaratldktan sonra herhangi bir yerde yaratlabilir.

    Ancak uygulamalarda bu ilem genellikle iki biimde yaplr:

    1. nce CreateWindow ile st pencere yaratlr. Bu kodun aasnda yine

    CreateWindow ile alt pencere yaratlr.

    2. Alt pencere st pencerenin pencere fonksiyonu ierisinde WM_CREATE

    mesajnda yaratlr. Tabii burada hInstance deerinin WinMain fonksiyonundan bir

    biimde elde edilmesi gerekir. hInstance deerinin herhangi bir yerden elde edilmesi

    iin birka yntem vardr. En fazla kullanlan yntem bu deerin WinMain ierisinde

    global bir deikene tanmasdr.

    WM_USER Mesajlar

    Windows'un nceden belirlenmi olan WM_ mesajlar 0 ile 0x0400 arasnda

    bulunmaktadr. Ancak programc isterse kendi mesaj numaralaryla da ilem

    yapabilir. Bunun iin windows.h ierisinde tanmlanm olan WM_USER deerinden

    0x7FFF'e kadar olan mesajlar kullanlmaldr. WM_USER sistem tarafndan ilenen

    http://alikoker.name.tr

  • 27

    bir mesaj deildir. Yalnzca programcnn kullanabilecei mesaj numarasnn nereden

    balayacan anlatan bir sembolik sabittir.

    Alt Pencere Biimleri

    CreateWindow fonksiyonunun ikinci parametresi olan pencere biimi eer alt

    pencere sz konusuysa en azndan WS_CHILD iermelidir. Ancak WS_BORDER

    eklenmezse pencerenin snr izgisi grnmez. Genellikle alt pencereler iin balk

    kullanlmaz. Ancak WS_CAPTION pencere biimi eklenirse pencere balk ksmna

    sahip olabilir.

    WS_VISIBLE Pencere Biimi

    ster st pencere ister alt pencere sz konusu olsun eer pencere biimi olarak

    WS_VISIBLE seilirse pencere yaratlr yaratlmaz pencere grntlenir. Eer

    WS_VISIBLE kullanlmazsa grntleme ilemi iin ShowWindow fonksiyonunun

    arlmas gerekir.

    GetClientRect API Fonksiyonu

    Bir pencereyle ilgili ilem yaplrken rnein alt pencere koordinatlarnn

    belirlenmesi ya da izimler sz konusu olduunda orijin noktas alma

    alannn(client area) sol st kesidir. Pencere boyutunun deitirilmesi durumunda

    alma alannn sa alt kegeninin koordinatlar da deiir. GetClientRect

    fonksiyonu alma alannn sa alt kegeninin koordinatlarn elde etmekte

    kullanlr. Bu koordinatn elde edilmesiyle pencerenin genilik ve ykseklik bilgisi

    elde edilmi olur. Prototipi:

    BOOL GetClientRect(

    HWND hWnd,

    LPRECT lpRect

    );

    Kullanm: LPRECT rect;

    GetClientRect(hWnd, &rect);

    Fonksiyonun ikinci parametresi RECT trnden bir yap deikeninin adresini alr.

    RECT yaps windows.h ierisinde yle bildirilmitir:

    typedef struct tagRECT{

    long left, top, right, bottom;

    } RECT *LPRECT;

    GetClientRect fonksiyonu ile elde edilen dikdrtgensel koordinatn sol st kegeni

    her zaman 0, 0 olur. Zaten bu fonksiyon sa alt kegenin elde edilmesi iin

    kullanlr.

    WM_SIZE Mesaj

    Windows bir pencerenin boyutunun deitirildii bir durumda mesaj

    kuyruuna bu mesaj brakr. Pencerenin boyutu ke noktalarndan mouse ile

    http://alikoker.name.tr

  • 28

    ekildiinde ya da maximize, minimize, restore tularna basldnda deimektedir.

    Mesajn wParam ve lParam parametreleri yle yerletirilir: Width = LOWORD(lParam); /*rect.right*/

    Hight = HIWORD(lparam); /*rect.bottom*/

    wParam parametresi u deerleri alabilir:

    SIZE_MINIMIZED

    SIZE_MAXIMIZED

    SIZE_RESTORED

    MoveWindow API Fonksiyonu

    CreateWindow fonksiyonu ile belirlenen koordinat pencerenin ilk alma

    grntsne ilikindir. Bunun dnda pencerenin boyutu eitli biimlerde

    deitirilebilir. MoveWindow fonksiyonu hem pencerenin boyutunu deitirmekte

    hem de onu telemekte kullanlabilir. Prototipi:

    BOOL MoveWindow(

    HWND hWnd,

    int x,

    int y,

    int nWidth,

    int nHeight,

    BOOL bRepaint

    );

    Fonksiyonun birinci parametresi ilgili pencerenin handle deeri, x, y, nWidth ve

    nHeight parametreleri pencerenin yeni konumunun bilgileridir. Fonksiyonun son

    parametresi tanan pencerenin grntsnn gncellenmesiyle ilgilidir. Bu parametre

    genellikle TRUE olarak verilir. Bu durumda gncelleme ilemi hemen yaplr.

    Kontroller

    Windows sistemi tarafndan tanmlanm olan bir grup alt pencere sistemine

    kontrol denir. Kontroller; temel kontroller ve gelimi kontroller biiminde ikiye

    ayrlr. Temel kontroller unlardr:

    Static kontrol

    Push button kontrol

    Edit box kontrol

    List box kontrol

    Check box kontrol

    Radio button kontrol

    Combo box kontrol

    Scroll bar kontrol

    Gelimi kontroller unlardr:

    Toolbar kontrol

    Tree kontrol

    Status bar kontolr

    Proggress bar kontrol

    http://alikoker.name.tr

  • 29

    Column kontrol

    Property sheet kontrol

    Tab kontrol

    ...

    Windows sistemi yklenirken bir grup WNDCLASS yapsn eitli isimlerle sisteme

    register eder. Bu snf isimleri alt pencere yaratmakta kullanlrsa pencere fonksiyonu

    snf ile belirtilen fonksiyonlar olur. Bu snflarn pencere fonksiyonlar user32.dll

    ierisindedir ve programcdan gizlenmitir. Bu snflar kullanlarak alt pencere

    yaratldnda bu pencere iin gnderilen mesajlar programcnn deil bu snflarn

    pencere fonksiyonu tarafndan ilenir. rnein kontrol snflarna ilikin bir pencere

    yaratlp mouse ile zerine click yaplsa mouse mesaj programn mesaj kuyruuna

    braklacak ancak DispatchMessage kotroln pencere fonksiyonunu aracaktr.

    Static Kontrol

    Bu kontrol yalnzca bir alt pencerenin zerine yaz grntlemek iin

    kullanlr. Static kontrol penceresinin zemin ve yaz renkleri ileride ele alnacaktr.

    Static kontrol penceresinin zemin rengiyle st pencerenin zemin rengi ayn alnrsa bu

    kontrol bir pencereye yaz yazmak amacyla kullanlr. Bu kontrol yaratmak iin

    CreateWindow fonksiyonunda snf ismi yerine "static" girilir. Pencere kordinatlar

    yaznn yazlaca pencerenin koordinatlardr. Pencerenin ierisine yazlacak yaz

    CreateWindow fonksiyonunun pencere bal yazsdr.

    (WM_SIZE mesaj bir pencere ilk kez grntlendii zaman da gnderilmektedir.)

    Static Kontrolnn zel Pencere Biimleri

    Her pencere iin ortak olan pencere biimlerinin yan sra her kontroln ayr

    yalnzca o kontrol iin anlaml olan zel pencere biimleri de vardr. Static kontrol

    iin en nemlileri unlardr:

    SS_LEFT

    SS_RIGHT

    SS_CENTER /*Bunlar yaznn hizalanmasna ilikindir.*/

    SS_WHITERECT

    SS_BLACKRECT

    SS_GRAYRECT /*Bunlar static kontrolnn zemin rengine ilikindir.*/

    Ancak bu renkler mutlak deil greli renklerdir. Denetim

    masasndaki renklendirmeye bal olarak deiirler.

    SS_WHITEFRAME

    SS_BLACKFRAME

    SS_GRAYFRAME /*Kontroln snr izgilerinin rengine ilikindir.*/

    Not: Bir pencerenin double-click mesajlarn kabul edebilmesi iin snfn yaratld

    WNDCLASS yapsnn UINT Style elemann CS_DBLCLKS olarak belirtmek

    gerekir.

    http://alikoker.name.tr

  • 30

    Pushbutton Kontrol

    Bu kontrol bir ilemi balatmak ya da iptal etmek gibi amalarla kullanlr. Bu

    kontrole yaplan en nemli hareket tek click ilemidir. Kontrole tek click yapldnda

    grntsel olarak basma ve ekme hareketi elde edilir. Her ne kadar pushbutton

    kontrol zerine ift click ilemi tanmlanm olsa da uygulamada kullanlmas

    tavsiye edilmemektedir. Tu grntsnn baslm olmas ya da ekilmi olmas

    grnts programlama yoluyla ayr ayr elde edilebilir. Ancak baslm durumda

    kalm olan bir tu grnts tercih edilmemektedir.

    Pushbutton kontroln yaratabilmek iin snf ismi olarak "button" girilir.

    Ancak button snf dier baz kontroller iin de kullanldndan yaratlan kontroln

    bir pushbutton olup olmad CreateWindow fonksiyonunun pencere biimi

    parametresiyle verilir. CreateWindow fonksiyonunun pencere bal yazs tu

    grntsnn zerinde yer alr. Button snf iin zel pencere biimleri unlardr:

    BS_PUSHBUTTON Bu pencere biimi pushbutton kontrol iin zorunlu

    olarak kullanlr.

    BS_DEFPUSHBUTTON Eer bir grup pushbutton kontrol arasnda klavye

    oda(input focus) bu pushbutton kontrollerinin

    hibirinde deilse enter tuuna basldnda

    DEFBUSHBUTTON ile belirtilen pushbutton

    kontrolne click yaplm varsaylr.

    Pushbutton Kontrolnn st Pencereye Gnderdii Mesajlar

    (Pushbutton Notification Messages)

    Pushbutton kontrol mouse ile kontroln zerine click yapldnda

    SendMessage fonksiyonuyla st pencerenin pencere fonksiyonunu WM_COMMAND

    mesajyla arr. Bunun dnda tavsiye edilmemesine karn ift click ileminde de

    bu kontrol st pencerenin pencere fonksiyonunu ayn biimde armaktadr.

    WM_COMMAND Mesaj

    WM_COMMAND mesaj iki durumda arlmaktadr.

    1. Menden bir eleman seildiinde lParam 0, HIWORD(wParam) 0 ve

    LOWORD(wParam) men elemannn ID deeri olur.

    2. Bu mesaj Windows sisteminin standart kontrollerinde bir olay gerekletiinde st

    pencereyi haberdar etmek iin de kullanlr. Bu durumda lParam alt pencerenin handle

    deerine, HIWORD(wParam) mesajn ne sebeple gnderildiine ait koda(notification

    code), LOWORD(wParam) alt pencerenin ID deerine sahip olur. Bu durumda alt

    pencerede bir olay gerekletiinde bu olayn nedenini anlayarak uygun kodlar

    altrmak iin WM_COMMAND mesaj ilenmelidir.

    WM_COMMAND mesaj ierisinde HIWORD(wParam) ve

    LOWORD(wParam) deerlerine istenilen bir srada baklmaldr.

    LOWORD(wParam) deerinin kontrol edilmesiyle mesajn hangi kontrolden geldii

    tespit edilebilir. HIWORD(wParam)'a baklarak da mesajn hangi nedenle geldii

    tespit edilir.

    http://alikoker.name.tr

  • 31

    ok fazla kontrol iin WM_COMMAND mesajnn ilenmesi programlama

    asndan zordur. Bunun iin WM_COMMAND mesajnn ilenmesi daha sistematik

    bir biimde yaplabilir. rnein i ie switch'ler kullanlabilir.

    case WM_COMMAND:

    switch(LOWORD(wParam)) {

    case ID1:

    switch(HIWORD(wParam) {

    .......

    ....... .......

    }

    case ID2:

    switch(HIWORD(wParam) {

    .......

    .......

    .......

    }

    .......

    .......

    } break;

    Ancak i ie switch'ler yerine fonksiyon armalaryla daha okunabilir bir yap da

    elde edilebilir.

    case WM_COMMAND:

    switch(LOWORD(wParam)) {

    case ID1:

    HandleCtrl1(HIWORD(wParam);

    break;

    case ID2:

    HandleCtrl2(HIWORD(wParam);

    break;

    .......

    .......

    } break;

    Bu rnekte programc her kontrol iin bir fonksiyon tanmlamtr. Fonksiyonlarn

    parametresi kontrol zerinde gerekletirilen eyleme ilikindir.

    Menden bir elemann seilmesi srasnda ve bir kontrol zerinde bir eylemin

    gerekletirilmesi durumunda her ikisi iin de WM_COMMAND mesaj arldna

    gre bu durum bir karkla yol aabilir. Eer men elemannn ID deeriyle

    kontroln ID deeri ayn alnrsa mesajn ne sebepten geldii anlalamayabilir.

    Bunun iin en pratik zm bu ID deerlerinin farkl alnmasdr. Eer farkl

    alnmazsa bu kontrol WM_COMMAND mesaj ierisinde ayrca yaplamldr.

    case WM_COMMAND:

    if (lParam) {

    ....../*Kontrol mesaj*/

    }

    else {

    ....../*Men mesaj*/

    }

    http://alikoker.name.tr

  • 32

    WM_COMMAND mesaj ilendiinde pencere fonksiyonu 0 deeriyle geri

    dnmelidir.

    Pushbutton Kontrolnn st Pencereye Gnderdii Mesajlarn lenmesi

    Eer HIWORD(wParam) aadaki deerlerden bir tanesi ise ilgili olaylar

    gereklemitir:

    BN_DBLCLK ift click yaplmtr.

    BN_CLICKED Tek click yaplmtr.

    st Pencerenin Pushbutton Kontrolne Gnderdii Mesajlar

    Pushbutton kontrolnn eitli grntsel ve ilevsel ilemleri yapabilmesi

    iin st pencere kontrole mesaj gnderebilir. Bu mesajlar unlardr:

    BM_CLICK Eer bu mesaj pushbutton kontrolne gnderilirse sanki mouse ile tek

    click yaplm gibi bir ileme yol aar. Bu durumda pushbutton kontrol yine

    WM_COMMAND ile st pencerenin pencere fonksiyonunu aracaktr. Bu mesajn

    wParam ve lParam parametreleri 0 girilmelidir.

    BM_SETSTATE Mesaj

    Bu mesajla lParam parametresine 0 verilir, wParam ya 0 ya 1 olur.Eer 1

    verilirse baslma grnts 0 verilirse ekilme grnts oluur. Yalnz bu durum

    sadece grnt zerinde etkili olur. Pushbutton bu mesaj alnca st pencereye

    BN_CLICK bilgisi gndermez.

    BM_GETSTATE Mesaj

    Bu mesajla wParam ve lParam 0 olarak girilir. Bu mesaj gnderildiinde

    SendMessage fonksiyonunun geri dn deeri pushbutton kontrolnn durumu

    hakknda bilgi verir.

    Edit Kontrol

    Bu kontrol bir yaznn klavyeden girilerek elde edilmesi iin kullanlr. Edit

    kontroln yaratabilmek iin CreateWindow fonksiyonunda snf ismi "edit" olarak

    girilmelidir. Edit kontrol tek satrl veya ok satrl olabilir. Pencere bal olarak

    belirlenen yaz edit alannn iine balangta yazlr. Edit kontrol bir editrn

    yapabilecei her trl ilemi gerekletirebilen bir kontroldr. rnein kendi

    ierisinde btn zel tulara duyarldr, undo zellii vardr, clipboard zellii vardr.

    Edit Kontrolnn zel Pencere Biimleri

    Edit kontroln yaratrken WS_ biimindeki genel pencere biimlerine ek

    olarak ES_ ile balayan eitli pencere biimleri de kullanlabilir.

    ES_LEFT,

    ES_RIGHT,

    Kontrol ierisindeki yazsn hizalanmasn salamak iin

    kullanlrlar.

    http://alikoker.name.tr

  • 33

    ES_CENTER

    ES_UPPPERCASE,

    ES_LOWERCASE

    Kontrol ierisine yazlanlarn tamamn byk/kk harf

    olacak ekilde yazlmasn salamak iin kullanlr.

    ES_READONLY Klavye kullanlarak kontrol ierisine birey yazlamaz.

    ES_PASSWORD Yazlanlarn grntlenmemesini salayarak geri almakta

    kullanlr.

    ES_AUTOHSCROL,

    ES_AUTOVSCROLL

    Yatay ve dikey scroll ilemlerine olanak salar.

    ES_MULTILINE Eer bu pencere biimi kullanlmazsa default olarak edit

    kontrol tek satrl olur.

    st Pencerenin Edit Kontrolne Gnderdii Mesajlar

    1. Edit kontrolndeki yaznn elde edilmesi

    Bu ilem iin edit kontrolne EM_GETLINE mesaj gnderilir. Bu mesajn

    wParam parametresi 0 olaral girilmelidir. Bu mesaj alan edit kontrol yazy lParam

    parametresiyle belirtilen adrese kopyalar. Ancak sonuna NULL karakter eklemez,

    NULL karakterin programc tarafndanh eklenmesi gerekir. Bu mesaj gnderildiinde

    SendMessage fonksiyonu kopyalama yapt yaznn karakter uzunluuyla geri dner.

    Ancak kullanc edit kontrolne ok fazla bilgi girmi olabilir. Bu durumda bilginin

    kopyalanaca karakter dizisinin uzunluu ne olacaktr? Kukusuz en iyi zm baka

    bir mesajla nce satrdaki karakter saysn almak, sonra dinamik bir dizi tahsis ederek

    tm bilgiyi ekmek olabilir. Ancak bu ilemin program yk fazladr. Bir gsterici

    hatasna yol amamak iin edit kontrolne kopyalanacak maksimum karakter says

    belirtilebilir. Bunun iin EM_GETLINE mesajn gndermeden nce kopyalanacak

    maksimum karakter saysn belirtmek iin kopyalanacak karakter dizisinin ilk iki

    byte'na WORD formunda bir say girmek gerekir. Bu durumda bir edit kontrolndeki

    bilginin elde edilmesi iin u kalp kullanlabilir.

    #define SIZE 100

    char buf[SIZE];

    *(WORD *)buf = SIZE - 1;

    n = SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)buf);

    buf[n] = '\0';

    2. ok Satrl Edit Kontrolnde Toplam Satr Saysnn Elde Edilmesi

    EM_GETLINECOUNT mesaj wParam 0, lParam 0 parametreleriyle arlr.

    SendMessage fonksiyonunun geri dn deeri olarak toplam satr says olarak alnr.

    n = SendMEssage(hEdit, EM_GETLINECOUNT, 0, 0L);

    3. Bir Satrdaki karakter Saysnn Elde Edilmesi

    lk satrn sra numaras 0 olmak zere edit kontrol satrlar biiminde

    organize edilmitir. Bir satrdaki karakter saysnn elde edilmesi iki ilemle

    gerekleir:

    a. Karakter says bulunacak satrn ilk karakterinin index numarasnn bulunmas.

    Edit kontrol ierisindeki her karakterin bir index numaras vardr. Kontrol

    ieridindeki ilk karakterin index numaras 0 olmak zere, her karakterin index

    http://alikoker.name.tr

  • 34

    numaras artan bir sraya sahiptir. Bunun iin EM_LINEINDEX mesaj kullanlr.

    Mesaj parametreleri:

    wParam = satr no

    lParam = kullanlmyor(0)

    Fonksiyonun geri dn deeri ilgili satrn ilk karakterinin index numarasdr. Eer

    satr numaras olarak -1 verilirse edit imlecinin bulunduu satrn ilk karakterinin

    index numaras elde edilir.

    b. Karakter says bulunacak satrn ilk karakterinin index numaras elde edildikten

    sonra EM_LINELENGTH mesajyla satrn karakter says elde edilir. mesaj

    parametreleri:

    wParam = index no

    lParam = kullanlmyor(0)

    Eer index numaras olarak -1 girliirse o zaman seim yaplm olan satrdaki

    seilmemi eleman saysna geri dner. Eer seim yaplmamsa imlecin bulunduu

    satrdaki toplam karakter saysna geri dner.

    O halde n'inci satrdaki karakter uzunluunu elde edilmesi iin unlar

    yaplmaldr:

    {

    int index, numberOfChar;

    index = SendMessage(hEdit, EM_LINEINDEX, n, 0);

    numberOfChar = SendMessage(hEdit, EM_LINELENGTH, index, 0);

    }

    4. Pencerenin alma alann tamamen kaplayacak bir edit kontrolnn oluturulmas.

    Bunun iin nce edit kontrol CreateWindow ile yaratlr, yaratldktan hemen

    sonra WM_SIZE mesaj geleceine gre koordinat bilgisi olarak (0, 0, 0, 0) girilebilir.

    Bundan sonra WM_SIZE mesaj ile MoveWindow fonksiyonu kullanlarak

    boyutlandrma tekrardan yaplr.

    WM_SIZE:

    MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);

    break;

    5. Edit kontrolnn ieriinin deiip deimediinin tespit edilmesi.

    zellikle edit kontrolndeki bilginin saklanaca zaman byle bir bilgiye

    gereksinim duyulur. Bunun in EM_GETMODIFY mesaj kullanlr. Mesajn

    parametreleri:

    wParam = 0

    lParam = 0

    Fonksiyonun geri dn deeri 0 ise deiiklik yok, sfr d herahngi bir deerse

    deiiklik var anlamna gelir.

    6. Edit kontrolnn scroll yaplmas.

    Bunu