【发布时间】:2009-10-13 16:32:59
【问题描述】:
我遇到了 glut 的问题,我想要回调以了解用户何时移动我的应用程序的窗口,但我没有在 glut 中找到任何内容。
我的目标是仅在 Windows 上制作应用程序,是否可以使用 MFC 来保留我的过剩代码?
提前致谢
【问题讨论】:
我遇到了 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);
【讨论】:
Bruce 的想法非常好。我认为使用 GLUT 时没有其他选择。 我认为这种情况不是 GLUT 开发的。 GLUT 是一个用于 OpenGL 的工具包,它封装了跨平台的窗口和输入管理。它有很多用途, 但是,当它的窗口被拖动时,它为什么要关心呢? 我认为如果您(或您的程序)关心,那么无论如何您都应该实现自己的窗口和输入管理。
这让我想到了你的第二个问题。您可以将 OpenGL 与 MFC 一起使用(尽管我的建议很大程度上取决于您的计划)。那么你不应该使用 GLUT,因为 MFC 有自己的处理输入、窗口、事件管理、渲染/绘图的方式......
如果你真的想这样做: http://www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx
【讨论】:
您可以尝试使用 glutTimerFunction 定期调用 Bruce 的示例函数。它必须采用一个整数作为参数,用于标识回调请求的来源。 glutTimerFunction 也被设计为只被调用一次,然后它会自行删除。但是,它可以自行安排呼叫。我使用 PyOpenGL 遇到了这个问题,所以我不会经历 C 的痛苦来编译它。从布鲁斯慷慨的例子中改变。显然是 hack,但比报废要好。
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 冲突。
【讨论】: