您的位置:首页 > 运维架构

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

2017-02-03 15:06 911 查看
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的真实句柄了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息