C
Bu yazımızda pencereler
ile ilgili işlemler yapan API fonksiyonlarını incelemeye devam edeceğiz. Önceki
yazımızda ele aldığımız fonksiyonlar genel olarak pencere sistemi üzerinde dolaşarak
belli özelliklerine göre aranılan bir pencerenin bulunması, ortak özellikler
gösteren pencereler için kendi yazdığımız bir fonksiyonun çağrılması gibi işlemler
yapmamızı sağlıyordu. Bu yazımızda ele alacağımız fonksiyonlar ise, pencere
tutamaç değerini parametre değişkeni olarak alarak, o pencereye ilişkin belli
bir özelliği öğrenmemizi veya değiştirmemizi sağlayan fonksiyonlar olacak. Önce,
inceleyeceğimiz fonksiyonları ve prototip bildirimlerini bir liste halinde görelim
:
int GetWindowText(HWND
hWnd, LPTSTR lpString, int nMaxCount);
|
int
GetWindowTextLength(HWND hWnd); |
BOOL
SetWindowText(HWND hWnd, LPCTSTR lpString); |
BOOL
EnableWindow(HWND hWnd, BOOL bEnable); |
BOOL
MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); |
BOOL
GetWindowRect(HWND hWnd, LPRECT lpRect); |
BOOL
IsIconic(HWND hWnd); |
BOOL
IsWindow(HWND hWnd); |
BOOL
IsWindowVisible(HWND hWnd); |
BOOL
IsWindowEnable(HWND hWnd); |
LONG
SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong); |
LONG
GetWindowLong(HWND hWnd, int nIndex); |
BOOL
ShowWindow(HWND hWnd, int nCmdShow); |
BOOL
DestroyWindow(HWND hWnd); |
- GetWindowText
Fonksiyonu : Bu fonksiyon, tutamaç değeri verilen pencerenin başlık yazısını,
adresini parametre olarak geçtiğimiz tampon bölgeye kopyalar. Yani bu pencerenin
başlık yazısını öğrenmemizi sağlar. Fonksiyonun ilk parametre değişkeni, başlık
yazısı öğrenilecek pencerenin tutamaç değeri, ikinci parametre değişkeni başlık
yazısının kopyalanacağı adresi belirtir. Son parametre değişkeni ise tampon
bölgeye kopyalanacak maksimum karakter sayısıdır. Eğer pencerenin başlık yazısı
bu parametre değişkeninde belirtilen uzunluktan daha uzun ise, buradaki karakter
sayısı kadarlık kısmı tampon bölgeye kopyalanır. Fonksiyon başarılı olması
durumunda tampon bölgeye kopyalanan karakter sayısını döndürür. (null karakter
buna dahil değildir.) Herhangi bir nedenle başarısız olması durumunda ise
sıfır değerini döndürür. Bu fonksiyon ile başka bir uygulama içerisinde oluşturulan
pencerelere ilişkin başlık yazıları öğrenilemez.
int GetWindowText
(
    HWND hWnd,         // Pencere
ya da kontrole ilişkin tutamaç değeri
    LPTSTR lpString,    // Başlık yazısının saklanacağı
adres
    int nMaxCount       // Kopyalanacak
maksimum karakter sayısı
); |
- GetWindowTextLength
Fonksiyonu : Bu fonksiyon, tutamaç değeri parametre olarak geçilen pencerenin
başlık yazısının uzunluğunu döndürür.
int GetWindowTextLength
(
    HWND hWnd         //
Pencere ya da kontrole ilişkin tutamaç değeri
); |
- SetWindowText
Fonksiyonu : Tutamaç değeri parametre olarak geçilen pencerenin başlık yazısını
değiştirir. Fonksiyonun ilk parametre değişkeni başlık yazısı değiştirilecek
pencerenin tutamaç değeri, ikinci parametre değişkeni ise pencerenin yeni
başlık yazısı anlamına gelmektedir. Fonksiyon başarılı olması durumunda sıfır
dışı bir değere, başarısızlık durumunda ise sıfır değerine geri döner.
BOOL SetWindowText
(
    HWND hWnd,        // Pencere
ya da kontrole ilişkin tutamaç değeri
    LPCTSTR lpString   // Yazının adresi
); |
- EnableWindow
Fonksiyonu : Bu fonksiyonu, daha önce yapmış olduğumuz uygulamalardaki pencere
fonksiyonları içerisinde sık sık kullandık. Fonksiyonun görevi, tutamaç değeri
verilen pencereyi aktif ya da pasif hale getirmektir. Aktif hale mi pasif
hale mi getireceğine bEnable parametresinin değerine bakarak karar verir.
Bu parametrenin değeri TRUE ise pencere aktif hale, FALSE ise pencere pasif
hale getirilir. Pasif halde bulunan bir pencere artık klavye ve fare mesajlarını
almaz.
BOOL EnableWindow
(
    HWND hWnd,       // Pencerenin tutamaç
değeri
    BOOL bEnable      // Bayrak parametre
); |
- MoveWindow Fonksiyonu
: Tutamaç değeri verilen pencerenin ekran üzerindeki konumunu ve boyutlarını,
verilen parametrelerin değerlerine göre değiştirir. Fonksiyonun X ve Y parametre
değişkenleri, pencerenin ekrandaki yeni koordinatlarıdır. X parametre değişkeni
yatay eksendeki, Y parametre değişkeni ise düşey eksendeki değeri belirtir.
Burada baz alınan orijin noktası ekranın sol üst köşesidir. Ancak bu durum,
sadece ana pencereler için geçerlidir. Alt pencereler için baz alınan orijin
noktası, o alt pencerelerin ana pencerelerinin sol üst köşeleridir. Fonksiyonun
nWidth ve nHeight parametre değişkenleri pencerenin yeni genişlik ve yükseklik
değerlerini belirtir. Pencerenin konumu ve boyutları değiştirildikten sonra
görüntüsü bozulacaktır. İşte son parametre değişkeni de bu değişiklikten sonra
pencerenin yeniden çizilip çizilmeyeceğini belirtir. Eğer bu parametre değişkeni
yerine TRUE değeri geçilirse pencere WM_PAINT mesajı alır ve yeniden çizilir.
FALSE geçilirse pencere otomatik olarak yeniden çizilmez. Uygulama içerisinde
pencere görünümü yenilenmelidir.
BOOL MoveWindow
(
    HWND hWnd,       // Pencerenin tutamaç
değeri
    int X,                 //
Yatay pozisyon
     int Y,                 //
Düşey pozisyon
    int nWidth,          //
Genişlik
     int nHeight,         //
Yükseklik
    BOOL bRepaint     // Pencerenin yeniden
çizilip çizilmeyeceğini belirten bayrak parametre
); |
- GetWindowRect
Fonksiyonu : Tutamaç değeri verilen pencerenin koordinatlarını, ekranın sol
üst köşesini orijin kabul ederek hesaplar ve döndürür. Fonksiyonun ilk parametre
değişkeni, koordinatları öğrenilecek pencerenin tutamaç değeridir. İkinci
parametre değişkeni ise, fonksiyonun bulduğu değerleri yazacağı adresi belirtir.
Bu parametre değişkeni, RECT yapısı türünden bir göstericidir. Bu yapıya,
pencerenin sol üst köşesinin ve sağ alt köşesinin koordinatları yazılır. Fonksiyon
başarısızlık durumunda sıfır değerine, başarılı olması durumunda ise sıfır
dışı bir değere geri döner.
BOOL GetWindowRect
(
    HWND hWnd,    // Pencerenin tutamaç değeri
    LPRECT lpRect  // Pecnere koordinatlarının saklanacağı
yapı göstericisi
); |
- IsIconic Fonksiyonu
: Tutamaç değeri verilen pencerenin küçültülmüş (minimized) olup olmadığı
bilgisini döndürür. Eğer pencere küçültülmüş durumda ise sıfır dışı bir değere,
aksi takdirde sıfır değerine geri döner.
BOOL IsIconic
(
    HWND hWnd   // Pencerenin tutamaç değeri
); |
- IsWindow Fonksiyonu
: Verilen tutamaç değerine ilişkin bir pencere olup olmadığı bilgisini döndürür.
Eğer o tutamaç değerine sahip bir pencere varsa sıfır dışı bir değere, aksi
takdirde sıfır değerine geri döner.
BOOL IsWindow
(
    HWND hWnd   // Pencerenin tutamaç değeri
); |
- IsWindowVisible
Fonksiyonu : Tutamaç değeri verilen pencerenin görünür olup olmadığı bilgisini
döndürür. Eğer söz konusu pencere ve eğer varsa o pencerenin ana pencereleri
WS_VISIBLE pencere biçimine sahipse sıfır dışı bir değere, aksi takdirde sıfır
değerine geri döner.
BOOL IsWindowVisible
(
    HWND hWnd   // Pencerenin tutamaç değeri
); |
- IsWindowEnable
Fonksiyonu : Tutamaç değeri verilen pencerenin aktif olup olmadığı bilgisini
döndürür. Eğer söz konusu pencere aktif durumda ise sıfır dışı bir
değere, aksi takdirde sıfır değerine geri döner.
BOOL IsWindowEnable
(
    HWND hWnd   // Pencerenin tutamaç değeri
); |
- SetWindowLong
ve GetWindowLong Fonksiyonları : Bu fonksiyonlar, pencerelere ilişkin bir
takım bilgilerin alınması ve değiştirilmesi amacıyla kullanılmaktadır. Fonksiyonların
ilk parametre değişkenleri pencereye ilişkin tutamaç değeridir. İkinci parametreleri
öğrenilecek veya değiştirilecek özelliği belirten bir sembolik sabittir. SetWindowLong
fonksiyonunun üçüncü parametresi ise bu özellik için verilecek yeni değerdir.
Özellikleri belirten sayılar, sembolik sabit olarak tanımlanmışlardır.
LONG SetWindowLong
(
    HWND hWnd,           //
Pencerenin tutamaç değeri
    int nIndex,              //
Ayarlanacak değeri belirten sıra numarası
    LONG dwNewLong     // Yeni değer
);
LONG GetWindowLong
(
    HWND hWnd,           //
Pencerenin tutamaç değeri
    int nIndex,              //
Öğrenilecek değeri belirten sıra numarası
);
|
- ShowWindow Fonksiyonu
: Bu fonksiyonu da yaptığımız örnek uygulamalardaki pencere fonksiyonları
içerisinde sık sık kullanmıştık. Bu fonksiyon, bir pencerenin görüntülenmesini
veya görüntülenmemesini sağlar. İlk parametre değişkeni pencerenin tutamaç
değeri, ikinci parametre değişkeni ise görüntülenip görüntülenmeyeceğini belirten
bir sembolik sabittir. İkinci parametre değişkeni için geçilebilecek tamsayı
değerleri sembolik sabit olarak tanımlanmışlardır.
BOOL ShowWindow
(
    HWND hWnd,    // Pencerenin tutamaç değeri
    int nCmdShow  // Pencerenin gösterilip gösterilmeyeceğini
belirten değer
); |
- DestroyWindow
Fonksiyonu : Daha önce oluşturulmuş bir pencerenin yok edilmesini sağlar.
Bu fonksiyon, söz konusu pencerenin eğer varsa alt pencerelerini de yok eder.
Farklı kanallarda yaratılmış pencereler için kullanılamaz. Başarılı olması
durumunda sıfır dışı bir değere, aksi takdirde sıfır değerine geri döner.
BOOL DestroyWindow
(
    HWND hWnd   // Pencerenin tutamaç değeri
); |
Şimdi örnek uygulamamıza
geçelim. Bu uygulamada, bir ana pencere, o ana pencereye ait bir alt pencere
oluşturacağız. Ana pencere oluştuktan sonra, WM_CREATE mesajı alındığında, alt
pencereyi oluşturup göstereceğiz. Alt pencere de oluşturulduktan sonra yukarıda
incelediğimiz fonksiyonları kullanarak alt pencerenin başlık yazısını alıp değiştireceğiz.
Alt pencere üzerinde farenin sol tuşuna basıldığı zaman, alt pencerenin konumunu
ve boyutlarını değiştireceğiz. Uygulamamıza ait WinMain fonksiyonunu, daha önceki
uygulamalarımızdakine benzer biçimde yazdık :
int WINAPI
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int
nCmdShow)
{
    WNDCLASS wndClass;
    HWND hWnd;
    MSG msg;
   
if (!hPrevInstance) {
        wndClass.style = CS_HREDRAW | CS_VREDRAW;
        wndClass.lpfnWndProc = (WNDPROC)WndProc;
        wndClass.cbClsExtra = 0;
        wndClass.cbWndExtra = 0;
        wndClass.hInstance = hInstance;
        wndClass.hIcon = LoadIcon(NULL,IDI_WINLOGO);
        wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
        wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,0,0));;
        wndClass.lpszMenuName = NULL;
        wndClass.lpszClassName = "MainWindows";
   
    if (!RegisterClass(&wndClass))
            return 0;
    }
   
if (!hPrevInstance) {
        wndClass.style = CS_HREDRAW | CS_VREDRAW;
        wndClass.cbClsExtra = 0;
        wndClass.cbWndExtra = 0;
        wndClass.hInstance = hInstance;
        wndClass.hIcon = LoadIcon(NULL,IDI_WINLOGO);
        wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
        wndClass.lpszMenuName = NULL;
        wndClass.lpszClassName = "ChildWindows";
        wndClass.lpfnWndProc = (WNDPROC)WndChildProc;
   
    if (!RegisterClass(&wndClass))
            return -1;
    }
   
hWnd = CreateWindow("MainWindows",
                   
                "Ana
Pencere",
                   
                WS_OVERLAPPEDWINDOW,
                   
                CW_USEDEFAULT,
                   
                0,
                   
                CW_USEDEFAULT,
                   
                0,
                   
                NULL,
                   
                NULL,
                   
                hInstance,
                   
                NULL);
   
if (!hWnd)
      return 0;
 
  ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
   
while (GetMessage(&msg,0,0,0)) {
        TranslateMessage(&msg);
          DispatchMessage(&msg);
    }
   
return msg.wParam;
}
|
WinMain fonksiyonunda,
ana pencereye ve alt pencereye ilişkin pencere sınıflarını oluşturarak sisteme
kaydettik. Ana pencereyi CreateWindow fonskiyonu ile oluşturduk, ShowWindow
fonksiyonuna SW_SHOW sembolik sabitini geçerek pencerenin görüntülenmesini sağladık.
Alt pencereyi ise ana pencerenin pencere fonksiyonunda, WM_CREATE mesajı alındığı
sırada oluşturacağız :
LRESULT CALLBACK
WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    char *pTitle, pNewTitle[] = "Yeni başlık yazısı";
    int titleLength;
   
switch (msg) {
        case WM_CREATE :
            glhWndChild = CreateWindow("ChildWindows",
                   
                   
            "Alt Pencere",
                   
                   
            WS_CHILDWINDOW | WS_CAPTION
                   
                   
            | WS_SYSMENU,
                   
                   
            100,100,200,300,
                   
                   
            hWnd,
                   
                   
            (HMENU)ID_CHILD,
                   
                   
            ((LPCREATESTRUCT)lParam)->hInstance,NULL);
   
        if (!glhWndChild)
                return
0;
   
        ShowWindow(glhWndChild,SW_SHOW);
            UpdateWindow(glhWndChild);
   
        titleLength = GetWindowTextLength(glhWndChild)
+ 1;
            pTitle = (char *)malloc(sizeof(char)*titleLength);
   
        GetWindowText(glhWndChild,pTitle,titleLength);
            MessageBox(glhWndChild,pTitle,"Şu
anki başlık yazısı",MB_OK);
            SetWindowText(glhWndChild,pNewTitle);
   
        break;
   
    case WM_DESTROY :
            PostQuitMessage(0);
            break;
   
    default :
            return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
}
|
Ana penceremize
ilişkin pencere fonksiyonumuz içerisinde, WM_CREATE mesajı alındığı durumda,
öncelikle alt pencereyi CreateWindow ile ilgili parametreleri geçerek oluşturduk.
ShowWindow ile pencerenin görüntülenmesini sağladık. Şimdi amacımız, alt pencerenin
başlık yazısını almak, bir mesaj kutusunda bu başlık yazısını göstermek ve daha
sonra başlığı değiştirmek. Bu amaçla char türünden bir gösterici tanımladık.
Pencerenin başlık yazısının uzunluğunu her durumda bilemeyiz. Bu nedenle, işi
garantiye alarak öncelikle başlık yazısının uzunluğunu tespit edip ardından
bu uzunluk kadar dinamik bir alan tahsis etme yolunu tercih ettik. GetWindowTextLength
fonksiyonu ile alt penceremizin başlık yazısının uzunluğunu aldık. pTitle göstericisi
için bu uzunluğa null karakteri de hesaba katarak dinamik alan tahsis ettik.
Daha sonra GetWindowText ile alt penceremizin başlık yazısını pTitle göstericisinin
gösterdiği adrese yazdırdık ve bir mesaj kutusu ile bu bilgiyi gösterdik. Ardından
SetWindowText ile alt pencerenin başlık yazısını değiştirdik.
Alt penceremizin
pencere fonksiyonu içerisinde, WM_LBUTTONDOWN mesajı alınması durumunda ise,
alt pencereyi yeniden konumlandıracağız ve boyutlarını değiştireceğiz :
LRESULT CALLBACK
WndChildProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch (msg) {
        case WM_CREATE :
        break;
   
case WM_LBUTTONDOWN :
        MoveWindow(glhWndChild,150,150,250,350,TRUE);
        break;
   
case WM_DESTROY :
        PostQuitMessage(0);
        break;
   
default :
        return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
}
|
Yeniden boyutlandırma
ve konumlandırma işlemi için MoveWindow fonksiyonunu kullandık. Ana penceremizin
pencere fonksiyonu içerisinde, alt penceremizi oluştururken, pencere koordinatları
için 100, 100 değerlerini; boyutlar için ise 200, 300 değerlerini vermiştik.
MoveWindow fonksiyonunda bu değerleri ellişer birim artırarak veriyoruz. MoveWindow’un
son parametre değişkeni için ise TRUE sembolik sabitini geçiyoruz ki, pencerenin
boyutlandırma ve konumlandırma işlemleri bittikten sonra görünümü güncellensin.
Uygulamamızı çalıştırdığımızda alt pencere üzerine farenin sol tuşu ile tıkladığımızda
bu fonksiyonun etkisi görülecektir.
Uygulamaya ilişkin
kaynak kod dosyasını buradan
indirebilirsiniz. (Örnek uygulama Visual Studio .Net 2003’te hazırlanmıştır.)
Yeni yazımızda görüşmek üzere mutlu günler dilerim...
KAYNAKLAR
- Win32 Programlama
Yardım Sayfaları
Makale:
Windows API - Pencerelerle İlgili İşlem Yapan API Fonksiyonları - 2 C ve Sistem Programlama Çiğdem Çavdaroğlu
|