SDL2和glfw库windows下创建到界面窗口中的简单方法

SDL2和glfw都是跨平台的库,都能很好的初始化OpenGL环境,但我们在windows下面应用的时候,经常要在windows界面编程中使用OpenGL,但这两个库创建的window都是独立的。SDL2虽然有SDL_CreateWindowFrom()这个函数,但发现至少v2.0.5版本仍然是不好用的。创建的窗口虽然可以嵌在界面中,但无法通过SDL_GL_CreateContext()创建OpenGL环境。


网上查了一天的资料,有介绍如何修改源代码的,操作很复杂。最简单的方法,就是通过wglGetCurrentDC()这个函数得到当前SDL2或者glfw创建的OpenGL环境DC,再通过WindowFromDC()这个API得到窗口的句柄。有了句柄,你就可以随意操作了。

glfwWindow* window;
//没有边框和标题栏
glfwWindowHint(GLFW_DECORATED, GL_FALSE);
//创建窗口
window = glfwCreateWindow(500, 500, "OpenGL", 0, 0);
//显示窗口
glfwShowWindow(window);
//创建OpenGL环境
glfwMakeContextCurrent(window);

//必须在SDL2或者glfw创建OpenGL环境之后使用,不然wglGetCurrentDC()的操作是无效的。
#ifdef _WIN32
//获得glfw创建的窗口句柄
HWND hWnd = WindowFromDC(wglGetCurrentDC());
//设置到自己的窗口中,至此操作完成,可以看到效果了
::SetParent(hWnd, hParentWindow);
#endif

如果要修改源代码的话,网上有介绍修改窗口创建函数的,这个比较复杂,而且版本更新后修改太麻烦。 SDL2有 SDL_GetWindowWMInfo()这个函数,可以通过曲线救国得到窗口句柄,glfw就麻烦点。

修改"glfw/src/window.c",添加代码如下:

GLFWAPI void* glfwGetWindowHandle(GLFWwindow* handle)
{
	#ifdef _GLFW_WIN32
	_GLFWwindow* window = (_GLFWwindow*) handle;
	return window->win32.handle;
	#else
	return null;
	#endif
}
在你的程序里面加个定义:
GLFWAPI void* glfwGetWindowHandle(GLFWwindow* handle);

就可以使用这个函数得到glfwWindow的真实句柄了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用SDL2创建窗口时,可以使用`SDL_CreateWindow()`函数来指定要在哪个显示器上创建窗口。具体做法是在调用该函数时,使用`SDL_WindowFlags`枚举类型的`SDL_WINDOW_FULLSCREEN_DESKTOP`标志,并将其作为第二个参数传入。同时,还需要指定显示器的索引,可以使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取显示器数量和名称。 以下是示例代码: ```c #include <SDL2/SDL.h> #include <stdio.h> int main(int argc, char* argv[]) { // 初始化SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL初始化失败: %s\n", SDL_GetError()); return -1; } // 获取第二个显示器的名称 int numDisplays = SDL_GetNumVideoDisplays(); if (numDisplays < 2) { printf("没有检测到第二个显示器!\n"); SDL_Quit(); return -1; } const char* displayName = SDL_GetDisplayName(1); // 创建窗口并指定显示器 SDL_Window* window = SDL_CreateWindow("在指定显示器上创建窗口", SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), 640, 480, SDL_WINDOW_FULLSCREEN_DESKTOP); if (!window) { printf("创建窗口失败: %s\n", SDL_GetError()); SDL_Quit(); return -1; } // 进入消息循环 SDL_Event e; bool quit = false; while (!quit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } } } // 清理资源 SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 在上面的示例代码,我们使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取第二个显示器的名称,并将其作为参数传入`SDL_CreateWindow()`函数。最后,我们进入消息循环等待用户关闭窗口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值