GLUT功能键停止刷新

时间:2016-08-12 10:53:02

标签: opengl freeglut

我在Windows 7下使用FreeGLUT 3.0.0(使用MSVC 2013从源代码构建)来创建OpenGL上下文很长一段时间,但今天我遇到了一些奇怪的行为:当我按下{时{1}}键,窗口停止刷新。以下是在MSVC 2013,Windows 7下实现这种奇怪行为的最小代码:

#define FREEGLUT_STATIC
#include <gl/glut.h>
#include <iostream>

using namespace std;

void init()
{
    glClearColor(1.0, 0.0, 0.0, 0.0);
}

void display()
{
    cout << "a" << endl;
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
    glutPostRedisplay();
}

void reshapeFunc(int width, int height)
{
    glViewport(0, 0, 640, 480);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("What?");

    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshapeFunc);

    glutMainLoop();
    return 0;
}

在此示例中,当我按F10时,命令行会停止打印字符&#39; a&#39;并在我再次按F10时继续。

奇怪的是,我没有对F10做任何特别的事情(我遇到过这个问题,因为我没有写过像GLUT_KEY_F10这样的内容)。所有其他功能键都没有这个问题。我不知道为什么这是F10密钥特有的。

有没有人对如何处理这个问题有任何建议?

1 个答案:

答案 0 :(得分:1)

根据建议here

  

F10是进入Windows菜单的快捷键。它应该足以不传递有效的HMENU句柄。我没有测试过这个。如果它不起作用,你可能想避免使用F10。

     

如果你坚持,你可以通过捕获WM_SYSKEYDOWN而不是将消息传递给DefWindowProc来获得F10。

添加一个标记以跳过DefWindowProc()SC_KEYMENU事件的... case WM_SYSCOMMAND : /* 0x0112 */ { /* HACKITTY HACK HACK HACK */ int skipDefWindowProc = 0; { /* * We have received a system command message. Try to act on it. * The commands are passed in through the "wParam" parameter: * The least significant digit seems to be which edge of the window * is being used for a resize event: * 4 3 5 * 1 2 * 7 6 8 * Congratulations and thanks to Richard Rauch for figuring this out.. */ switch ( wParam & 0xfff0 ) { case SC_SIZE : break ; case SC_MOVE : break ; case SC_MINIMIZE : /* User has clicked on the "-" to minimize the window */ /* Turning off the visibility is handled in WM_SIZE handler */ break ; case SC_MAXIMIZE : break ; case SC_NEXTWINDOW : break ; case SC_PREVWINDOW : break ; case SC_CLOSE : /* Followed very closely by a WM_CLOSE message */ break ; case SC_VSCROLL : break ; case SC_HSCROLL : break ; case SC_MOUSEMENU : break ; case SC_KEYMENU : skipDefWindowProc = 1; break ; case SC_ARRANGE : break ; case SC_RESTORE : break ; case SC_TASKLIST : break ; case SC_SCREENSAVE : break ; case SC_HOTKEY : break ; #if(WINVER >= 0x0400) case SC_DEFAULT : break ; case SC_MONITORPOWER : break ; case SC_CONTEXTHELP : break ; #endif /* WINVER >= 0x0400 */ default: #if _DEBUG fgWarning( "Unknown wParam type 0x%x", wParam ); #endif break; } } #endif /* !defined(_WIN32_WCE) */ /* We need to pass the message on to the operating system as well */ if( skipDefWindowProc == 0 ) { lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); } break; } ... 来电,FreeGLUT's WM_SYSCOMMAND handler似乎“解决了”问题:

<div id="modal" class="modal">
<div id="modalcontent" class="modal-content" >
    <div class="modal-header">
        <span class="close" onclick="closeList()" >x</span>
        <h2>Lista File</h2>
    </div>
    <div class="modal-body">

    </div>
    <div class="modal-footer">
        <span id="sendlistButt" class="send" onclick="sendList()" >salva</span>
    </div>
</div>