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

来源:互联网 发布:云数据存储 编辑:程序博客网 时间:2024/05/18 01:38

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;#elsereturn null;#endif}
在你的程序里面加个定义:
GLFWAPI void* glfwGetWindowHandle(GLFWwindow* handle);

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

0 0
原创粉丝点击