视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440

代码下载

#pragma once

#include <Windows.h>
#include <tchar.h>
#include <gl/GL.h>

namespace CELL
{
namespace Graphy
{

class CELLWinApp
{
protected:
/**
* 应用程序实例句柄
*/
HINSTANCE _hInstance;
/**
* 窗口句柄,操作窗口使用
*/
HWND _hWnd;
/**
* 设备上下文,没有Opengl,绘图都使用它来。
*/
HDC _hDC;
/**
* Opengl上下文句柄。
*/
HGLRC _hRC;
/**
* 窗口的宽度和高度
*/
int _winWidth;
int _winHeight;
public:
CELLWinApp(HINSTANCE hInstance = 0)
{
_hWnd = 0;
_hDC = 0;
_hRC = 0;
_winWidth = 0;
_winHeight = 0;
_hInstance = hInstance;
/**
* 要想创建一个窗口,首先要注册一个窗口类
* 相关内存,可以了解windows变成,这里不做介绍。
*/
::WNDCLASSEX winClass;
winClass.lpszClassName = _T("CELLWinApp");
winClass.cbSize = sizeof(::WNDCLASSEX);
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
winClass.lpfnWndProc = windowProc;
winClass.hInstance = hInstance;
winClass.hIcon = 0;
winClass.hIconSm = 0;
winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winClass.lpszMenuName = NULL;
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
RegisterClassEx(&winClass);
}
virtual ~CELLWinApp()
{
destroy();
}
void destroy()
{
shutDownDevice();
}

/**
* 渲染函数
*/
virtual void render()
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
SwapBuffers( _hDC );
}

/**
* 入口函数
* width :创建窗口宽度
* height:创建窗口的高度
*/
int start(int width,int height)
{
_winWidth = width;
_winHeight = height;

/**
* 创建窗口
*/
if (!_createWindow(_winWidth,_winHeight))
{
return -1;
}
/**
* 初始化OpenGL环境。
*/
if (!initDevice())
{
return -2;
}
onInit();
/**
* 进入消息循环
*/
MSG msg = {0};
while(msg.message != WM_QUIT)
{
if (msg.message == WM_DESTROY ||
msg.message == WM_CLOSE)
{
break;
}
/**
* 有消息,处理消息,无消息,则进行渲染绘制
*/
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
render();
}
}
return 0;
}
/**
* 初始化OpenGL
*/
bool initDevice()
{
/**
* 这个东西就是初始化Opengl环境的东西。
*/
unsigned pixelFormat;
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SUPPORT_DIRECTDRAW | PFD_SWAP_EXCHANGE,
PFD_TYPE_RGBA,
32,
8,
0,
8,
8,
8,
0,
0,
0,
32,
8,
8,
8,
8,
24,
8,
0,
PFD_MAIN_PLANE,
0,
0,
0,
0
};
/**
* 获取当前窗口dc
*/
_hDC = GetDC( _hWnd );
/**
* 选择一个与pfd接近的像素格式。
* 你也可以调用int iCnt = DescribePixelFormat(_hDC, pixelFormat,0)返回值为,有多少个可用的
* pfd,然后循环的调用,得到你想要的。
* for( int i = 1 ;i < iCnt ; ++ i )
* {
* PIXELFORMATDESCRIPTOR pfd;
* DescribePixelFormat(_hDC, iCnt,&pfd);
* }
*/
pixelFormat = ChoosePixelFormat( _hDC, &pfd );
DescribePixelFormat( _hDC, pixelFormat, sizeof(pfd), &pfd );
/**
* 设置当前dc的pfd;
*/
if(!SetPixelFormat( _hDC, pixelFormat, &pfd ))
{
return false;
}
/**
* 创建Opengl上下文
*/
_hRC = wglCreateContext( _hDC );
/**
* 与当前的dc进行绑定
* 注意如果是在多线程中进行绘制,这句话在绘制之前调用,用作线程切换使用
*/
if(!wglMakeCurrent( _hDC, _hRC ))
{
return false;
}

RECT rt;
GetClientRect(_hWnd,&rt);
/**
* 窗口发生变化通知
*/
_winWidth = rt.right - rt.left;
_winHeight = rt.bottom - rt.top;
SendMessage(_hWnd,WM_SIZE,0,0);
return true;
}
/**
* 关闭
*/
void shutDownDevice()
{
if( _hRC != NULL )
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( _hRC );
_hRC = NULL;
}
if( _hDC != NULL )
{
ReleaseDC( _hWnd, _hDC );
_hDC = NULL;
}
UnregisterClass( _T("CELLWinApp"), _hInstance );
}
/**
* 事件
*/
virtual int events(unsigned msg, unsigned wParam, unsigned lParam)
{
switch( msg )
{
case WM_SIZE:
{
RECT rt;
GetClientRect(_hWnd,&rt);
_winWidth = rt.right - rt.left;
_winHeight = rt.bottom - rt.top;
if (_hRC)
{
glViewport(0,0,_winWidth,_winHeight);
}
}
break;
case WM_CLOSE:
case WM_DESTROY:
{
::PostQuitMessage(0);
}
break;
default:
return DefWindowProc(_hWnd, msg, wParam, lParam );
}
return 0;
}
public:
/**
* 增加一个初始化OpenGL的函数,第二课中增加
* 调用该函数完成对OpenGL的基本状态的初始化
* 在进入消息循环之前的一次通知,只调用一次
*/
virtual void onInit()
{
/**
* 清空窗口为红色
*/
glClearColor(0,0,0,1);
/**
* 设置OpenGL视口的位置和大小。
*/
glViewport( 0, 0, (GLint) _winWidth, (GLint) _winHeight );
}
protected:
/**
* 创建窗口函数
*/
bool _createWindow(int width,int height)
{
_hWnd = CreateWindowEx(
NULL,
_T("CELLWinApp"),
_T("CELLWinApp"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
width,
height,
NULL,
NULL,
_hInstance,
this //! 这里注意,将当前类的指针作为参数,传递,参见 windowProc函数.
);

if( _hWnd == 0 )
{
return false;
}
ShowWindow( _hWnd, SW_SHOW );
UpdateWindow( _hWnd );
return true;
}
/**
* Windows消息过程处理函数
*/
static LRESULT CALLBACK windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
/**
* 使用this数据,将全局函数,转化为类的成员函数调用
*/
CELLWinApp* pThis = (CELLWinApp*)GetWindowLong(hWnd,GWL_USERDATA);
if (pThis)
{
return pThis->events(msg,wParam,lParam);
}
if (WM_CREATE == msg)
{
CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
SetWindowLong(hWnd,GWL_USERDATA,(DWORD_PTR)pCreate->lpCreateParams);
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
};

}
}

#pragma comment(lib,"opengl32.lib")
#include "CELLWinApp.hpp"
 
int CALLBACK _tWinMain(
                       HINSTANCE hInstance, 
                       HINSTANCE hPrevInstance, 
                       LPTSTR lpCmdLine, 
                       int nShowCmd 
                       )
{
 
    CELL::Graphy::CELLWinApp winQpp(hInstance);
    winQpp.start(640,480);
    return  0;

}

OpenGL1-创建窗口(建立Win32的OpenGL开发环境 )(代码上传)的更多相关文章

  1. 本地开发spark代码上传spark集群服务并运行

    打包 :右击.export.Java .jar File 把TestSpark.jar包上传到spark集群服务器的 spark_home下的myApp下: 提交spark任务: cd /usr/lo ...

  2. [Modern OpenGL系列(一)]十步搞定OpenGL开发环境

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51292143 OpenGL官网:https://www.opengl.or ...

  3. 【游戏开发】基于VS2017的OpenGL开发环境搭建

    一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...

  4. VS2010配置OpenGL开发环境

    OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...

  5. VS2010配置OpenGL开发环境(转)

    OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...

  6. VC 6中配置OpenGL开发环境

    2010,2012中配置类似 http://hi.baidu.com/yanzi52351/item/f9a600dffa4caa4ddcf9be1d VC 6中配置OpenGL开发环境 这里,我习惯 ...

  7. Fedora和Ubuntu下安装OpenGL开发环境配置

    Fedora下OpenGl开发环境配置 开发OpenGL工程需要3个库文件和对应的头文件: libglut.so,libGLU.so,libGL.so, gl.h ,glu.h, glut.h 这些库 ...

  8. Ubuntu下OpenGL开发环境的搭建

    由于上了计算机图形学的课,老师叫我们安装OpenGL开发环境,晚上安装了一两个小时,终于搞定了. 1.      建立基本编译环境 sudo apt-get install build-essenti ...

  9. OpenGL学习进程(2)OpenGL开发环境的搭建

        通过本节,我们来学习一下在Win10 64.VS1013环境下搭建OpenGL的开发环境.     (1)选择一个编译环境: 现在在windows中OpenGL的主流编译工具有Visual S ...

随机推荐

  1. 【M6】区别increment/decrement操作符的前置(prefix)和后置(postfix)形式

    1.考虑++(--的情况是一样的),前置是累加然后取出,后置是取出然后累加. 2.重载方法根据形参表的不同区分,问题来了,前置和后置形式都没有形参,因此没法区分.怎么办? 对于后置增加一个形参int, ...

  2. angularjs入门学习【应用剖析中篇】

    在上一节讲完了关于应用开发中如数据绑定,加入样式一类的基础操作后,接下来,将在应用中,与控制其有关的一些事件... 一.UI和控制器的分离 我们须要明白控制器在应用中的三个作用: [1]在应用模型中设 ...

  3. Web APP 随笔

    自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备). 开发者们都知道在高端智能手机 ...

  4. 实时数据采集传输软件LDM配置

    本环境一共两个机器:cma.ldm87.gov.cn(hostname)机器作为upstream LDM,cma.ldm84.gov.cn(hostname)机器作为downstream LDM.下面 ...

  5. 【剑指offer】八皇后问题

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26614999 剑指offer上解决八皇后问题,没实用传统的递归或非递归回溯法,而是用了非常 ...

  6. 网络IPC:套接字之寻址

    在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...

  7. 关于MIUI悬浮窗权限问题的解决方案

    先扯会....好久没写Blog了....这段时间有点小忙...瞎忙.....忙的自己都感觉都不应该.....严重影响了生活质量......生活的幸福指数!!!.....到现在还特么的单身!!!求介绍啊 ...

  8. FatMouse' Trade

    /* problem: FatMouse' Trade this is greedy problem. firstly:we should calculate the average J[i]/F[i ...

  9. Helpers\GeoCode

    Helpers\GeoCode This function connects to google maps and retrieves the lat/lon of the address provi ...

  10. Centos 安装KScope1.6.2

    准备工作:安装ctags graphviz,和cscope  (可以用yum install来安装) 1.首先下载kscope,最好下载16.x的版本,这个最好的 下载kscope-1.6.2.tar ...