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

Bu blogdaki popüler yayınlar

SDL Nedir?

Doxygen Kullanımı

OpenGL'de Line (çizgi) Çizdirme