【问题标题】:Glut: how to know when the window is moving?Glut:如何知道窗口何时移动?
【发布时间】:2009-10-13 16:32:59
【问题描述】:

我遇到了 glut 的问题,我想要回调以了解用户何时移动我的应用程序的窗口,但我没有在 glut 中找到任何内容。

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

提前致谢

【问题讨论】:

    标签: c++ mfc window glut


    【解决方案1】:

    我找不到回调函数,但您可以使用 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 拖动窗口时,您的程序会被冻结。也许为此创建一个线程?但是如果你只点击程序窗口栏(我不记得正确的术语)而不移动窗口,代码将不起作用。
    • 是的,我已经检查过了,据我所知,没有办法检查窗口是否在移动。您必须创建一个线程。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的帮助。看来我别无选择,我将不得不按照你的建议去做。这令人沮丧,因为一切都适用于过剩,但只有这个问题......
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        相关资源
        最近更新 更多