aa7481542 2024-10-13 15:08 采纳率: 16.7%
浏览 18
已结题

如何让子窗口鼠标滚动独立,不要传递消息给主窗口

如何让子窗口鼠标滚动独立,不要传递消息给主窗口
现在是子窗口鼠标滚动,主窗口也跟着一起滚动,如何实现子窗口鼠标单独滚动

**我把这段注释掉了,但是问题是所有窗口都不能滚动了。**

case WM_MOUSEWHEEL:
    io.AddMouseWheelEvent(0.0f, (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA);
    return 0;

**源代码**
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
case WM_MOUSEWHEEL:
    io.AddMouseWheelEvent(0.0f, (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA);
    return 0;
case WM_MOUSEHWHEEL:
    io.AddMouseWheelEvent(-(float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f);
    return 0;
}

```

  • 写回答

19条回答 默认 最新

  • 专家-司宇[在线] 2024-10-13 15:08
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在C/C++中,当你创建一个子窗口时,它会继承父窗口的事件处理函数(ONMESSAGE)和ONSELECT,这样可以确保子窗口能够跟随父窗口的滚动行为。如果你希望子窗口能够独立地响应鼠标滚轮的移动,你需要修改子窗口的事件处理函数以使用WM_MOUSEWHEEL事件,这通常用于显示或隐藏滚动条。

    以下是一个简单的示例:

    #INCLUDE <WINDOWS.H>
    #INCLUDE <STDIO.H>
    
    TYPEDEF STRUCT {
        HWND HWND;
        WPARAM WPARAM;
    } WINDOW;
    
    WINDOW* CREATEWINDOW(HWND HWND) {
        RETURN (WINDOW*)MALLOC(SIZEOF(WINDOW));
    }
    
    VOID UPDATEWINDOW(HWND HWND, WPARAM WPARAM, LPARAM LPARAM) {
        // YOUR CODE HERE TO UPDATE THE WINDOW
    }
    
    INT MAIN() {
        HWND HWND = NULL; // CREATE A NEW WINDOW
        IF (!CREATEWINDOW(HWND)) {
            PRINTF("FAILED TO CREATE WINDOW\N");
            RETURN 1;
        }
    
        // ADD MOUSE WHEEL EVENT HANDLER
        UPDATEWINDOW(HWND, WM_MOUSEWHEEL, (LPARAM)(FLOAT)MOUSEWHEEL_DELTA);
    
        // CLEANUP
        FREE(HWND);
        RETURN 0;
    }
    

    在这个例子中,UPDATEWINDOW函数会在鼠标滚轮被点击时调用,你可以根据需要修改这个函数来适应你的需求。

    注意:MOUSEWHEEL事件仅适用于WINDOWS平台,对于其他操作系统可能不适用。如果需要兼容其他平台,你可能需要找到一种方法将鼠标滚轮事件绑定到特定的窗口上,或者寻找第三方库来支持这种事件。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月15日
  • 创建了问题 10月13日