Glut:如何知道窗户何时移动?

时间:2009-10-13 16:32:59

标签: c++ mfc window glut

我有一个过剩的问题,我希望有一个回调知道用户何时移动我的应用程序的窗口,我没有发现任何过剩。

我的目标是只在Windows上创建应用程序,是否可以使用MFC保留我的过剩代码?

提前致谢

4 个答案:

答案 0 :(得分:2)

我找不到回叫功能,但您可以手动使用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);

答案 1 :(得分:1)

布鲁斯的想法非常好。我认为使用GLUT时没有其他选择。 我认为这种情况是GLUT没有开发的。 GLUT是OpenGL的工具包,它包含跨平台的窗口和输入管理。它有很多用途, 但是当它的窗户被拖动时,它为什么要关心呢? 我想如果你(或你的程序)关心,那么你应该实现自己的窗口和输入管理。

这引出了我的第二个问题。您可以将OpenGL与MFC一起使用(尽管我的建议很大程度上取决于您的计划)。你不应该使用GLUT,因为MFC有自己的处理输入,窗口,事件管理,渲染/绘图的方式......

如果你真的想这样做: http://www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx

答案 2 :(得分:0)

您可以尝试使用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); }

http://www.opengl.org/resources/faq/technical/glut.htm

答案 3 :(得分:0)

GLUT实际上相当有限,并且不会向客户端公开所有窗口事件。然而,它确实为WGL(在Windows上)和GLX(在X11上)提供了许多可能不值得重写的锅炉代码。

当我有一个使用GL的爱好项目,并且有些事我无法通过GLUT处理时,我所做的就是挖开开源freeglut。也就是说,下载tarball,编辑库的WindowProc(Windows)或XGetEvent()循环(在X上),只需将缺少的回调添加到库中。

您将依赖自己的GLUT修改,但它会起作用,您不必编写与直接针对WGL或GLX一样多的样板代码。

您可能希望静态链接它,以免与任何其他freeglut冲突。