Glfw Pencere Boyutlarını Öğrenmek - Mustafa Sabri OĞUZ

Duyurular

2 Mayıs 2014 Cuma

Glfw Pencere Boyutlarını Öğrenmek

Varolan Glfw pencerenin genişlik (width) ve yükseklik (height) değerlerini elde etmeyi öğreneceğiz.
İki farklı yöntem ile pencere boyutlarını elde edebiliriz;
  1. glfwGetWindowSize fonksiyonu 
  2. glfwSetWindowSizeCallback, geri çağırım (callback) fonksiyonu

1.Yöntem: glfwGetWindowSize Fonksiyonu 

Bu yöntem ile öğrenmek istediğimiz pencere boyut bilgisini doğrudan öğrenmemize yarar.

// Prototip
void glfwGetWindowSize(GLFWwindow *window,int *width, int *height);

// Kullanımı
glfwGetWindowSize(window, &width, &height);
Bu fonksiyon, pencere boyutlarının yükseklik ve genişlik bilgisini vermektedir.

Fonksiyon Parametreleri;
  • [in] GLFWwindow *window - Pencere boyut bilgisini alacağımız pencere nesnesi
  • [out] int width - Genişlik bilgisini 'pixel' cinsinden geri dönen değişken. 
  • [out] int height - Yükseklik bilgini 'pixel' cinsinden geri dönen değişken.
Not: Referans aldığım dokümandaki bir ayrıntıyı, fonksiyon parametre(ler) açıklamasına eklemenin yararlı olacağını düşündüm.
  • [in]: fonksiyonun kendi içinde kullanacağı nesneyi atıyoruz. 
  • [out]: fonksiyonun geri döndüğü referans değerlerin, kopyalanacağı değişkeni tanımlıyoruz.
Örnek:
// Pencere boyut bilgisi
int width;
int height;
Pencerenin boyutlarını almak ve sonuçları konsol penceresine yazdırmak için global düzeyde değişkenler tanımlıyoruz.

// Klavye mesajlarının işlendiği callback fonksiyonu
static void klavye_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{
// Esc tuşuna basıldığında, pencereyi kapat
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
// Pencere boyutlarını klavyemizin F1 tuşuna tıklıyoruz.
else if(key == GLFW_KEY_F1 && action == GLFW_PRESS){
glfwGetWindowSize(window, &width, &height);
cout << "glfwGetWindowSize fonksiyonu" << endl;
cout << "------------------------------------------" << endl;
cout << "Suan ki pencere boyutu;" << endl;
cout << "Genislik(width): " << width << endl;
cout << "Yukselik(height): " << height << endl;
}
}
Ardından klavye geri çağırım fonksiyonunda, klavyemizin 'F1' tuşuna basıldığında glfwGetWindowSize() fonksiyonu ile geri dönen referans değerlerini, oluşturduğumuz değişkenlere atamasını sağlayarak, konsol penceresinde bu bilgileri yazdırmış olduk.

2.Yöntem: glfwSetWindowSizeCallback Geri Çağırım Fonksiyonu

Bu yöntem, aslında pencere boyut bilgisi almaktan çok, kullanıcının pencereyi yeniden boyutlandırması halinde, gerekli komut dizisi veya güncellenmesi gereken değerlerin, işlenmesi için tasarlanmıştır.

// Prototip
GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow *window, GLFWwindowsizefun cbfun);

// Kullanımı
glfwSetWindowSizeCallback(window, fonksiyon_adı);

Bu fonksiyon, pencere boyutlarında değişiklik yapıldığında yani pencere yeniden boyutlandırma olayı (resize event) gerçekleştiğinde devreye giren bir geri çağırım fonksiyonudur. Değişikliğin yapıldığı anlarda, güncel pencere boyut değerleri ile width (genişlik) ve height (yükseklik) parametrelerine geri dönmektedir.

Fonksiyon Parametreleri;
  • [in] GLFWwindow *window - Pencere boyut bilgisini alacağımız pencere nesnesi
  • [in] GLFWwindowsizefun cbfun - Geri çağırım fonksiyon adı.
Örnek:
// Konsol temizleme sabitleri
#ifdef _WIN32
#define CLEAR "cls"
#else // Windows dışı işletim sistemleri (Other OS) için...
#define CLEAR "clear"
#endif
Bu yöntem ile  pencere boyutlarındaki her değişikliği konsolda alt alta yazdıracağından, Windows ve diğer işletim sistemlerinde konsolu sıfırlamak için gereken sabiti 'main.cpp' dosyamızın en başına tanımlıyoruz.

#include <cstdlib>
Ardından konsolu sıfırlamak için gereken system() fonksiyonu için '<cstdlib>' kütüphanesini dosyamıza dahil ediyoruz.

// Pencere yeniden boyutlandırıldığında çağırılacak fonksiyon (callback)
glfwSetWindowSizeCallback(window, pencereBoyut_callback);
Pencere yeniden boyutlandırma gerçekleştiğinde, çağrılacak fonksiyonu belirtmek için geri çağırım fonksiyonunu, diğer geri çağırım fonksiyonlarının altına tanımlıyoruz.

void pencereBoyut_callback(GLFWwindow *window, int width, int height)
{
system(CLEAR);
cout << "Callback fonksiyonu" << endl;
cout << "------------------------------------------" << endl;
cout << "GLFW -> Pencere yeniden boyutlandirildi;" << endl;
cout << "Genislik(width) : " << width << endl;
cout << "Yukseklik(Height) : " << height << endl;
cout << "------------------------------------------" << endl;
}
Ve son olarak çağrılacak fonksiyonumuzu 'main' fonksiyonumuzun üstüne tanımlıyoruz. Bu fonksiyon ile pencere her boyutlandırma da konsolu sıfırlayarak, bize güncel pencere boyut bilgilerini yazdıracaktır.

Bu yazımızda ileride ihtiyaç duyabileceğimiz pencere boyutlarının bilgisini elde etmeyi öğrendik.

Bitbucket: main.cpp dosyasını indirmek için tıklayın.

Referans:
http://www.glfw.org/docs/latest/group__window.html

Hiç yorum yok:

Yorum Gönderme