Windows API'de program penceresini yeniden boyutlandırma ve maksimum boyuta getirme işlemlerini engelleme

Yazar: Admin

Kategori: Yazılım

Windows API ile program yaparken, programın ana penceresinin yeniden boyutlandırılmasını ve başlık çubuğunda yer alan maksimum boyuta getirme butonunun tüm ekranı kaplamasını engellemek isteyebiliriz.

Bu işlemi gerçekleştirmek için, Windows CreateWindowEx() fonksiyonunun dwStyle parametresini kullanabiliriz.

Burada yer alan örnek Windows API programında dwstyle için atanan WS_OVERLAPPEDWINDOW değeri aşağıda verilen tüm değerleri kapsamaktadır.

WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

Bu haliyle program ana penceresi yeniden boyutlandırılabilmekte ve maksimum butonu kullanılabilmektedir.

İstediğimiz kısıtlamaları uygulamak için, WS_OVERLAPPEDWINDOW değeri yerine aşağıdaki ifadeyi kullanmak işimizi görecektir:

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX

Programın son hali aşağıdaki şekilde olacaktır:


#include <windows.h>

/* Windows fonksiyon bildirimi yapar */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Sınıf adını global bir değişkene atar */
char szClassName[ ] = "WinAPIWindowsApp";
/* HINSTANCE cinsinden global bir değişken bildirimi */
HINSTANCE ghInst;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    HWND hwndMain;           /* Program penceresine ait Handle */
    MSG messages;            /* Programa gönderilen mesajların kaydedildiği yer */
    WNDCLASSEX wincl;        /* Pencere değerlerini içeren yapı */

    /* Programın bellekteki halinin Handle değeri global bir değişkene atanır */
    ghInst = hThisInstance;
	
    /* Pencere yapısına değer atama */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* Bu fonksiyon Windows tarafından çağrılır */
    wincl.style = CS_DBLCLKS;            /* Çift tıklamaları algılar */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Aktif ikon ve fare göstergesini kullanır */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; /* Menü olmadığını gösterir */
    wincl.cbClsExtra = 0; /* Pencere sınıfından sonra ekstra byte olmadığını gösterir */
    wincl.cbWndExtra = 0; /* Yapı veya pencerenin instance değeri */
    /* Pencerenin arka planı için Windows geçerli rengini kullanır */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Pencere sınıfını kaydeder, hata oluşursa program sona erer */
    if (!RegisterClassEx (&wincl)) return 0;

    /* Sınıf kaydolmuştur, program oluşturulur */
    hwndMain = CreateWindowEx (
           0,                       
           szClassName,
           "WinAPI Temel Program",
           WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           544,
           375,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );

    /* Pencere oluşturmada problem olursa programı sona erdirir. */
    if (!hwndMain) return 0;
		   
    /* Pencerenin ekranda görünmesini sağlar. */
    ShowWindow (hwndMain, nCmdShow);
    /* Pencereyi günceller */    
    UpdateWindow(hwndMain);

    /* Message döngüsünü çalıştırır. GetMessage() 0 değeri verene kadar devam eder.*/
    while (GetMessage (&messages, NULL, 0, 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() 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 yapmadığımız mesajlar için */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}