【问题标题】:Update SDL1.2 SDL_GetWMInfo to SDL2 SDL_GetWindowWMInfo将 SDL1.2 SDL_GetWMInfo 更新为 SDL2 SDL_GetWindowWMInfo
【发布时间】:2017-03-31 02:12:43
【问题描述】:

我正在尝试将自定义版本的 DOSBox 中的一些 C++ 代码从 SDL1.2 更新到 SDL2。让我困惑的台词是:

SDL_SysWMinfo systemInfo; 
SDL_VERSION(&systemInfo.version);

if(SDL_GetWindowWMInfo(window, &systemInfo) !=1) return;
if (!::OpenClipboard(systemInfo.info.win.window)) return;

SDL_GetWindowWMInfo 在 SDL_syswm.h 中是这样定义的:

typedef struct SDL_SysWMinfo SDL_SysWMinfo;
extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, SDL_SysWMinfo * info);

当我尝试在 Visual Studio 2010 中构建时,我收到此错误,由上面代码中的第三行抛出:

1>  sdlmain.cpp
1>..\src\gui\sdlmain.cpp(2966): error C2065: 'window' : undeclared identifier

我想答案就在这里:

https://gamedev.stackexchange.com/questions/82068/how-can-i-obtain-a-window-handle-in-sdl-2-0-3

但我是初学者,不知道如何将其适应我自己的代码。如果有人愿意帮助一个完整的初学者,我将不胜感激。

【问题讨论】:

  • the wiki page for SDL_GetWindowWMInfo() 有什么不清楚的地方?
  • @emendelson 您不会在 cmets 中进行换行,但您可以编辑自己的问题以包含其他信息。 “Curly red inderscore”没有描述任何内容,实际的错误信息是什么?您的window 是在哪里(以及如何)定义的? (而且你不能使用任何未声明的东西)
  • 我用从那以后学到的东西重写了我的问题。再次感谢您的帮助。

标签: sdl-2 sdl-1.2


【解决方案1】:

通过添加第一行来解决(正如它在 SDL wiki 中清楚解释的那样):

SDL_Window* window;
SDL_SysWMinfo systemInfo; 
SDL_VERSION(&systemInfo.version);

if(SDL_GetWindowWMInfo(window, &systemInfo) !=1) return;
if (!::OpenClipboard(systemInfo.info.win.window)) return;

【讨论】:

  • 传递无效(更糟糕的是,未初始化)window 是一个非常糟糕的主意,因为至少 x11 实现实际上使用了窗口数据(没有检查过其他人;如果他们也这样做了也不会感到惊讶)。这不是 wiki 页面所建议的。传递您创建并准备使用的实际窗口。
  • 谢谢你——我只是在修改别人的代码,很感激能得到关于如何改进它的想法。
  • 如果您使用 SDL 绘图,您将使用SDL_CreateWindow 在某处创建窗口。这个应该传递给SDL_GetWindowWMInfo的窗口,而不是未定义的东西。
  • 我不会假装理解我正在修改的代码,但我认为它正在这样做:该代码旨在将 Windows 剪贴板粘贴到 DOSBox 键盘缓冲区中。我一直在询问的行似乎是在询问是否有打开的窗口可以粘贴。
  • 不知道这么少的代码。如果是这种情况,您可以将 NULL 传递给 OpenClipboard,而无需从 SDL 获取 HWND。我一般反对“把它弄乱,直到它坏了,看看会发生什么”的方法,但我想你必须尝试一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多