Scrolling the Window Under the Mouse

后端 未结 4 761
眼角桃花
眼角桃花 2021-01-06 06:54

If you take a look at Visual Studio 2012, you\'ll notice that if you use the mouse wheel, the window under your mouse will scroll, and not the focused window. That is, if yo

相关标签:
4条回答
  • 2021-01-06 07:21

    Handle the WM_MOUSEWHEEL message in both the parent and in child windows that should receive the message.

    Do something like this in your WM_MOUSEWHEEL handler for your child window:

        POINT mouse;
        GetCursorPos(&mouse);
        if (WindowFromPoint(mouse) != windowHandle)
        {
            // Sends the WM_MOUSEWHEEL message to your parent window
            return DefWindowProc(windowHandle, message, wParam, lParam);
        }
    

    Then in the WM_MOUSEWHEEL handler for your parent window you do:

        POINT mouse;
    
        GetCursorPos(&mouse);
        HWND hwnd = WindowFromPoint(mouse);
    
        SendMessage(hwnd, message, wParam, lParam);
    

    This way, if the child window has focus, the other window that actually has the mouse pointer hovering over it will receive the WM_MOUSEWHEEL message.

    0 讨论(0)
  • 2021-01-06 07:29

    Apparently we can address this issue at the heart of the program. Look at your code for the message loop, which should be in your WinMain method:

    while (GetMessage (&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    

    Here, we just need to say that if the message is a WM_MOUSEWHEEL message, that we want to pass it to the window under the mouse, and not the focus window:

    POINT mouse;
    
    while (GetMessage (&msg, NULL, 0, 0) > 0)
    {
        //Any other message.
        if (msg.message != WM_MOUSEWHEEL)
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
        //Send the message to the window over which the mouse is hovering.
        else
        {
            GetCursorPos (&mouse);
            msg.hwnd = WindowFromPoint (mouse);
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }
    

    And now, the window under your mouse will always get scroll messages, and not the focused window.

    0 讨论(0)
  • 2021-01-06 07:44

    I found out that it is much simpler to override the PreTranslateMessage function in you app class.

    BOOL MyApp::PreTranslateMessage(MSG* pMsg)
    {
        POINT mouse;
        CWnd* windowUnderMouse;
    
        if (pMsg->message == WM_MOUSEWHEEL)
        {
            GetCursorPos(&mouse);       
            pMsg->hwnd = WindowFromPoint(mouse);
        }
    
        return CWinApp::PreTranslateMessage(pMsg);
    }
    

    Hope that it will help someone.

    0 讨论(0)
  • 2021-01-06 07:44

    Just a modification of the previous answer. Mouse coordinates embedded in the message should be used instead of the current ones, they may differ if the message processing is delayed.

    BOOL CMyApp::PreTranslateMessage (MSG* pMsg)
    {
        if (pMsg -> message == WM_MOUSEWHEEL)
            pMsg -> hwnd = WindowFromPoint (CPoint (GET_X_LPARAM (pMsg -> lParam), GET_Y_LPARAM (pMsg -> lParam)));
    
        return CWinAppEx::PreTranslateMessage (pMsg);
    }
    
    0 讨论(0)
提交回复
热议问题