2012-07-04 15 views
8

फ्रीग्लूट लाइब्रेरी का उपयोग करते हुए ओपनजीएल के साथ खेलना, मैंने फैसला किया कि मैं अपने अगले प्रशिक्षण प्रोजेक्ट के लिए जीएलएफडब्ल्यू का उपयोग करूंगा, क्योंकि मुझे बताया गया था कि जीएलयूटी केवल सीखने के उद्देश्यों के लिए डिज़ाइन किया गया था और पेशेवर रूप से इसका इस्तेमाल नहीं किया जाना चाहिए। मुझे अपने नेटबीन प्रोजेक्ट में lib को जोड़ने में कोई समस्या नहीं थी और यह mingw32 4.6.2 का उपयोग करके ठीक है।जीएलएफडब्ल्यू स्क्रीन की ऊंचाई/चौड़ाई प्राप्त करते हैं?

हालांकि, मैं स्क्रीन के केंद्र में विंडो को स्थान देने की कोशिश करने में कठिनाइयों में भाग रहा हूं। freeglut के तहत, मैं पहले प्रयोग किया है:

glutInitWindowPosition ( 
         (glutGet(GLUT_SCREEN_WIDTH)-RES_X)/2, 
         (glutGet(GLUT_SCREEN_HEIGHT)-RES_Y)/2 
         ); 

मैं किसी भी glfw समारोह है कि स्क्रीन आकार या चौड़ाई वापसी होगी नहीं मिल रहा। क्या ऐसा कोई कार्य बस कार्यान्वित नहीं किया गया है?

उत्तर

8

कैसे glfwGetDesktopMode, मुझे लगता है कि यह वही है जो आप चाहते हैं।

उदाहरण:

GLFWvidmode return_struct; 

glfwGetDesktopMode(&return_struct); 

int height = return_struct.Height; 
+0

मैं एक तरह से उलझन में हूँ, glfw.h में यह कहते हैं: 'typedef struct { पूर्णांक चौड़ाई, ऊंचाई, int रेडबिट्स, ब्लूबिट्स, ग्रीन बिट्स; } GLFWvidmode; उदाहरण के लिए, यदि मैं ऊंचाई प्राप्त करना चाहता हूं तो मुझे तर्क के रूप में क्या उपयोग करना चाहिए? – CaffeineAddict

+0

@ साइबरपुनसी: आप चौड़ाई और ऊंचाई को अलग से नहीं पूछते हैं। आप एक कॉल में * दोनों * प्राप्त करते हैं। आप एक खाली संरचना पास करते हैं, और यह उन सभी क्षेत्रों के साथ भरता है। आप जिन क्षेत्रों की परवाह करते हैं उन्हें पढ़ते हैं, और बाकी को अनदेखा करते हैं। –

+0

क्या मुझे ढेर का उपयोग करना है? क्या यह सब थोड़ा महंगा नहीं है? संरचना क्यों? क्या इसे अज्ञात ऑब्जेक्ट के रूप में पास करने का कोई तरीका है? संपादित करें: 'std :: cout << return_struct-> ऊंचाई <<" "<< वापसी_स्ट्रक्चर-> चौड़ाई << std :: endl;' सिर्फ प्रिंट "0 0" – CaffeineAddict

4

पहले आप अपनी चौड़ाई और ऊंचाई स्टोर करने के लिए दो चर की जरूरत है।

int width, height; 
तो

reference.

glfwSetWindowPos(width/2, height/2); 

के पेज 14 पर वर्णित है और एक बोनस के रूप में आप तो कॉल कर सकते हैं

glfwGetWindowSize(&width, &height); 
इस

एक शून्य समारोह और किसी भी मूल्य वापस नहीं करता है, लेकिन यह के रूप में दो पहले घोषित चर अपडेट करेगा .. इसलिए इसे मेनलोप या विंडो रीशेप कॉलबैक फ़ंक्शन में रखें।

आप पेज 15

+0

यह विंडो को केंद्र में नहीं रखेगा, 'glfwSetWindowPos (स्क्रीनविड्थ/2 - विंडोविड्थ/2, ...) का उपयोग करें;' इसके बजाए। – danijar

+0

@sharethis मैंने यह नहीं कहा था .. वह फिर से अपना प्रश्न पढ़ेगा .. उसने समारोह के लिए अपने प्रश्न के हिस्से के रूप में पूछा जो खिड़की के आकार को वापस कर देगा .. – iKlsR

2

यह किसी को मदद कर सकता है पर आधिकारिक मैनुअल here में इसकी जांच कर सकते हैं ...

void Window::CenterTheWindow(){ 
      GLFWmonitor* monitor = glfwGetPrimaryMonitor(); 
      const GLFWvidmode* mode = glfwGetVideoMode(monitor); 
      glfwSetWindowPos(m_Window, (mode->width - m_Width)/2, (mode->height - m_Height)/2); 
} 

m_Width और m_Height चर चौड़ाई और खिड़की की ऊंचाई होती है ।

संदर्भ: http://www.glfw.org/docs/latest/monitor.html

+0

यह समाधान सही है, लेकिन जब खिड़की खोला नहीं जाता है प्राथमिक मॉनीटर इस समाधान पर काम नहीं करेगा। – MahanGM

0
// Settings 
int SCR_WIDTH = 800; 
int SCR_HEIGHT = 600; 
char TITLE[] = "Stack Overflow"; 
/*..Initilized..*/ 
const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); 
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH,SCR_HEIGHT,TITLE,nullptr,nullptr); 
// Because (x,y) starts from the top left corner, We got to subtract our window size. 
glfwSetWindowPos(window,(mode->width-SCR_WIDTH)/2,(mode->height-SCR_HEIGHT)/2); 
//divided by two to center. 
संबंधित मुद्दे