【问题标题】:SDL2 Raising a window without giving it focusSDL2 提高一个窗口而不给它焦点
【发布时间】:2014-08-04 20:02:41
【问题描述】:

我需要在窗口上显示工具提示。我正在使用工具提示创建第二个窗口,并使用 SDL_RaiseWindow() 将其置于顶部。但是,这样做会导致工具提示窃取焦点,这不是我想要的。有没有办法在不改变焦点的情况下将窗口带到顶部?

另外,有没有办法在不改变窗口 Z 顺序的情况下设置焦点(鼠标和/或键盘)?

【问题讨论】:

  • 作为在黑暗中的总刺,您可以尝试更改主窗口的窗口标志。不过,请在致电 SDL_RaiseWindow() 后执行此操作。假设您的主窗口指针被称为 m_window 并且凸起的窗口是 m_raised 它将是 m_window->flags |= SDL_WINDOW_INPUT_FOCUS 然后是 m_raised->flags &= ~SDL_WINDOW_INPUT_FOCUS 您可能还需要手动调用 SDL_OnWindowFocusGained(m_window)SDL_OnWindowFocusLost(m_raised) - 这些都没有经过测试,它只是“可能” ' 工作。

标签: window sdl-2 setfocus


【解决方案1】:

Neil 提供的答案仅适用于 X11,因为 SDL_SetWindowInputFocus() 仅适用于该环境。本质上,否则无法实现所需的行为。我已经看到 SDL 论坛中有一个功能请求,要求重载 SDL_RaiseWindow() 函数以包含可选的 bool 参数,以指示凸起的窗口是否也应该接收输入焦点。我希望他们确实实现这一点。

无论如何,SDL 2.x 下对多窗口的支持有点弱。没有内置支持不同窗口的 Z 顺序,尝试基于“画家的方法”构建一个有效,但无法控制输入焦点。

【讨论】:

    【解决方案2】:

    老问题,但这是在我自己的搜索过程中出现的。您可以尝试SDL_RaiseWindow() 将工具提示置于顶部,然后在主窗口中使用SDL_SetWindowInputFocus() 将焦点切换回它。

    【讨论】:

      【解决方案3】:

      通过使用带有 SDL2 的 SDL_WINDOW_ALWAYS_ON_TOP 标志,我在 Mac 上的工具提示中充分发挥了作用:

      SDL_CreateWindow(tooltip_window->name, x, y, w, h,
          SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS |
          SDL_WINDOW_ALWAYS_ON_TOP);
      SDL_RaiseWindow(windowThatShouldHaveFocus);
      // ...render what you want on that tooltip (SDL_RenderClear, SDL_RenderCopy, SDL_RenderPresent) & hide it with SDL_HideWindow
      

      当显示工具提示时:

      SDL_ShowWindow(tooltipWindow);
      SDL_RaiseWindow(windowThatShouldHaveFocus);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        相关资源
        最近更新 更多