| |
/*
###############makefile.mak dosyası olarak kaydet#################
Pencere.exe : pencere_iskeleti.obj
ilink32 -aa -V4.0 -c -x -Gn pencere_iskeleti.obj c0w32.obj,Pencere.exe,,import32.lib cw32.lib,,
pencere_iskeleti.obj : pencere_iskeleti.cpp
bcc32 -c -tWM- -w -w-par -w-inl -W -a1 -Od pencere_iskeleti.cpp
################################################
Rem---------------------------derle.bat olarak kaydet-------
make
del *.obj *.res *.tds *.map
pause
Rem-----------------------------------------------------------------------------------------
*Yukarıda isimleri belirtilen iki dosyayi ve kodu pencere_iskeleti.cpp ismi ile ayni dizine kaydedin. Borland c++ 5.5 derleyiciniz
dogru kurulmus olmalı. Dizinde derle.bat dosyasını calistirin ve pencere.exe yi calıstırın....
//-------------------------------------pencere_iskeleti.cpp------------------------------------------------------------
*/
#include <windows.h> //windowsa özel degisken,sabit ve yapıların tanımlandıgı baslık dosyası
const char g_szClassName[] = "Pencere_sınıfının_ismi_icin";
/* Pencere Fonksiyonu
Windows Programlamada tüm CALLBACK fonksiyonlar biraz garip olabilir ama windows tarafından isletir. Yani siz bu tür
kod bloklarına windows icin yazarsınız bu kodu cagırmamalısınız. Eger coklu islem (Multi proccessing) ortamında
windows sizin programınıza firsat vermek isterse bu örnege ele alırsak WndProc isletir ve eger siz
islem kuyruguna pencere kapatmayı attıysanız (pencerenin X ine bastıysanız) o islem olur.
Belki basınıza gelmistir. Sistem zorlandıgında mouse hareketlerini duymaz
bazende cözülür ve hepsini birden ardı ardına yapar iste bunun arkasında fırsat olmadıgı icin CALLBACK lerin isletilmemesi vardır
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:// mesaj kapama ise
DestroyWindow(hwnd);//pencereyi yok et
break;
case WM_DESTROY://pencere yıkımında
PostQuitMessage(0);//garip ama kendi mesaj kuyrugunuza kapatma mesajı gönderiyosunuz. Win32'de islemleri windowsa bırakmak en saglıklı yoldur:)
break;
default:// buraya kadar beklenen mesajları case le yazıyoruz eger yorumlamamak istemedigimiz mesajlar varsa
return DefWindowProc(hwnd, msg, wParam, lParam);// bunları windowsun varsayılan kuralları isletsin diyoruz
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;//WNDCLASSEX->pencere sınıfı icin windows.h dosyasinda önceden tanımlanmıs yapi
//aslında bunu hex rakamlarlada yapmak mümkün ama böyle olması okunurluluk ve kolaylıktır.
HWND hwnd; //HWND->pencere kaydinda dönen isaretci icin
MSG Msg; // MSG-> windowsa özel mesajlajma icin kullanılan yapi degiskeni
//windowsun sistem/program uyumluluk adına elindeki en büyük silah
//sistem icinde dönen bu mesajlardır. cünkü bunlar donanıma ve programların hangi derleyiciyle derlendigine göre değişmez.
// tabi gelismis PE formatınında büyük rolü var (diger adıyla exe formatı)
//Pencere sınıfını kaydetme
wc.cbSize = sizeof(WNDCLASSEX);//yapının boyutu
wc.style = 0;//bu genellikle sıfır ama Pencere cesitleriyle alakalı degil
wc.lpfnWndProc = WndProc;//pencere sınıfının fonksiyonu
wc.cbClsExtra = 0;// windowsta hemen hemen bircok kontrolde yani dügmelerde
wc.cbWndExtra = 0;//metin kutularında ... böyle extra bilgi icin degiskenler tanımlanmıstır.
wc.hInstance = hInstance;//programın calısan kopyasının degiskeni (bellekteki pozisyonu gibi bisey)
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//[Alt]+ [Tab] bastıgınızda görecginiz 32*32 ikon
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//mouse bicimi
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//Formumuzun arka plan rengi
wc.lpszMenuName = NULL;// sabit Windows menunuz varsa burdan ekliyoruz. (File/....Edit/...)
wc.lpszClassName = g_szClassName;//sınıfımızın ismi
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//asagıda penceremixin bandında görünen 16*16 ikon
if(!RegisterClassEx(&wc))//sınıf kaydı
{
MessageBox(NULL, "Kayıt işlemi yapılamadı!", "Hata!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Pencere oluşturuluyor
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,//genisletilmis pencere stili degiskeni ->iceriye dogru giren kenarlar
g_szClassName,//ismi
"Pencerem",//pencerenin baslıgı
WS_OVERLAPPEDWINDOW,//windows stili cesitler icin win32 API reference ına bakın.
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,//pencerenin koordinat ve büyüklük rakamlar büyüklük varsayıla degerler masa üstünde posizyonu
NULL, NULL, hInstance, NULL);//ana (üst) pencerinin isaretcisi, menü isaretcisi, programımızın isaretcisi, pencere tanımlama yapısına isaretci
/*
Windowsta tüm gördügünüz pencereler ve üzerindeki kontroller dikey olarak birbirlerine
baglanır. Eger pencerinin üstünde dügme varsa o ana pencerinin altındadır ve dugme
ana (üst) pencerinin isaretcisi (dügmede bu deger null olmaz) ile baglanır. Aslında kontrollerde (liste,dügme...)
farklı görünüs ve islevleri olan pencerelerdir. örnegimizde deger null dur. cünkü bu bizim ana
penceremizdir . Menumuz olmadıgı icin oda null dur. son isaretcide pencere yaratılırken winmaine gönderilen ek bilgiler
icin kullanılır ama cogunlukla gereksizdir. aynı isi program icindende farklı sekilde yapabilirsiniz.
*/
if(hwnd == NULL)// dönen null'sa problemimiz var.
{
MessageBox(NULL, "Pencere oluşturma başarasız!", "Hata!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);//pencere sahnede
UpdateWindow(hwnd);//emin olmak icin bir kere tazeleme
// Mesaj döngüsü
while(GetMessage(&Msg, NULL, 0, 0) > 0)//artık program ekranda biyerlerde ve eger belirtiyseniz
//formun üstüne yada dügmelere tıklanmayı beklemek icin mesaj döngüsüne giriyor. burda WndProc cagrılmadıgına dikkat edin
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
} |
|