如何使用SDL创建子窗口

时间:2014-02-11 01:42:09

标签: sdl sdl-2

如何在SDL中创建插入主窗口的新窗口?所以它可以集中,分别有单独的绘图上下文和流程事件。

3 个答案:

答案 0 :(得分:6)

窗口内的窗口

您可以使用以下示例在窗口中创建窗口。该示例将生成两个窗口,其中subWindow位于mainWindow.内。子窗口可以移出主窗口。如果您希望子窗口“卡在”主窗口内,您可以使用SDL_WindowEvent查看窗口移动的时间,然后使用SDL_SetWindowPosition()

将其强制放回原位

单独的事件处理

据我所知,您无法在SDL2中执行此操作。但some(如果不是全部)事件类型具有windowID成员变量。与SDL_Window上的SDL_GetWindowID()一起使用此选项可查找事件发生时哪个窗口具有焦点。

示例代码

#include <SDL2/SDL.h>
#include <iostream>

int main()
{
    SDL_Init( SDL_INIT_EVERYTHING );

    // Set postion and size for main window
    int mainSizeX = 600;
    int mainSizeY = 600;
    int mainPosX = 100;
    int mainPosY = 100;

    // Set postion and size for sub window based on those of main window
    int subSizeX = mainSizeX / 2;
    int subSizeY = mainSizeY / 2;
    int subPosX = mainPosX + mainSizeX / 4;
    int subPosY = mainPosY + mainSizeY / 4;

    // Set up main window
    SDL_Window* mainWindow = SDL_CreateWindow( "Main Window", mainPosX, mainPosY, mainSizeX, mainSizeY, 0 );
    SDL_Renderer* mainRenderer = SDL_CreateRenderer( mainWindow, -1, SDL_RENDERER_ACCELERATED );
    SDL_SetRenderDrawColor( mainRenderer , 255, 0, 0, 255 );

    // Set up sub window
    SDL_Window* subWindow  = SDL_CreateWindow( "Sub Window" , subPosX, subPosY, subSizeX, subSizeY, 0 );
    SDL_Renderer* subRenderer  = SDL_CreateRenderer( subWindow, -1, SDL_RENDERER_ACCELERATED );
    SDL_SetRenderDrawColor( subRenderer , 0, 255, 0, 255 );

    // Render empty ( red ) background in mainWindow
    SDL_RenderClear( mainRenderer );
    SDL_RenderPresent( mainRenderer );

    // Render empty ( green ) background in subWindow
    SDL_RenderClear( subRenderer );
    SDL_RenderPresent( subRenderer );

    std::cin.ignore();
}

此示例将呈现一个绿色窗口,其宽度和高度的一半位于红色窗口的中间。

答案 1 :(得分:2)

如果有人想知道如何将子窗口始终放在父窗口的顶部,并避免输入焦点在父窗口上的问题:

  1. SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH设为"1"
  2. 当父窗口收到SDL_RiseWindow 时,
  3. 在每个孩子身上使用SDL_WINDOWEVENT_FOCUS_GAINED

答案 2 :(得分:2)

SDL_CreateWindowFrom以及SDL_SetWindowInputFocus可能就是您要找的。