2016-08-12 10 views
1

Windows 7でOpenGLコンテキストを作成するためにFreeGLUT 3.0.0(MSVC 2013を使用してソースからビルド)を使用しましたが、今日は奇妙な動作が発生しました:F10キーを押すと、ウィンドウは更新されてに更新されます。GLUTファンクションキーのリフレッシュ

#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を押すと、コマンドラインが文字を印刷するのに停止し「」、およびときに私続く:MSVC 2013、Windows 7の下に、この奇妙な動作を達成する最小限のコードを以下に示します再びF10を押してください。

奇妙なことは、F10に特別なことをしなかったことです(この問題は、私がGLUT_KEY_F10のようなものを書かなかった点から遭遇しました)。その他のファンクションキーにはこの問題はありません。私はなぜこれがF10キーに固有であるのかわかりません。

誰もこの問題に対処する方法について提案はありますか?

+1

編集をFreeGLUTはソースからビルドされているか、バイナリなどを使用していますか?) – genpfault

+1

@genpfault Thx。私は問題がまだ現れる最小の実行可能コードで質問を編集しました。 – Narusaki

答えて

1

としてはhereを提案:

F10は、Windowsのメニューを入力するショートカットキーです。それは、有効なHMENUハンドルを渡さないように十分でなければなりません。私はこれをテストしていない。それでもうまくいかない場合は、F10を使わないでください。

あなたが主張するのであれば、WM_SYSKEYDOWNをキャッチしてDefWindowProcにメッセージを渡すことでF10を得ることができます。

FreeGLUT's WM_SYSCOMMAND handlerSC_KEYMENUイベントのDefWindowProc()呼び出しをスキップするようにフラグを追加する問題「解決」のようです:ご使用の環境(OS、FreeGLUTについてMCVE]&より多くの情報の中

... 

    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; 
     } 

... 
+0

ありがとうございましたgenpfault、私はこれを試して、それは実際に働いた:) – Narusaki

関連する問題