我有 glut 的问题,我想有一个回调来知道用户何时移动我的应用程序的窗口,但我没有在 glut 中找到任何东西。
我的目标是仅在 Windows 上制作应用程序,是否可以通过 MFC 保留我的过剩代码来做到这一点?
提前致谢
我找不到回调函数,但您可以通过以下方式手动完成glutGet
:
int glutGet(GLenum state);
您可能会做的一个例子是:
bool window_change(void)
{
int init_x = glutGet(GLUT_INIT_WINDOW_X);
int init_y = glutGet(GLUT_INIT_WINDOW_Y);
int pos_x = glutGet(GLUT_WINDOW_X);
int pos_y = glutGet(GLUT_WINDOW_Y);
return (init_x != pos_x || init_y != pos_y);
}
如果它从初始位置移动,这将返回 true。如果您想查看自上次检查后是否已移动,请尝试:
bool window_change(void)
{
static int init_x = glutGet(GLUT_INIT_WINDOW_X);
static int init_y = glutGet(GLUT_INIT_WINDOW_Y);
int pos_x = glutGet(GLUT_WINDOW_X);
int pos_y = glutGet(GLUT_WINDOW_Y);
bool result = init_x != pos_x || init_y != pos_y;
init_x = pos_x;
init_y = pos_y;
return result;
}
您可以使用以下函数设置窗口位置:glutPositionWindow
void glutPositionWindow(int x, int y);
布鲁斯的想法非常好。我认为使用 GLUT 时没有其他选择。我认为这种情况不是 GLUT 开发的。GLUT 是一个用于 OpenGL 的工具包,它封装了跨平台的窗口和输入管理。它有很多用途,但是当它的窗口被拖动时,它为什么要关心呢?我认为,如果您(或您的程序)关心,那么无论如何您都应该实现自己的窗口和输入管理。
这让我想到了你的第二个问题。您可以将 OpenGL 与 MFC 一起使用(尽管我的建议很大程度上取决于您的计划)。那么你不应该使用 GLUT,因为 MFC 有自己的处理输入、窗口、事件管理、渲染/绘图的方式......
如果你真的想这样做: http: //www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx
您可以尝试使用 glutTimerFunction 定期调用 Bruce 的示例函数。它必须采用一个整数作为参数,用于标识回调请求的来源。glutTimerFunction 也被设计为只被调用一次,然后它会自行删除。但是,它可以自行安排呼叫。我使用 PyOpenGL 遇到了这个问题,所以我不会经历 C 的痛苦来编译它。从布鲁斯的慷慨的例子改变。显然是一个黑客,但比报废更好。
int main(void)
{
...
glutTimerFunc(0, window_change, 0);
}
void window_change(int id)
{
int init_x = glutGet(GLUT_INIT_WINDOW_X);
int init_y = glutGet(GLUT_INIT_WINDOW_Y);
int pos_x = glutGet(GLUT_WINDOW_X);
int pos_y = glutGet(GLUT_WINDOW_Y);
...
/* call back again after 1 second has passed */
glutTimerFunc (1000, window_change, id);
}
GLUT 实际上是相当有限的,并且不会向客户端公开所有窗口事件。然而,它确实为 WGL(在 Windows 上)和 GLX(在 X11 上)提供了很多可能不值得重写的锅炉代码板。
当我有一个使用 GL 的爱好项目,并且有一些我无法通过 GLUT 处理的事件时,我所做的是 fork 开源freeglut。也就是说,下载 tarball,编辑库的 WindowProc (Windows) 或 XGetEvent() 循环(在 X 上),然后简单地将缺少的回调添加到库中。
您将依赖于您自己的 GLUT 修改,但它会起作用,而且您不必像直接针对 WGL 或 GLX 那样编写尽可能多的样板代码。
您可能希望静态链接它,这样它就不会与任何其他 freeglut 冲突。