5

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;
4

2 に答える 2

0

クワッドをディスプレイの端から離してみてください。そのようなことをしようとしたとき、画面の端が非常に奇妙だったからです

glBegin(GL_QUADS);
 glVertex2f(20,20);
 glVertex2f(20, 61);
 glVertex2f(61, 61);
 glVertex2f(61, 20);
glEnd();
于 2012-11-15T18:58:06.847 に答える
0

これは、Aero および Classic の Windows 7 で問題なく動作します。

#include <GL/glut.h>
#include <iostream>

void render()
{
    glClearColor( 0, 0, 0, 1 );
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho(0, w, h, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3ub( 255, 255, 255 );
    glBegin(GL_QUADS);
        glVertex2f(0,0);
        glVertex2f(41, 0);
        glVertex2f(41, 41);
        glVertex2f(0, 41);
    glEnd();

    glutSwapBuffers();
}

void handleMouse(int button, int state, int x, int y)
{
    std::cout << x << '\t' << y << std::endl;
}

int main( int argc, char* args[] )
{
    glutInit( &argc, args );

    glutInitDisplayMode( GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "OpenGL" );

    glutMouseFunc(handleMouse);
    glutDisplayFunc( render );
    glutMainLoop();
    return 0;
}

最も注目すべきは、ランタイムglutGet()ウィンドウ サイズ クエリをに追加したことrender()です。

于 2012-11-15T19:34:18.190 に答える