如何将 Win32 合并到 SDL 项目中?

Posted

技术标签:

【中文标题】如何将 Win32 合并到 SDL 项目中?【英文标题】:How to incorporate Win32 in an SDL project? 【发布时间】:2014-11-22 21:41:22 【问题描述】:

我使用 SDL 和 OpenGL 制作了一些软件,现在我想添加一个用于输入的图形界面,例如一些文本框和按钮。我意识到这可能必须在一个单独的窗口中,我不介意,但我不知道如何在我的项目中合并 Win32 功能。我尝试从

更改我的主要功能的定义
int main(int argc, char **argv)

    ...

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int cmdShow)

    ...

但我收到一条错误消息:

LNK2005: _WinMain@16 already defined in SDL2main.lib (SDL_windows_main.obj)
LNK2005: _WinMain@16 already defined in Source.obj
LNK2019: unresolved external symbol _SDL_main referenced in function _main

我正在使用 Visual Studio 2012。 有没有办法解决这个问题,或者有没有另一种方法可以在 c++ 中创建表单?

谢谢

【问题讨论】:

GUI 不必位于单独的窗口中。您只需要可以呈现到 opengl 的小部件。有 gui 库可以做到这一点。 【参考方案1】:

SDL 将main 定义为宏。这就像终极恐怖表演。当然,将 Microsoft 的 WinMain 怪物混入其中似乎是合适的,但任何事情都不需要它。

只需保留您的main

如果我承诺使用 SDL(考虑到上述情况,我永远不会这样做),那么我首先会检查 SDL 以文本框和按钮等方式提供的功能。如果没有,那么只需正确包含<windows.h>(首先定义STRICTNOMINMAXUNICODE),然后使用API​​。但为此,我建议首先通过创建一些纯 API 程序来学习该 API,不要干扰 SDL。

【讨论】:

为了扩展它——因为似乎WinMain 已经被库定义了,你可以继续使用main。如果您不需要控制台,只需更改可执行输出类型(在项目链接器设置下)。 你所说的“使用主要”是什么意思?如果我使用现有的 main 函数,我如何拥有 Win32 功能,我从哪里获得我的 hInstance 和东西? @HarWiltz:实例句柄大多只用于资源。如果您有资源,调用GetModuleHandle(0) 会检索当前可执行文件的实例句柄。将 DLL 名称传递给它以获取某个加载的 DLL 的实例句柄。针对新问题提出新的 SO 问题。 SO cmets 被设计为不支持讨论,因此您可以想象一个教程在某种程度上超出了设计限制。 在弄乱你的程序之前,他们至少可以给你一个选择,比如 SDLmain 宏。这可能是出于便携性的原因。

以上是关于如何将 Win32 合并到 SDL 项目中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win32 菜单中使用 SDL

C#中如何将两个项目合并到一个项目中

win32api:在文本行中合并位图

将多个项目合并到一个解决方案中,同时保留 git 历史记录

Win32 使用 SetCurrentProcessExplicitAppUserModelID 关联多个进程 在任务栏合并 WPF 多进程窗口

Qt:如何将 2 个 QQuickItems 合并为一个,然后将其保存为 png