3

のサイズ変更に使用するカスタムメッセージタイプを作成しましWindowWM_NEED_RESIZE。.hファイルで定義し、.cppファイルで初期化しました。WindowProcメッセージを受け入れる機能も登録しました。これらのアイテムのコードは次のとおりです。

const uint32 WindowsGLWindow::WM_NEED_RESIZE = WM_USER + 100;
LONG WINAPI WindowsGLWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static PAINTSTRUCT ps;// do I need this?
    static sint32 newWidth = 0;
    static sint32 newHeight = 0;
    bool res = false;

    switch (uMsg) {
        case WM_PAINT:
            //display();
            BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
            return 0;

        case WM_SIZE:
            //glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
            res = PostMessage(hWnd, WindowsGLWindow::WM_NEED_RESIZE, wParam,     lParam);
            std::cout << "WM_SIZE: " << res << std::endl;
            return 0;

        case WindowsGLWindow::WM_NEED_RESIZE:
            std::cout << "WindowsGLWindow::WM_NEED_RESIZE" << std::endl;
            break;

        case WM_CHAR:
            switch (wParam) {
                case 27: /* ESC key */
                    PostQuitMessage(0);
                    break;
            }
            return 0;

        case WM_CLOSE:
            PostQuitMessage(0);
            return 0;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

別の機能ではPeekMessage(..)、すべてのメッセージを収集するために実行しています。メッセージポンプのスニペットは次のとおりです。

    MSG msg;
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE) == TRUE) // maybe use GetInputState(?)     as well?
    {
        if (msg.message == WM_QUIT)
            retVal = -1;

        if (msg.message == WindowsGLWindow::WM_NEED_RESIZE) {
            uint32 newWidth = LOWORD(msg.lParam);
            uint32 newHeight = HIWORD(msg.lParam);

            std::cout << "PeekMessage: WindowsGLWindow::WM_NEED_RESIZE" <<         std::endl;

            // call resize only if our window-size changed
            if ((newWidth != width_) || (newHeight != height_)) {
                resize(newWidth, newHeight);
            }

            PostMessage(msg.hwnd, WM_PAINT, 0, 0);
        }

        switch (msg.message) {
            case WM_MOUSEMOVE:
                // Retrieve mouse screen position
                //int x = (short) LOWORD(lParam);
                //int y = (short) HIWORD(lParam);

                // Check to see if the left button is held down:
                //bool leftButtonDown = wParam & MK_LBUTTON;

                // Check if right button down:
                //bool rightButtonDown = wParam & MK_RBUTTON;
                break;
            case WM_LBUTTONDOWN:
            case WM_RBUTTONDOWN:
            case WM_LBUTTONUP:
            case WM_RBUTTONUP:
            case WM_KEYUP:
            case WM_KEYDOWN:
                /*
                switch (msg.wParam) {
                    case 'W':
                        // w key pressed
                        break;
                    case VK_RIGHT:
                        // Right arrow pressed
                        break;
                    default:
                        break;
                }
                */
                break;
        }

        TranslateMessage(&msg);
        DispatchMessage(&msg);

    }

私の問題は、ウィンドウが最初に開いたときにメッセージがメッセージキューで一度WM_NEED_RESIZEだけ検出され、その後はメッセージキューでメッセージが検出されないことです。なぜこれが起こっているのか本当にわかりません。ただし、メソッドによって受信されていますこれは実際には役に立ちません)。私はあなたたちが提供できるどんな助けでもありがたいです。PeekMessage(..)WindowProc(..)

ありがとう

ジャレット

4

2 に答える 2

2
  1. デバッガーでその出力が表示されることを期待してstd::coutを使用しないでください、insted use OutputDebugString(); 。

  2. クラスポインタをCreateWindowExの呼び出しの最後のパラメータに渡す必要があります。次に、WM_CREATEのLPARAMで渡されたLPCREATESTRUCTからそのポインタを取得します。クラスポインタは、構造体のlpCreateParmasフィールドにあります。クラスポインタをウィンドウのGWLP_USERDATAに設定し、他のメッセージ呼び出しでは、GetWindowsLongを呼び出し、クラスポインタを取得してから、メッセージ、wparam、およびlparamをすべて内部クラスメッセージハンドラに渡します。

http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

于 2011-06-03T04:29:36.540 に答える
0

表示しているメッセージポンプループは、キューが空になるとすぐに終了します。あなたが投稿したものから、それが再び入力されたかどうかはわかりません。

これがメインのメッセージポンプである場合は、代わりにGetMessage()を使用する必要があります。これは、何かが利用可能になるまで待機してから戻るためです。詳細については、このMSDNの記事を参照してください。

于 2011-06-03T04:28:54.970 に答える