C++ SDL2.0和悬挂式窗框(c+;+;)

C++ SDL2.0和悬挂式窗框(c+;+;),c++,sdl,C++,Sdl,我目前正在编写一个应用程序,它依赖于一个物理设备,可以定期上传数据,我正在使用SDL为我绘制这些数据。我已经学习了有关设置和渲染内容(线、圆等)的在线教程 我很难让窗口真正响应(我使用的是Windows7)。渲染会发生,但由于某些原因,即使在渲染之前我正在处理事件,窗口也完全没有响应。我甚至不能单击“最大化”、“最小化”和“关闭”按钮(鼠标指示为微调器)。我在控制台中也看到很多SDL_WINDOWEVENT_显示的事件,我不确定这是否正常 下面的Presenter类是在我的应用程序中控制SDL的

我目前正在编写一个应用程序,它依赖于一个物理设备,可以定期上传数据,我正在使用SDL为我绘制这些数据。我已经学习了有关设置和渲染内容(线、圆等)的在线教程

我很难让窗口真正响应(我使用的是Windows7)。渲染会发生,但由于某些原因,即使在渲染之前我正在处理事件,窗口也完全没有响应。我甚至不能单击“最大化”、“最小化”和“关闭”按钮(鼠标指示为微调器)。我在控制台中也看到很多SDL_WINDOWEVENT_显示的事件,我不确定这是否正常

下面的Presenter类是在我的应用程序中控制SDL的唯一代码

水电站:

cpp:

#包括“Presenter.hpp”
#包括“Log.hpp”
名称空间STFFT{
bool Presenter::initPresenter(){
if(SDL_Init(SDL_Init_视频)<0){
日志(“无法初始化SDL:%s”,SDL_GetError());
返回false;
}
否则{
如果(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,“1”)){
日志(“无法初始化提示:%s”,SDL_GetError());
}
如果((ctxWnd=SDL_)创建窗口(
“我的SDL游戏”,
SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,640480,显示SDL_WINDOW_)
)==空){
日志(“无法创建SDL窗口:%s”,SDL_GetError());
返回false;
}
ctxEvnt=新的SDL_事件();
ctx=SDL_GetWindowSurface(ctxWnd);
if((ctxRndr=SDL\u CreateRenderer(ctxWnd,-1,SDL\u RENDERER\u ACCELERATED))==NULL){
日志(“无法创建渲染器”);
返回false;
}
}
返回true;
}
bool Presenter::render(){
SDL_PollEvent(ctxEvnt);
如果(ctxEvnt->type==SDL_QUIT){
int-dsfsd=0;
}
if(ctxEvnt->type==SDL\u WINDOWEVENT){
开关(ctxEvnt->window.event){
案例SDL\u窗口事件\u显示:
SDL_日志(“显示窗口%d”,ctxEvnt->Window.windowID);
打破
案例SDL\u窗口事件\u隐藏:
SDL_日志(“窗口%d隐藏”,ctxEvnt->Window.windowID);
打破
案例SDL\u WINDOWEVENT\u暴露:
SDL_日志(“窗口%d已暴露”,ctxEvnt->Window.windowID);
打破
案例SDL\u WINDOWEVENT\u移动:
SDL_日志(“窗口%d移动到%d,%d”,
ctxEvnt->window.windowID,ctxEvnt->window.data1,
ctxEvnt->window.data2);
打破
案例SDL\u WINDOWEVENT\u已调整大小:
SDL_日志(“窗口%d的大小调整为%dx%d”,
ctxEvnt->window.windowID,ctxEvnt->window.data1,
ctxEvnt->window.data2);
打破
案例SDL\u窗口事件大小\u更改:
SDL_日志(“窗口%d大小更改为%dx%d”,
ctxEvnt->window.windowID,ctxEvnt->window.data1,
ctxEvnt->window.data2);
打破
案例SDL\u窗口事件\u最小化:
SDL_日志(“窗口%d最小化”,ctxEvnt->Window.windowID);
打破
案例SDL\u WINDOWEVENT\u最大化:
SDL_日志(“窗口%d最大化”,ctxEvnt->Window.windowID);
打破
案例SDL\u WINDOWEVENT\u已恢复:
SDL_日志(“窗口%d已还原”,ctxEvnt->Window.windowID);
打破
案例SDL\u WINDOWEVENT\u输入:
SDL_日志(“鼠标进入窗口%d”,
ctxEvnt->window.windowID);
打破
案例SDL\u窗口事件\u离开:
SDL_日志(“鼠标左键窗口%d”,ctxEvnt->window.windowID);
打破
案例SDL\u WINDOWEVENT\u FOCUS\u获得:
SDL_日志(“窗口%d获得键盘焦点”,
ctxEvnt->window.windowID);
打破
案例SDL\u窗口事件\u焦点\u丢失:
SDL_日志(“窗口%d失去键盘焦点”,
ctxEvnt->window.windowID);
打破
案例SDL\u窗口事件\u关闭:
SDL_日志(“窗口%d已关闭”,ctxEvnt->Window.windowID);
打破
违约:
SDL_日志(“窗口%d获得未知事件%d”,
ctxEvnt->window.windowID,ctxEvnt->window.event);
打破
}
}
SDL_SetRenderDrawColor(ctxRndr,0x00,0x00,0x00,0xFF);
SDL_RenderClear(ctxRndr);
SDL_SetRenderDrawColor(ctxRndr,0xFF,0xFF,0xFF,0xFF);
SDL_RenderSetScale(ctxRndr,1,1);
SDL_渲染图线(ctxRndr,0,0639479);
SDL_RenderPresent(ctxRndr);
返回true;
}
}
Presenter::render
通过间接回调多次调用。由于这也是基于硬件的渲染,各种FPS应用程序都报告了舒适的60fps,所以我不明白为什么在我的例子中需要一个while循环

为了让窗口响应,您能看到我错过了什么吗?

您需要用尽
渲染方法中的所有事件,而不仅仅是一个事件

// Exhaust all events in the event queue.
while (SDL_PollEvent(&ctxEvnt))
{
    // handle the current event
};

render
是否定期调用,比如说每秒至少调用几次?是的-设备至少发出200次回调/sect,修复了重复的SDL\u WINDOWEVENT\u显示的事件,但窗口仍然挂起
#include "Presenter.hpp"
#include "Log.hpp"

namespace STFFT {

    bool Presenter::initPresenter() {
        if(SDL_Init(SDL_INIT_VIDEO) < 0) {
            Log("Unable to Init SDL: %s", SDL_GetError());
            return false;
        }
        else {

            if(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1")) {
                Log("Unable to Init hinting: %s", SDL_GetError());
            }

            if((ctxWnd = SDL_CreateWindow(
                "My SDL Game",
                SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,640, 480, SDL_WINDOW_SHOWN)
            ) == NULL) {
                Log("Unable to create SDL Window: %s", SDL_GetError());
                return false;
            }

            ctxEvnt = new SDL_Event();

            ctx = SDL_GetWindowSurface(ctxWnd);

            if((ctxRndr = SDL_CreateRenderer(ctxWnd, -1, SDL_RENDERER_ACCELERATED)) == NULL) {
                Log("Unable to create renderer");
                return false;
            }
        }

        return true;
    }



    bool Presenter::render() {

        SDL_PollEvent( ctxEvnt );
        if( ctxEvnt->type == SDL_QUIT ) { 
         int dsfsd = 0;
        }
        if (ctxEvnt->type == SDL_WINDOWEVENT) {
        switch (ctxEvnt->window.event) {
            case SDL_WINDOWEVENT_SHOWN:
                SDL_Log("Window %d shown", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_HIDDEN:
                SDL_Log("Window %d hidden", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_EXPOSED:
                SDL_Log("Window %d exposed", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_MOVED:
                SDL_Log("Window %d moved to %d,%d",
                        ctxEvnt->window.windowID, ctxEvnt->window.data1,
                        ctxEvnt->window.data2);
                break;
            case SDL_WINDOWEVENT_RESIZED:
                SDL_Log("Window %d resized to %dx%d",
                        ctxEvnt->window.windowID, ctxEvnt->window.data1,
                        ctxEvnt->window.data2);
                break;
            case SDL_WINDOWEVENT_SIZE_CHANGED:
                SDL_Log("Window %d size changed to %dx%d",
                        ctxEvnt->window.windowID, ctxEvnt->window.data1,
                        ctxEvnt->window.data2);
                break;
            case SDL_WINDOWEVENT_MINIMIZED:
                SDL_Log("Window %d minimized", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_MAXIMIZED:
                SDL_Log("Window %d maximized", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_RESTORED:
                SDL_Log("Window %d restored", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_ENTER:
                SDL_Log("Mouse entered window %d",
                        ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_LEAVE:
                SDL_Log("Mouse left window %d", ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_FOCUS_GAINED:
                SDL_Log("Window %d gained keyboard focus",
                        ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_FOCUS_LOST:
                SDL_Log("Window %d lost keyboard focus",
                        ctxEvnt->window.windowID);
                break;
            case SDL_WINDOWEVENT_CLOSE:
                SDL_Log("Window %d closed", ctxEvnt->window.windowID);
                break;
            default:
                SDL_Log("Window %d got unknown event %d",
                        ctxEvnt->window.windowID, ctxEvnt->window.event);
                break;
            }
        }

            SDL_SetRenderDrawColor(ctxRndr, 0x00, 0x00, 0x00, 0xFF);
            SDL_RenderClear(ctxRndr);
            SDL_SetRenderDrawColor(ctxRndr,0xFF,0xFF,0xFF,0xFF);
            SDL_RenderSetScale(ctxRndr,1,1);
            SDL_RenderDrawLine(ctxRndr,0,0,639,479);
            SDL_RenderPresent(ctxRndr);

        return true;
    }

}
// Exhaust all events in the event queue.
while (SDL_PollEvent(&ctxEvnt))
{
    // handle the current event
};