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的真实句柄了。

你可能感兴趣的:(OpenGL)