Win32 Boş Pencere Oluşturma
Win32 Boş Pencere Oluşturma
DirectX programlamaya girmeden önce bir boş pencere oluşturmamız gerekir. Bunun için WinAPI kullanacağız.
WinAPI başlık dosyasını include ediyoruz.
C/C++ kodu:
#include <windows.h> #include <tchar.h>Penceremizin boyutlarını (Genişlik, Yükseklik) bir değişkene atıyoruz.
C/C++ kodu:
HINSTANCE hInst; HWND mainhWnd; int width = 640; int height = 480;C/C++ kodu:
bool InitWindow(HINSTANCE hInstance, int width, int height); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /******************************************************************* * WinMain *******************************************************************/ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { if (!InitWindow(hInstance, width, height)) { return false; } MSG msg = {0}; while (WM_QUIT != msg.message) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) == TRUE) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }
Bu görevin en önemli parçası, ana mesaj ilmiğidir. Bu sistemin kalanından mesajları aldığı uygulamanın parçasıdır. Yani program döngüsünde windows mesajlarının işlenmesi ve geri kalan kısmında bizim yapmak istediklerimzi yapılır. Burda bir msg uygulaması tanımlıyoruz. Peekmessage fonksyionu windows’un mesaj kuyruğunda mesaj olup olmadığını kontrol eder. Eğer mesaj var ise bunu msg yapısına aktarır. Uygulamanın sadece gelen mesajlardan başka ekstra işleme tabi tutmaya ihtiyaç duyduğu olaylarda PeekMessage kullanmak en iyisidir. TranslateMessage(&msg); DispatchMessage(&msg); bu metodlar yardımı ile mesajlar pencere metoduna yollanır.
C/C++ kodu:
bool InitWindow(HINSTANCE hInstance, int width, int height) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); // Yapının Boyutu wcex.style = CS_HREDRAW | CS_VREDRAW; // Stil wcex.lpfnWndProc = (WNDPROC)WndProc; // Wnd metodu wcex.cbClsExtra = 0; // Ektra bellek wcex.cbWndExtra = 0; // Ektra bellek wcex.hInstance = hInstance; // Program göstericisi wcex.hIcon = 0; // Icon wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // Kursör wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // Arka Plan Rengi wcex.lpszMenuName = NULL; // Menu wcex.lpszClassName = TEXT(”pencere”); // Pencere Sınıf adı wcex.hIconSm = 0; // Küçük Icon RegisterClassEx(&wcex); // Register ediyoruz RECT rect = { 0, 0, width, height }; AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); //Yukarıdaki yapıyla, oluşturacağımız pencerenin özelliklerini tanımlamış olduk. mainhWnd = CreateWindow(TEXT(”pencere”), // Pencere sınıf adı TEXT(”CeidaSoftware”), // Penceremizin ismi WS_OVERLAPPEDWINDOW , // Pencere parametreleri CW_USEDEFAULT, // Başlangıç x noktası CW_USEDEFAULT, // Başlangıç y noktası rect.right - rect.left, // Pencere Genişlik rect.bottom - rect.top, // Pencere Yükseklik NULL, // Ebevyn Pencere NULL, // Menu hInstance, // Program Göstericisi NULL); // Kullancı Bilgileri if (!mainhWnd) { return false; } //Aşağıdaki fonksiyonlar ile pencereyi gösterip güncelliyoruz. ShowWindow(mainhWnd, SW_SHOW); UpdateWindow(mainhWnd); return true; }
Penceremizi oluşturuyoruz ve ayarlarını yapıyoruz. ”TEXT(“CeidaSoftware”), ” bu penceremizin ismidir, bunu sizler kendi pencerenizin veya oyununuzun ismini verebilirsiniz. Bir çok değişik pencere ugulaması vardır. Biz bu pencere parametresinde WS_OVERLAPPEDWINDOW bunu kullandık.
Pencere Parametreleri:
WS_BORDER Köşelerdedeki simge durumu, ekranı kapla, kapat tuşları ve icon resmi bulunmayan penceremizdir.
WS_CAPTION Bir başlık barına sahip olan (WS_BORDER ‘a benzer)
WS_CHILD Bir çocuk penceresi oluşturur.
WS_CHILDWINDOW WS_CHILD tarzı olarak aynısı.
WS_CLIPCHILDREN
WS_CLIPSIBLINGS
WS_DISABLED Bu pencerde kullanıcıdan giriş alınamaz.
WS_DLGFRAME Tipik olarak diyalog kutularıyla bir tarzın bir sınırını kullanılmış yapan bir pencereyi yaratır. Bu tarzla bir pencere, bir başlık barına sahip olamaz.
WS_GROUP
WS_HSCROLL Yatay bir tomar barına sahip olan bir pencereyi yarat.
WS_ICONIC Önce en aza indirilen olan bir pencereyi yaratır. WS_MINIMIZE tarzı olarak aynısı
WS_MAXIMIZEBOX
WS_MINIMIZE
WS_MINIMIZEBOX
WS_OVERLAPPED Kaplanan bir pencereyi yaratır.
WS_OVERLAPPEDWINDOW Bu bizim kulladığımız pencere parametresidir. minimizde, simge durumu, ve kapat kutucukları bulunur.
WS_POPUP Bir popup oluşturur.
WS_POPUPWINDOW Bir popup penceresi oluşturur.
WS_SIZEBOX Büyütülme ve küçültme penceresi oluşturur.
WS_SYSMENU Sadece kapatma kutucuğu olan bir pencere oluşturur.
WS_TABSTOP
WS_THICKFRAME Boyutlandıran bir sınıra sahip olan bir pencereyi yaratır. WS_SIZEBOX tarzı olarak aynısı.
WS_TILED Kaplanan bir pencereyi yaratır. Kaplanan bir pencerenin, bir başlık barı ve bir sınırı var. WS_OVERLAPPED tarzı olarak aynısı.
WS_TILEDWINDOW WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, ve WS_MAXIMIZEBOX içinde barındırır. WS_OVERLAPPEDWINDOW bezer bir yapıdadır.
WS_VISIBLE
WS_VSCROLL Dikey bir tomar barına sahip olan bir pencereyi yaratır.
Bu pencere parametrelerini detaylı olarak http://msdn.microsoft.com/en-us/library/ms632600(VS.85).aspx bu linde bulabilirsiniz.
C/C++ kodu:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: PostQuitMessage(0); break; } break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam); }
Son olarak yukarıdaki bahsettiğimiz gibi gelen mesajlar bu metoda yollanır. Bu metoda bir veya çok mesaja cevap verebilir. Burda 2 tane mesaj cevap verdik, diğerlerinde windows işleyecektir.
Samed Ceylan
Yorumlar
Yorum Gönder