SCREEN_WIDTH = 1200、および SCREEN_HEIGHT = 800 を使用。
まず、画面の (x = 0, y = 0, w = 40, h = 40) にボックスを描画します。
次に、handleMouse 関数を使用して、マウスがクリックされた場所の x 座標と y 座標を返します。
問題は、プログラムが最大化されていないウィンドウモードで起動したときに、ボックスの右下隅をクリックすると、返される座標が x = 40、y = 32 になることです。 x = 40、y = 40 を返します。
問題が正しく描画されていないのか、関数が間違った x/y を返しているのかはわかりません。
openGL のレンダリング、変換、および glOrth がどのように機能するかを理解していると思いますが、完全に間違っている可能性があります。Windows Decor (Windows 7 を使用) がこの問題を引き起こす可能性があるといういくつかの提案をオンラインで見ましたが、説明はほとんど行われておらず、解決策も提供されていません。
これは私のソースコード全体です。私は自分のゲームから基本に至るまですべてを取り除きましたが、問題はまだ解決していません:( .人々が私の問題を見ることができるように2つの写真を追加しました.最大化されていないウィンドウ(上の写真)で、右下隅をクリックすると, 返された座標は 41,32 です. y 座標が本来あるべき値よりも小さいです. そして最大化されたウィンドウ (下の画像) で同じコーナーをクリックすると, 正しい座標 40, 40 が返されます. これらの結果は両方で発生します.私の元のソース コードと genpfault の推奨コード。
//写真を投稿できないことがわかりました:(、代わりにリンク。
main.cpp
int main( int argc, char* args[] )
{
//Initialize FreeGLUT
glutInit( &argc, args );
//Create OpenGL 2.1 context
glutInitContextVersion( 2, 1 );
//Create Double Buffered Window
glutInitDisplayMode( GLUT_DOUBLE );
glutInitWindowSize( SCREEN_WIDTH, SCREEN_HEIGHT );
glutCreateWindow( "OpenGL" );
//Do post window/context creation initialization
if( !initGL() )
{
printf( "Unable to initialize graphics library!\n" );
return 1;
}
//initGame();
glutMouseFunc(handleMouse);
glutDisplayFunc( render );
glutMainLoop();
return 0;
}
関数.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
bool initGL();
void render();
void handleMouse(int button, int state, int x, int y);
#endif
関数.cpp
bool initGL()
{
//Initialize clear color
glClearColor( 0.f, 0.f, 0.f, 1.f );
//Check for error
GLenum error = glGetError();
if( error != GL_NO_ERROR )
{
//cout <<"Error initializing OpenGL! " << gluErrorString( error ) << endl;
return false;
}
return true;
}
void render()
{
//Clear color buffer
glClear( GL_COLOR_BUFFER_BIT );
glColor3f(1.f,1.f,1.f);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0, 41);
glVertex2f(41, 41);
glVertex2f(41, 0);
glEnd();
glutSwapBuffers();
}
void handleMouse(int button, int state, int x, int y)
{
std::cout << x << '\t' << y << std::endl;
}
定数.h
const int SCREEN_WIDTH = 1200;
const int SCREEN_HEIGHT = 800;