使用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)可能会导致这个问题,但是解释很少,也没有提供解决方案。
这是我的完整源代码。我已经剥离了从游戏到基础的所有内容,问题仍然存在:(。我添加了两张图片,以便人们可以看到我的问题。在非最大化的窗口(顶部图片)中,点击右下角,返回的坐标是41,32; y坐标小于应有的坐标。在MAXIMIZED WINDOW(底部图片)中,当点击同一个角时,它返回正确的坐标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;
}
Functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
bool initGL();
void render();
void handleMouse(int button, int state, int x, int y);
#endif
Functions.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;
}
constants.h
const int SCREEN_WIDTH = 1200;
const int SCREEN_HEIGHT = 800;
答案 0 :(得分:0)
尝试将四边形从显示器边缘移开,因为当我尝试做类似的事情时,屏幕边缘非常奇怪
glBegin(GL_QUADS);
glVertex2f(20,20);
glVertex2f(20, 61);
glVertex2f(61, 61);
glVertex2f(61, 20);
glEnd();
答案 1 :(得分: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()
。