Upload
uemit-yildirim
View
3
Download
0
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