首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PeekMessage没有收到消息吗?

PeekMessage没有收到消息吗?
EN

Stack Overflow用户
提问于 2011-06-03 03:19:48
回答 2查看 5K关注 0票数 3

我创建了一个自定义消息类型,用于调整Window的大小,名为WM_NEED_RESIZE。我在我的.h文件中定义了它,并在我的.cpp文件中初始化了它。我还注册了我的WindowProc函数以接受消息。以下是这些项目的代码:

代码语言:javascript
复制
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(..)来收集所有消息。下面是消息泵的片段:

代码语言:javascript
复制
    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(..)方法接收到了它(这对我没有太大帮助)。我很感激你们能提供的任何帮助。

谢谢

贾勒特

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-03 04:29:36

  1. 不要使用std::cout希望在调试器中看到输出,insted使用OutputDebugString();。
  2. 您需要将类指针传递到调用CreateWindowEx的最后一个参数,然后从WM_CREATE的LPCREATESTRUCT传递给您的LPCREATESTRUCT中检索该指针,您的类指针将位于结构的lpCreateParmas feild中。将clas指针设置为窗口的GWLP_USERDATA,并在任何其他消息调用中调用GetWindowsLong,检索类指针,然后将消息、wparam和lparam全部传递给内部类消息处理程序。

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-03 04:28:54

您正在显示的消息泵循环将在队列为空时立即退出。如果再被录入的话,我看不出你贴了什么。

如果这是您的主要消息泵,则应该使用GetMessage(),因为它将在返回之前等待一些可用的东西。要获得更多信息,请查看这篇MSDN文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6222635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档