代码之家  ›  专栏  ›  技术社区  ›  user7948302

SDL事件。窗windowID与GetWindowID()

  •  0
  • user7948302  · 技术社区  · 7 年前

    输出的 event.window.windowID SDL_GetWindowID() ?

    为什么会这样 std::cout << m_SDLEvent.window.windowID << std::endl; 输出 1819558491 在控制台中 std::cout << SDL_GetWindowID(m_SDLWindow) << std::endl; 输出 1. ?

    如何获得正确的身份证 SDL_Window* 在下面的方法中?

    void InputManager::Update()
        {
            SDL_PollEvent(&m_SDLEvent);
    
                    switch (m_SDLEvent.type)
                    {
                    case SDL_QUIT:
                        std::cout << m_SDLEvent.window.windowID << std::endl;
                        SDL_HideWindow(SDL_GetWindowFromID(m_SDLEvent.window.windowID));
                        break;
                    }
        }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   HolyBlackCat    7 年前

    您看到的是垃圾窗口ID,因为您访问的是非活动的联合字段。这是未定义的行为。

    您只能访问 m_SDLEvent.window 如果 m_SDLEvent.type == SDL_WINDOWEVENT

    但如果 m_SDLEvent.type == SDL_QUIT ,您必须使用 m_SDLEvent.quit 结构,它没有窗口id的字段(因为SDL\U QUIT不是特定于窗口的,而是意味着应该关闭整个应用程序)。

        2
  •  0
  •   user7948302 user7948302    7 年前

    好的,HolyBlackCat的回答把我带到了正确的方向。

    而不是使用 SDL_QUIT (这是整个应用程序的退出事件,而不是一个窗口)我应该检查 SDL_WINDOWEVENT_CLOSE 这是一个 SDL_WINDOWEVENT 可通过以下方式接收 m_SDLEvent.window.event 而不是 m_SDLEvent.type

    现在代码如下所示:

    void InputManager::Update()
        {
            SDL_PollEvent(&m_SDLEvent);
    
            if (m_SDLEvent.type == SDL_WINDOWEVENT)
            {
                switch (m_SDLEvent.window.event)
                {
                case SDL_WINDOWEVENT_CLOSE:
                    std::cout << m_SDLEvent.window.windowID << std::endl;
                    SDL_HideWindow(SDL_GetWindowFromID(m_SDLEvent.window.windowID));
                    break;
                }
            }
        }
    

    现在 std::cout << m_SDLEvent.window.windowID << std::endl; 输出正确的ID。