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);
}