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的真实句柄了。
网上查了一天的资料,有介绍如何修改源代码的,操作很复杂。最简单的方法,就是通过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的真实句柄了。
相关文章推荐
- Windows简单窗口的创建
- python在windows下创建隐藏窗口子进程的方法
- rhel6.4 简单创建自己的http web 界面服务遇到的问题和解决方法
- Windows下用C++关闭某个窗口的简单方法
- 【windowAPI】windows 最简单的窗口创建!注册、创建、更新!
- 关于swing界面创建以及窗口放在屏幕中央的方法
- 使用storyboard创建带有navigation的界面的简单方法
- [置顶] java最简单的知识之创建一个简单的windows窗口,利用Frame类
- WindowsTemplateLibrary(WTL)-创建简单的窗口以及对话框
- windows下简单的调用Setforegroundwindow并不能将窗口置最前,我找到三种方法可以实现该功能。
- python在windows下创建隐藏窗口子进程的方法
- 简单的windows窗口创建实例
- 网络编程(43)—— windows平台下创建线程的四种方法(二)之用户界面线程
- 使用storyboard创建带有navigation的界面的简单方法
- C++ 创建快捷方式的最简单方法
- Windows自动登陆的简单方法
- 用SDK创建一个简单带滚动条的窗口
- C++ 创建快捷方式的最简单方法
- 简单配置 Tomcat JVM 的方法 —— WINDOWS 平台适用
- 创建简单的Windows Setup Project -- Visual C# 2005