BG MVC Model View Controller eğitim serisi yayında...

Ana page > Programlama > Windows API Programlama > WinAPI örnek kodlar > winapi_ornek00019

Windows API örnek kodlar

Bir program penceresini masaüstünde ortalama

Bir Windows API programında, SystemParametersInfo() içinde SPI_GETWORKAREA değerini kullanarak program ana penceresini masaüstünde ortalayabiliriz.

Programda yer alacak main.c dosyasının içeriği aşağıdaki şekilde olacaktır:

main.c


#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>

/* Programın ana penceresi için fonksiyon bildirimi yapar. */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Pencere ortalama fonksiyon bildirimi */
void CenterMainWindow (HWND hwnd);

/* Sınıf adını global bir değişkene atar. */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* Program ana penceresi için handle değeri */
    MSG messages;            /* Program ana penceresine gönderilen mesajların kaydedildiği değişken */
    WNDCLASSEX wincl;        /* Program ana pencere sınıfına ait veri yapısı */

    /* Program ana pencere sınıfı veri yapısına değer atama */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* Windows tarafından çağrılan ve tüm mesaj işlemlerini yapan ana pencere fonksiyonu */
    wincl.style = CS_DBLCLKS;                 /* Çift tıklamaya işlem yapılmasını sağlayan stil değerini ekleme */
    wincl.cbSize = sizeof (WNDCLASSEX);       /* Bu değişkenine sizeof(WNDCLASSEX) değeri atanmalıdır. */

    /* Ön tanımlı ikon ve mouse imlecinin kullanılmasını sağlama */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                /* Menü tanımı yok. */
    wincl.cbClsExtra = 0;                     /* Pencere sınıfı için ektra byte tanımı yok. */
    wincl.cbWndExtra = 0;                     /* Pencere Instance değeri için ayrılacak ekstra byte sayısını gösterir. */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Ana pencere arka plan rengi için Windows'un ön tanımlı değerini kullanır. */

    /* Pencere sınıfını kaydeder, başarılı olmazsa program sona erer. */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* Program ana pencere sınıfı kaydedildiğinden, program ana penceresini oluşturma */
    hwnd = CreateWindowEx (
           0,                   /* Pencereye ek özellikler sağlar. */
           szClassName,         /* Sınıf adı */
           _T("Code::Blocks Template Windows App"),  /* Pencere başlığı */
           WS_OVERLAPPEDWINDOW, /* Ön tanımlı pencere */
           CW_USEDEFAULT,       /* Pencerenin sol üst köşesinin x koordinatını Windows belirler. */
           CW_USEDEFAULT,       /* Pencerenin sol üst köşesinin y koordinatını Windows belirler. */
           544,                 /* Ana pencere genişliği piksel olarak */
           375,                 /* Ana pencere yüksekliği piksel olarak */
           HWND_DESKTOP,        /* Ana pencerenin masaüstünün alt pencersi olduğunu gösterir. */
           NULL,                /* Menü yok. */
           hThisInstance,       /* Program Instance handler değeri */
           NULL                 /* Pencere oluşturma bilgisi yok. */
           );

    /* Ana pencereyi masaüstünde ortalar. */
    CenterMainWindow(hwnd);
    /* Ana pencereyi ekran da gösterir. */
    ShowWindow (hwnd, nCmdShow);

    /* Mesaj döngüsünü devre sokar. Bu döngü GetMessage() fonksiyonu 0 değeri döndürene kadar çalışmaya devam eder. */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Sanal tuş mesajlarını karakter mesajlarına çevirir. */
        TranslateMessage(&messages);
        /* Mesajları WindowProcedure() fonksiyonuna gönderir. */
        DispatchMessage(&messages);
    }

    /* Program dönüş değeri 0'dır - Bu değeri PostQuitMessage() fonksiyonu verir. */
    return messages.wParam;
}

/* Bu fonksiyon Windows'un DispatchMessage() fonksiyonu tarafından çağrılır. */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* Mesajlara gerekli işlemi yapar. */
    {
        case WM_DESTROY:
             PostQuitMessage (0);      /* WM_QUIT değerini mesaj kuyruğuna gönderir */
             break;
        default:                      /* İşlem yapılmayan mesajlar için */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

/* Pencere ortalama fonksiyonu */
void CenterMainWindow (HWND hwnd)
{
  RECT rc, rcHwnd;
  int width, height, wParent, hParent;

  GetWindowRect(hwnd, &rcHwnd);
  width = rcHwnd.right - rcHwnd.left;
  height = rcHwnd.bottom - rcHwnd.top;

  SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
  wParent = rc.right - rc.left;
  hParent = rc.bottom - rc.top;

  MoveWindow(hwnd, (wParent-width)/2, (hParent-height)/2, width, height, TRUE);
}