aa7481542 2024-10-12 11:36 采纳率: 16.7%
浏览 27

C++ 如何让鼠标在子窗口里面实现独立滚动,不传递消息给父窗口

如何让鼠标在子窗口里面实现独立滚动,不传递消息给父窗口



```c++

class Menu
{
public:
    static void DrawMain(const ImFontAtlas* FontAtlas)
    {
        ImGui::PushFont(FontAtlas->Fonts[3]);

        MenuPlayerLists::Render(FontAtlas);

        ImGui::PopFont();
        if (GameData.Config.Window.Setting)
        {
            ImGui::PushFont(FontAtlas->Fonts[2]);
            const ImVec2 Spacing = ImGui::GetStyle().ItemSpacing;
            ImGui::Begin("test", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoBackground);
            ImGui::SetWindowPos(ImVec2(1000, 1000), ImGuiCond_Always);
            ImGui::SetNextWindowSize({ Style::Window::Size.x + Spacing.x, Style::Window::Size.y + Spacing.y });
            ImGui::Begin(U8("Ping"), &GameData.Config.Window.Setting, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar);
            {
                ImVec2 Pos = ImGui::GetWindowPos();
                ImVec2 OPos = Pos;
                Pos.x += Spacing.x / 2;
                Pos.y += Spacing.y / 2;
                ImGui::GetWindowDrawList()->AddRectFilled(Pos, ImVec2(Pos.x + Style::Window::Size.x, Pos.y + Style::Window::Size.y), ImGui::GetColorU32(Style::Window::Background), Style::Window::Rounding);
                ImGui::SetCursorPos(ImVec2(Style::Padding + Spacing.x / 2, Style::Padding));
                ImGui::PushFont(FontAtlas->Fonts[1]);
                ImGui::PopFont();

```

  • 写回答

2条回答 默认 最新

  • 香格里辣 2024-10-12 11:37
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在C++中,如果你使用的是像ImGui这样的UI库来创建子窗口,并且想要让鼠标在子窗口内实现独立滚动而不传递消息给父窗口,你可以通过设置ImGui窗口的标志(flags)来实现这一点。

    在你的代码中,你已经使用了ImGuiWindowFlags来设置窗口的行为。为了实现独立滚动,你可以尝试添加ImGuiWindowFlags_NoMouseWheel标志,这将禁止鼠标滚轮事件传递给该窗口。这样,在子窗口内滚动时,父窗口不会收到任何关于滚轮的消息。

    以下是一个例子,展示了如何在你的代码中添加这个标志:

    ImGui::Begin("子窗口名称", &GameData.Config.Window.Setting, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMouseWheel);
    

    这样设置后,鼠标在子窗口内的滚动将不会影响到父窗口。需要注意的是,这只适用于ImGui这类UI库,如果你使用的是其他库或者自定义的窗口处理逻辑,可能需要采用不同的方法来实现。

    另外,对于ImGui中的滚动条,如果你想隐藏滚动条但仍然允许滚动操作(通过鼠标滚轮或键盘导航),你可以使用ImGui::Scrollbars()函数来控制滚动条的显示。如果你想完全隐藏滚动功能,除了设置ImGuiWindowFlags_NoScrollbar标志外,还需要确保不调用与滚动相关的函数或控件。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月12日