我有一个过剩的问题,我希望有一个回调知道用户何时移动我的应用程序的窗口,我没有发现任何过剩。
我的目标是只在Windows上创建应用程序,是否可以使用MFC保留我的过剩代码?
提前致谢
答案 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)
这引出了我的第二个问题。您可以将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);
}
答案 3 :(得分:0)
GLUT实际上相当有限,并且不会向客户端公开所有窗口事件。然而,它确实为WGL(在Windows上)和GLX(在X11上)提供了许多可能不值得重写的锅炉代码。
当我有一个使用GL的爱好项目,并且有些事我无法通过GLUT处理时,我所做的就是挖开开源freeglut。也就是说,下载tarball,编辑库的WindowProc(Windows)或XGetEvent()循环(在X上),只需将缺少的回调添加到库中。
您将依赖自己的GLUT修改,但它会起作用,您不必编写与直接针对WGL或GLX一样多的样板代码。
您可能希望静态链接它,以免与任何其他freeglut冲突。