Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: baslik belirten degeri degerine degiskeni durumunda fonksiyonu fonksiyonun iliskin parametre pencere pencerenin return verilen yazisini C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 25.10.2005
Okunma Sayısı : 26712
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 26.12.2024
Turhal Temizer
Mac OS/X Removing CUDA 26.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 26.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 26.12.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API - Pencerelerle İlgili İşlem Yapan API Fonksiyonları - 2
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor