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;
- glfwGetWindowPos fonksiyonu
- glfwSetWindowPosCallback, geri çağırım (callback) fonksiyonu
// PrototipBu fonksiyon ilgili pencerenin, ekran üzerindeki 'x' ve 'y' koordinatlarını tahsis etmektedir.
void glfwGetWindowPos(GLFWwindow *window, int *xpos, int *ypos);
// Kullanımı
glfwGetWindowPos(window, &xpos, &ypos);
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.
// Pencere konum (pos) değişkenleriPencerenin konum bilgisini almak ve sonuçları konsol penceresine yazdırmak için global düzeyde değişkenler tanımlıyoruz.
int xpos;
int ypos;
// Klavye mesajlarının işlendiği callback fonksiyonuPeş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.
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;
}
}
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ı.
// Konsol temizleme sabitleriBu 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.
#ifdef _WIN32
#define CLEAR "cls"
#else // Windows dışı işletim sistemleri (Other OS) için...
#define CLEAR "clear"
#endif
#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)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.
glfwSetWindowPosCallback(window, pencerePos_callback);
void pencerePos_callback(GLFWwindow *window, int width, int height)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.
{
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;
}
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