2012-07-04 56 views
8

OpenGLをしばらく使って遊んで、フリーグルットライブラリを使って、私は次のトレーニングプロジェクトにGLFWを使用することにしました.GLUTは学習目的で設計されたものであり、プロフェッショナルでは使用しないでください。私はlibをNetBeansプロジェクトにリンクすることに問題はなく、mingw32 4.6.2を使ってうまくコンパイルします。GLFWの画面の高さ/幅を取得しますか?

しかし、画面の中央にウィンドウを配置しようとすると、問題が発生しています。 は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は構造体{int型 幅、高さ;int RedBits、BlueBits、GreenBits; } GLFWvidmode; '例えば、高さを取得したい場合は、引数として使用するはずですか? – CaffeineAddict

+0

@Cyber​​punC:幅と高さを別々に要求しません。 1回の呼び出しで*両方*を取得します。あなたは空の構造体を渡し、それらのフィールドすべてを埋め込みます。気になるフィールドを読んだり、残りのフィールドを無視したりします。 –

+0

ヒープを使用する必要がありますか?これは少し高価なものではありませんか?なぜ構造体ですか?これを匿名オブジェクトとして渡す方法はありますか?編集: 'std :: cout << return_struct->高さ<<" "return_struct->幅<< std :: endl;'ちょうど "0 0"を出力します – CaffeineAddict

4

は、まず、あなたの幅と高さを格納するための2つの変数を必要とします。 reference.

glfwSetWindowPos(width/2, height/2); 

の14ページで説明し、ボーナスとしてあなたは

glfwGetWindowSize(&width, &height); 

これはvoid関数を呼び出すことができます。しかし、それを任意の値を返さないよう、次に

int width, height; 

以前に宣言された2つの変数を更新します。そのため、mainloopまたはウィンドウ再構築コールバック関数に置きます。

あなたは

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_Widthm_Heightは、幅とウィンドウの高さを持っている変数です...これは誰かに役立つかもしれない

+0

これは、ウィンドウを中央に配置せず、代わりに 'glfwSetWindowPos(ScreenWidth/2 - WindowWidth/2、...);'を使用します。 – danijar

+0

@sharethis私はそれが再び彼の質問を読むと言っていませんでした。彼は窓のサイズを返す関数の彼の質問の一部として質問しました.. – iKlsR

2

15ページの公式マニュアルhereでこれを確認することができます。

参考: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. 
関連する問題