Ŀ
                                                                     ĿĿ 
                                                                       ĿĴ
                                                                         Ŀ
            WINDOWS'ta PROGRAM YAPMA                                       
                                              Ŀ           
                                                             Ŀ         
͵   Cem Payaslolu   ;
                                             Ŀ                 
                                               


1.1 Windows Hakknda


Windows giderek popler hale gelmekte. Belli bal yazlm firmalar DOS
temelli yazlmlarn Windows ortamna tayorlar. ok grevlilik, uygulamadan
bamsz src destei, farkl uygulamalar arasndaki bilgi al-verii ve
standard ilem becerisi Windows'u ekici klyor. Ancak Windows iin program
yazmada birok zorluklar mevcut. ncelikle tam anlamyla kusursuz bir Windows
yazlmn gerekletirmek iin Windows API (Application Programming
Interface, "Uygulama Program Arabirimi")'n yaklak 600 fonksiyonunun
nerede, ne zaman kullanlacan iyi bilmek art. Olduka karmak olan bu
fonksiyonlara ilaveten Windows tamamen mesaj-temelli bir ortam. Baka bir
deyile tm Windows elemanlar pencereler, diyalog kutular, bitmap ve menler
birbirlerinden ve sistemden mesaj alp veriyorlar. Bu mesajlar bir fare
tklatlmas, bir men eleman seimi veya klavyeden karakter gnderimi
olabilecei gibi program modlleri ve fonksiyonlarda mesaj olayn
balatabiliyor.



1.2 Kaynak Kitaplar


Windows'un olduka karmak bir programlama ortam olmas nedeniyle, Windows
iin program yazmak isteyenlere zellikle;

    1."Programming Windows 3.1",Charles Petzold,
       Microsoft Press (Disketle birlikte)

    2."Windows Programming An Introduction", William H.Murray III ve Chris
       Pappas, Osborne Mc-Graw-Hill

kitaplarn almalar tavsiye olunur. lerki aamalarda Microsoft'un "Microsoft
Programming Reference", Microsoft Press yayn mutlaka gerekiyor.



1.3 Derleyici ve Program Gelitirme Aralar


Bir Windows uygulamas yazabilmek iin ya Microsoft C 6.0 (7.0 da olur
tabi) derleyici + SDK (SoftWare Development Kit) veya Borland C++ 2.0
veya st gerekmektedir. Uygulama Pascal ve assembly dilinde de
gelitirilebilmekteyse de, bunlarn ilave zorluklar nedeniyle C dili
kullanlmaktadr. Bu uygulamada Borland C++ 2.0  +  WhiteWater Resource
Toolkit (WRT) kullanlmtr. st versiyonlarda yerini Resource Workshop'a
brakan WRT'de programn kulland tm menler, diyalog kutular, ikon ve
bitmapler oluturulur. Bunlar RC dosyas olarak veya (.ICO,.BMP,.DLG)
uzantl olarak kaydedilirler. Ancak ikinci durumda bunlarn bir .RC
uzantl dosya iinde rnein #include"fx.dlg" gsterilmeleri gerekir. .RC
dosyas C kaynak kodlu dosyalarla birlikte derlendiinde bir RES uzantl
dosya oluur. Bu dosyada bilahare .C uzantl dosyalarn derlenmesinden
oluan EXE dosyaya ilave edildiinde, nihai olarak bir Windows executable
(altrlabilir) dosyas oluur. Ancak bir Windows  '.exe' dosyas
oluturmak iin sadece bunlar yetmeyip ayrca derleyiciye kodun bir
Windows uygulamas olduunu tanmlayan bir modl tanmlama dosyas
gerekmektedir (.DEF uzantl).

Bu uygulamada yukarda belirtilen zorluklar bir lde giderebilmek ve
program gelitirme zamann ksaltmak iin ProtoGen 2.0
(PrototypeGenerator) adl kod retici kullanlmtr. ProtoGen ortamnda
menu elemanlar, diyalog kutular tanmlandktan sonra istenirse test
edilir ve bilahare:

        a.ANSI C

        b.Borland C++

OWL (Object Windows) kaynak kodu retilir. Bu ekilde analist/programc
Windows'un menlerinin, hzlandrc tularnn, diyalog kutularnn ve
hatta ikonlarnn ana programa montajyla uramak zorunda kalmaz.
Bununla beraber ProtoGen giri/k, mesaj alma/gnderme
fonksiyonlarn yani esas API fonksiyonlarn kendisi retmez. Bunlar
uygun yerlere programc koymaldr.



1.4 Uygulama


Uygulamada 'Start' ve 'Quit' isimli iki men tanmlanmtr. Start seilince
bir diyalog kutusu belirmektedir. Burada kullanc 'dolar', 'mark' (DM) veya
pound seeneklerinden birisini iaretleyip, daha sonra 'buy' veya 'sell' adl
radyo dmelerinden birini seer. Daha sonra bilgi giri kutusuna 'Yorum'
kelimesini girince, program bu seenekleri deerlendirip ilgili dosyann
ieriini ekrana (zr dilerim pencereye) yazmaktadr. rnein 'DM' ve
'sell' seildiinde program "DMSAT.DOC" dosyasnn ieriini ana pencereye
yazar. Windows programclnda geleneksel printf(), puts(), scanf(), gets()
gibi giri/k fonksiyonlarnn yerini Windows API fonksiyonlar
almaktadr. ProtoGen bu fonksiyonlar kendisi retmez. Bunlar ilgili
mesaj numaralarnn/tanmlamalarnn karsna bizim yazmamz
gerekecektir. Burada giri ortamn diyalog kutusu fonksiyonu
salamaktadr.



1.5 Windows Notasyonu


lk defa Windows altnda uygulama gelitirmek isteyen bir kii, tecrbeli
bir C programcs olsa bile Windows iin program gelitirmede
zorlanacaktr. Windows ortam sadece 600 civarnda fonksiyondan ibaret
olmayp C'deki int, char, float gibi veri tiplerine ilaveten HANDLE, HWND,
LPSTR v.b gibi yeni veri tipleri kullanmaktadr. Buna ilaveten notasyon da
farkllamaktadr. Windows kaynak kodu Charles Simonyl isimli Macar
asll programcnn buluu olan 'Macar' notasyonu ilkesine dayanmaktadr.
rnegin 'wParam' isimli bir degikenin bandaki 'w' bunun bir WORD tipi
deiken olduunu, rneimizdeki fnFX_RESOURCE(...) bandaki 'fn' bunun
bir fonksiyon olduunu tanmlar.

DOS temelli C programlarndaki ana program giri fonksiyonu olan
main()'in Windows kart WinMain() fonksiyonudur. Bu fonksiyon
uygulamann window snfnn tanmlanmas, balang deerlerinin
verilmesi (initializations), uygulama mesaj kuyruunun (message queue)
balatlmas ve programdan k ilemlerinden sorumludur.



1.6 Proje Dosyas ve Modller


Bu uygulama Borland C++ 2.0 IDE (Integrated Development Environment)
altnda FX.PRJ(Proje dosyas) 'compile/build all' komutuyla derlenmitir.
FX.PRJ proje dosyasnda iki adet .C uzantl modl (FX.C ve FX_RESOU.C), bir
adet .DEF uzantl tanmlama modl (FX.DEF), bir adet kaynak derleyici .RC
uzantl FX.RC dosyas mevcuttur. Daha nce belirttiimiz gibi FX.RC
dosyasnda Windows API mesaj ve fonksiyonlar .C dosyalarnda
tanmlanmakta, FX.DEF dosyasnda Windows uygulamasnn sistem
gereksinimleri belirtilmektedir.

FX.C dosyasnn en nemli esinin WinMain fonksiyonu olduunu
belirtmitik. Programa balang noktas olan bu fonksiyon Windows'tan 4
parametre alr. Bunlar uygulamann zamanlama tutana (hInstance), bir
nceki uygulama tutana (hPrevInstance), uygulamann komut satr
argumanna bir iareti (lpszCmdLine) ve uygulamann pencere olarak
gsterilip gsterilmeyeceini tayin eden nCmdShow parametresidir.
nceden de belirtildii gibi burada pek allmam yeni veri tipleri
karmza kyor. Bunlarn nereden ktn anlatmak ok yer tutaca
iin, merakl programclar az nce belirtilen kaynaklar incelemeye davet
ediyoruz.

Bu yazda izlenen yntem mmkn nispette teknik detaylara inmeden
programn genel akn ve bu ak esnasnda fonksiyonlarn esas olarak
ilevlerini ksaca anlatmaktr. Bu adan WinMain fonksiyonunun programa
giri kaps olduunu ve programdaki tm modller gibi PASCAL tipi
kullanlmas gerektiini belirtelim. Dolaysyla bizim FX.C modlmzde
WinMain(), MainWndProc(), fnFX_RESOURCEProc(), DefWindowProc() gibi 4
ana fonksiyon kullanyoruz. WinMain()'de pencerenin nasl
grnecei,kullanaca renk paleti,yklenirken kullanaca ikon (eer
varsa), men ve snf isimlerinin yansra bir fonksiyon iaretisi (long
pointer to function) tanmlanr. Bu iaretci MainWndProc() adresini
gstermektedir. Winmain() fonksiyonu iinde daha sonra CreateWindow()
isimli API fonksiyonu yardmyla pencere oluturulmaktadr. Bunun
yansra standart olarak kullanlmas gereken GetMessage(),
TranslateMessage() ve DispatchMessage() gibi API fonksiyonlar yer
almaktadr. Windows ortamnda tm fare ve klavye ilemleri bir mesaj
kuyruunda tutulur. te GetMessage() bu mesaj kuyruunda sra bekleyen
ilk mesaj alp uygulamada kullanr. TranslateMessage() ise  klavyeden
karakter girii durumunda kullanlr. Sonuncu fonksiyon zellikle
uygulamda bir men seiminin veya fare tklatlmasnn bir baka diyalog
kutusu veya pencereyle ilgili mesaj hareketini ynlendirmesinde etkindir.

Komut karlklarnn ilendii ikinci nemli fonksiyon MainWndProc(),
Windows'un esas penceresiyle ilgili tm ilemleri yapyor. Yeri gelmiken
Windows mesajlarnn byk harfle ve 'WM' harfleriyle baladn
belirtelim (WM_COMMAND,WM_QUIT..vb). Bu fonksiyonun ald 4
argmandan ilki pencereyle ilgili tutana (HWND hWnd) gsterir. Dier 3
argman mesaj zellikleriyle ilgili olup esas olarak bizi wParam
parametresinin ald deerler ilgilendiriyor. Biraz nce mesajlarn WM ile
baladn belirtmitik. Men seiminde kullanlan mesajlar biraz farkl
olarak IDM harfleriyle balar. Buradaki i ie gemi 2 switch
fonksiyonunun ilkinde ilemi balatan WM_COMMAND ve ilemi sona
erdiren WM_DESTROY mesajlar vardr.

ProtoGen kod retirken '//' (yorum) iaretinin arkasna REGEN_..... veya
PROCESSMENU kelimelerini koymaktadr. Bunun amac programcnn kendi
kodunu her iki //REGEN_...  ve //PROCESSMENU_ arasna yerletirmesini
tevik etmektir. Programc standart bir men ve diyalog kutusu dizayn
edip kod rettikten sonra geriye dnp dizaynda deiiklik yapmak
isteyebilir. Eer bu arada programa kendi ilave ettii fonksiyonlarn kodun
yeniden retilmesi esnasnda kaybolmasn istemiyorsa bunlar her iki
//REGEN _...  arasna yerletirir. Ayn ekilde kullanlan deikenlerde de
yerletirilir.

Diyalog kutusuyla ilgili tm ilemler FX_RESOU.C modlnde yer
almaktadr. Burada da standart diyalog kutusu oluturma ve balang
deerleri verme ilemlerinin ardndan bu defa diyalog kutusu komutlarnn
ilendii fnFX_RESOURCEDlgProc() bulunmaktadr. Bu noktada biraz nefes
alp hayat kolaylatrmak iin baz nemli noktalarn altn izelim.
MainWndProc(), fnFX_RESOURCEDlgProc() fonksiyonlarnn son 4 harfi olan
Proc() Pascal'daki prosedrn (procedure) ksaltlmdr. Ayrca bunlarn
FAR PASCAL olarak tanmlandna da dikkat ekelim. Windows'daki komut
ilemleri ancak bu tip fonksiyonlar iinde tanmlandndan bunlar API
fonksiyonlarndan ayrdetmek iin "prosedur" olarak nitelendirebiliriz.

Diyalog prosedrnn iindeki case deerlerinin herbiri (102...112), diyalog
kutusu zerindeki kontrol dmelerine (checkbox, radio button, OK button)
tekabl etmektedir. Bunlardan hangisi seilirse, deere karlk gelen
ilem yaplr (eer varsa). Burada rnein 109 nolu dume 'buy' (satn al)
seenei tklatldnda MessageBox() fonksiyonu aktive olur. 111 nolu
dme aslnda OK dmesidir ve tklandnda 105 numaral edit
kutusundaki deeri alp, Text isimli string deikenine atayan
GetDlgItemText() API fonksiyonunu harekete geirir. Bu deikeni esas
pencereyle ilgili komutlarn ilendii FX.C modlnde, tu seimlerinin
belirledii FLAG deikenleriyle birlikte alacak dosya ismini tayin
etmede kullanyoruz. Nihayet alan dosyann ieriini pencereye yazma
grevini TextOut() API fonksiyonu stlenir ki, DOS temelli ortamdaki
printf() veya puts()'un Windows kartdr diyebiliriz.



1.7 Son Sz


Grld gibi Windows ortamnda basit bir program gelitirmek bile:

        a.Yeni veri tipleri,

        b.Windows API fonksiyonlar,

        c.Mesaj miktarna baml olarak artabilen,

i ie gemi switch ve case kullanmlar gerektirmektedir. Ayrca
program gelitirmeye yardmc ProtoGen veya WindowsMaker gibi aralarn
rettikleri kodlar, nerdiimiz yaynlardaki rnek programlardan farkldr.
rnein Murray ve Pappas'in kitabnda bir tek ve uzunca C kaynak kodu iinde
tm pencere ve diyalog komut ilemleri yaplr. ProtoGen ise WRT veya
RW(Resource WorkShop) iinde oluturulan her bir ayr diyalog kutusu iin
ilave bir C kaynak kodu modl retmektedir. Kanmca bu yntem uzun kodlarda
daha yararl olmasna karn, kitaplardaki stilden farkl olmas nedeniyle
konuya ilk balayanlarda tereddt dourabilir. Kod reticiler orta byklkte
veya byk programlarda programn men dizayn, diyalog kutusu oluturma, ikon
oluturma v.b gibi Windows elemanlaryla ilgili ksmlarnda yararl olmakta,
ancak her ilave elemann iledii mesajlarla ilgili fonksiyon oluturma ilemi
yine programcya kalmaktadr. Windows yzlerce ayr mesaj ileyen bir ortam
olmasayd sorun olmazd.

Bununla beraber Windows'un mesaj bazna dayanmas ve elemanlarnn mesaj
ileme zellii bize OOP (Object Oriented Programming) aralarnn yapsal
dillere oranla zellikle burada ok avantajl olacaklarn mjdeliyor.



nemli Not:

Uygulama BC++ 2.0 ile hazrlanp derlenmise de, BC++ 3.1 ile de ok kk bir
iki deiiklikle (rnein IDE ortamnn DOS'tan Windows'a tanmas esnasnda)
sorunsuz derlenebiliyor. Ayrca BC++ 3.1'in Resource Workshop isimli kaynak
editr WRT veya baka bir kaynak editrnn rettii Windows elemanlarn
deiiklie uratmadan altrabilir.





































 