Glfw Pencere Konumunu Öğrenmek - Mustafa Sabri OĞUZ

Duyurular

16 Mayıs 2014 Cuma

Glfw Pencere Konumunu Öğrenmek


Bu yazımda Glfw penceresinin ekran üzerindeki konumu belirlemeyi öğreneceğiz.
Ekran üzerindeki penceremizin  'x' ve 'y' koordinatlarını, iki farklı yöntem ile elde edebiliriz;
  1. glfwGetWindowPos fonksiyonu 
  2. glfwSetWindowPosCallback, geri çağırım (callback) fonksiyonu

1.Yöntem: glfwGetWindowPos Fonksiyonu

Bu yöntem ile öğrenmek istediğimiz pencerenin ekran üzerindeki koordinatlarını doğrudan öğrenmemize yarar.

// Prototip
void glfwGetWindowPos(GLFWwindow *window, int *xpos, int *ypos);
// Kullanımı
glfwGetWindowPos(window, &xpos, &ypos);
Bu fonksiyon ilgili pencerenin, ekran üzerindeki 'x' ve 'y' koordinatlarını tahsis etmektedir.

Fonksiyon Parametreleri;
  • [in] GLFWwindow *window - Pencere konum bilgisini alacağımız pencere nesnesi
  • [out] int xpos- Ekranın yatay düzlemindeki (x) konumunu 'pixel' cinsinden geri döner. 
  • [out] int ypos- Ekranın dikey düzlemindeki (y) konumunu 'pixel' cinsinden geri döner. 
Örnek:
// Pencere konum (pos) değişkenleri
int xpos;
int ypos;
Pencerenin konum bilgisini 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);
else if(key == GLFW_KEY_F1 && action == GLFW_PRESS){

glfwGetWindowPos(window, &xpos, &ypos);
cout << "glfwGetWindowPos() fonksiyonu" << endl;
cout << "------------------------------------------" << endl;
cout << "GLFW -> Pencere konum bilgisi." << endl;
cout << "------------------------------------------" << endl;
cout << "x koordinati :" << xpos << endl;
cout << "y koordinati :" << ypos << endl;
cout << "------------------------------------------" << endl << endl;
}
}
Peşinden klavye geri çağırım fonksiyonunda, klavyemizin 'F1' tuşuna basıldığında glfwGetWindowPos() 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: glfwSetWindowPosCallback Geri Çağırım Fonksiyonu

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

// Prototip
GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow *window, GLFWwindowposfun cbfun);

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

Bu fonksiyon, pencere konumunda değişiklik yapıldığında yani pencere yeniden konumlandırma olayı (resize event) gerçekleştiğinde devreye giren bir geri çağırım fonksiyonudur. Değişikliğin yapıldığı anlarda, pencerenin ekran üzerindeki koordinatları güncel olarak 'xpos' (yatay) ve 'ypos' (dikey) parametrelerine geri dönmektedir.

Fonksiyon Parametreleri;
  • [in] GLFWwindow *window - Pencere konum bilgisini alacağımız pencere nesnesi
  • [in] GLFWwindowposfun 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 konumundaki 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 konumlandırıldığında çağırılacak fonksiyon (callback)
glfwSetWindowPosCallback(window, pencerePos_callback);
Pencere farklı bir konuma taşındığında, ç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 pencerePos_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 farklı konuma taşındığında, konsolu sıfırlayarak, bize güncel pencere boyut bilgilerini yazdıracaktır.

Bu yazımızda ileride ihtiyaç duyabileceğimiz pencere konum 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önder