Ana sayfa > Programlama > Windows API Programlama > WinAPI ipuçları > winapi_ipuc00001

Windows API ipuçları

GetWindowRect() ve GetClientRect() fonksiyonlarının kullanımı ve farkı

GetWindowRect() fonksiyonu bir pencerenin sol ve sağ kenarlarının ekranın sol kenarına olan uzaklıklarını, üst ve alt kenarlarının ise ekranın üst kenarına olan uzaklıklarını alarak RECT yapı değişkenlerine atar.

typedef struct tagRECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;

HWND hwnd;
RECT rc;

GetWindowRect(hwnd, &rc);

printf("%ld\n", rc.left);   // Pencerenin sol kenarının ekranın sol tarafına uzaklığı
printf("%ld\n", rc.top);    // Pencerenin üst kenarının ekranın üst tarafına uzaklığı
printf("%ld\n", rc.right);  // Pencerenin sağ kenarının ekranın sol tarafına uzaklığı
printf("%ld\n", rc.bottom); // Pencerenin üst kenarının ekranın üst tarafına uzaklığı

printf("%ld\n", rc.right-rc.left ); // Pencere genişliği
printf("%ld", rc.bottom-rc.top);    // Pencere yüksekliği

GetClientRect() fonksiyonu ise, bir pencerenin istemci alanının koordinatlarını alır. İstemci koordinatları, istemci alanının sol üst ve sağ alt köşelerini gösterir. İstemci koordinatları, bir pencerenin istemci alanının sol üst köşesine göre olduğundan, sol üst köşenin koordinatları (0,0)'dır.

GetClientRect() fonksiyonu aldığı değerleri RECT yapı değişkenlerine atar. RECT yapısındaki left ve top değerleri daima 0 değeri alır. Yapının right değişkeni pencere genişliğini ve bottom değişkeni pencere yüksekliğini alır.


HWND hwnd;
RECT rc;

GetClientRect(hwnd, &rc);

printf("%ld\n", rc.left);   // Daima 0
printf("%ld\n", rc.top);    // Daima 0
printf("%ld\n", rc.right);  // Pencere genişliği
printf("%ld\n", rc.bottom); // Pencere genişliği

GetWindowRect() fonksiyonu ekran koordinatları ile, GetClientRect() fonksiyonu ise istemci alanı genişlik ve yükseklik değerleri ile işlem yapar.

Aşağıdaki kodları 600x400 boyutlarında bir ana pencere ile oluşturduğumuz bir program ile çalıştırdığımızda, altta yer alan ekran görüntüsü karşımıza gelir.


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
        {
             RECT rectWnd, rectCli;
             char cdizi[100];

             hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 20, 560, 20,
                                hwnd, 0, NULL, NULL);

             hwndStatic02 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 50, 560, 20,
                                hwnd, 0, NULL, NULL);

             GetWindowRect(hwnd, &rectWnd);
             sprintf(cdizi, "Window -> Left: %ld, Top: %ld, Right: %ld, Bottom: %ld Width: %ld, Height: %ld",
                     rectWnd.left, rectWnd.top, rectWnd.right,rectWnd.bottom, rectWnd.right-rectWnd.left, rectWnd.bottom-rectWnd.top);
             SetWindowText(hwndStatic01, cdizi);

             GetClientRect(hwnd, &rectCli);
             sprintf(cdizi, "Client -> Left: %ld, Top: %ld, Right: %ld, Bottom: %ld Width: %ld, Height: %ld",
                     rectCli.left, rectCli.top, rectCli.right, rectCli.bottom, rectCli.right-rectCli.left, rectCli.bottom-rectCli.top);
             SetWindowText(hwndStatic02, cdizi);
        }
        break;