2

我有 glut 的问题,我想有一个回调来知道用户何时移动我的应用程序的窗口,但我没有在 glut 中找到任何东西。

我的目标是仅在 Windows 上制作应用程序,是否可以通过 MFC 保留我的过剩代码来做到这一点?

提前致谢

4

4 回答 4

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);
于 2009-10-13T22:36:45.703 回答
1

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

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

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

于 2009-10-13T23:49:02.870 回答
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

于 2009-12-22T03:52:25.823 回答
0

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

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

您将依赖于您自己的 GLUT 修改,但它会起作用,而且您不必像直接针对 WGL 或 GLX 那样编写尽可能多的样板代码。

您可能希望静态链接它,这样它就不会与任何其他 freeglut 冲突。

于 2009-12-22T04:26:46.353 回答