最近在学OpenGL,不想使用OpenGL的GLUT工具,自己写了一个初始化OpenGL的类,并在win32中使用,每次都要新建一个win32项目,然后将OpenGL初始化类拷贝到项目,然后进行各种初始化,通过自定义向导,我们可以很方便解决这个问题。

一、新建win32项目。

二、将OpenGL初始化类CUseOpenGL源文件和头文件拷贝到当前工程目录下。

UseOpenGL.h文件内容

#ifndef _USE_OPENGL_H_
#define _USE_OPENGL_H_ #include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h> class CUseOpenGL
{
public:
CUseOpenGL(); ~CUseOpenGL(); public:
bool SetWindowPixelFormat(HDC hDC); bool CreateViewGLContext(HDC hDC); void DestoryGLContext(); virtual void ResizeGLView(int width, int height); private:
int m_nGLPixelIndex;
HGLRC m_hGLContext;
}; #endif

UseOpenGL.cpp文件内容

#include "UseOpenGL.h"

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib") CUseOpenGL::CUseOpenGL()
{
m_nGLPixelIndex = 0;
m_hGLContext = NULL;
} CUseOpenGL::~CUseOpenGL()
{
DestoryGLContext();
} bool CUseOpenGL::SetWindowPixelFormat(HDC hDC)
{
bool bRet = true; try
{
PIXELFORMATDESCRIPTOR pixelDesc = {sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER | PFD_SUPPORT_GDI,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0,
32,
0, 0, PFD_MAIN_PLANE,
0, 0, 0, 0}; m_nGLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc);
if (m_nGLPixelIndex == 0)
{
m_nGLPixelIndex = 1;
if (DescribePixelFormat(hDC, m_nGLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc) == 0)
{
bRet = false;
throw bRet;
}
}
if (!SetPixelFormat(hDC, m_nGLPixelIndex, &pixelDesc))
{
bRet = false;
throw bRet;
}
}
catch (bool)
{
} return bRet;
} bool CUseOpenGL::CreateViewGLContext(HDC hDC)
{
bool bRet = true; try
{
m_hGLContext = wglCreateContext(hDC);
if (!m_hGLContext)
{
bRet = false;
throw bRet;
}
if (!wglMakeCurrent(hDC, m_hGLContext))
{
bRet = false;
throw bRet;
}
}
catch (bool)
{
} return bRet;
} void CUseOpenGL::DestoryGLContext()
{
if (wglGetCurrentContext())
{
wglMakeCurrent(NULL, NULL);
}
if (m_hGLContext)
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
} void CUseOpenGL::ResizeGLView(int width, int height)
{
if (width < 1)
{
width = 1;
}
if (height < 1)
{
height = 1;
}
//视口原点在窗口左下角
glViewport(0, 0, width, height);
}

三、将UseOpenGL.h和UseOpenGL.cpp文件添加到现有工程

四、使用OpenGL,在Win32OpenGL.cpp中加入以下代码

#include "UseOpenGL.h"

void	Display();

class CMyUseOpenGL : public CUseOpenGL
{
public:
virtual void ResizeGLView(int width, int height);
}; CMyUseOpenGL g_useOpenGL; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc; switch (message)
{
case WM_CREATE:
{
hdc = GetDC(hWnd);
g_useOpenGL.SetWindowPixelFormat(hdc);
g_useOpenGL.CreateViewGLContext(hdc);
ReleaseDC(hWnd, hdc);
}
break; case WM_SIZE:
{
RECT rect; GetClientRect(hWnd, &rect);
g_useOpenGL.ResizeGLView(rect.right - rect.left, rect.bottom - rect.top);
}
break; case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Display();
SwapBuffers(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
} void CMyUseOpenGL::ResizeGLView(int width, int height)
{
CUseOpenGL::ResizeGLView(width, height);
} void Display()
{
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
}

运行,如下图所示:

五、创建自定义向导

六、将Win32OpenGL下的.h/.ico/.cpp/.rc文件拷贝到Win32OpenGLWizard项目下的\Templates\2052目录,并添加到项目

模板文件上添加现有项

七、打开Templates.inf文件,将拷贝的文件名添加进去

readme.txt
Resource.h
small.ico
stdafx.cpp
stdafx.h
targetver.h
UseOpenGL.cpp
UseOpenGL.h
Win32OpenGL.cpp
Win32OpenGL.h
Win32OpenGL.ico
Win32OpenGL.rc

八、打开default.js文件,进行修改

function AddFilters(proj)
{
try
{
// 将文件夹添加到项目
// var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');
// var group = proj.Object.AddFilter('Source Files');
// group.Filter = strSrcFilter;
proj.Object.AddFilter('源文件').Filter = 'cpp;c';
proj.Object.AddFilter('头文件').Filter = 'hpp;h';
proj.Object.AddFilter('资源文件').Filter = 'ico;rc;bin';
}
catch(e)
{
throw e;
}
} function GetTargetName(strName, strProjectName)
{
try
{
// TODO: 基于模板文件名设置呈现文件的名称
var strTarget = strName; if (strName == 'readme.txt')
strTarget = 'ReadMe.txt'; if (strName == 'sample.txt')
strTarget = 'Sample.txt'; if (strName == 'Win32OpenGL.cpp')
strTarget = strProjectName + '.cpp';
if (strName == 'Win32OpenGL.h')
strTarget = strProjectName + '.h';
if (strName == 'Win32OpenGL.ico')
strTarget = strProjectName + '.ico';
if (strName == 'Win32OpenGL.rc')
strTarget = strProjectName + '.rc'; return strTarget;
}
catch(e)
{
throw e;
}
}

九、将所有老的项目修改为新的项目名

打开Win32OpenGL.cpp文件

1、将#include "Win32OpenGL.h"修改为

#include "[!output PROJECT_NAME].h"

打开Win32OpenGL.rc文件

2、将IDI_WIN32OPENGL       ICON         "Win32OpenGL.ico"修改为

IDI_WIN32OPENGL       ICON         "[!output PROJECT_NAME].ico"

3、将CAPTION "关于 Win32OpenGL"修改为

CAPTION "关于 [!output PROJECT_NAME]"

4、将 LTEXT           "Win32OpenGL,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIX修改为

LTEXT           "[!output PROJECT_NAME],1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIX

5、将IDC_WIN32OPENGL   "WIN32OPENGL"修改为

IDC_WIN32OPENGL   "[!output PROJECT_NAME]"

6、将IDS_APP_TITLE       "Win32OpenGL"修改为

IDS_APP_TITLE       "[!output PROJECT_NAME]"

十、此时向导已经完成。

打开VS2010,新建项目,向导,Win32OpenGLWizard

我们可以看到Win32OpenGLWizard向导是在"向导"这个子项下,并且向导的说明也是默认的,我们可以修改向导的说明并且可以将Win32OpenGLWizard向导放在"Win32"子项下。

打开"我的文档",定位到“Documents\Visual Studio 2010\Wizards”目录,里面有三个文件Win32OpenGLWizard.ico、Win32OpenGLWizard.vsdir、Win32OpenGLWizard.vsz,如果将这三个文件删除后,那么Win32OpenGLWizard便会自动从向导中移除,现在我们将这三个文件移动到VS2010安装目录下的\Microsoft Visual Studio 10.0\VC\vcprojects目录,打开Win32OpenGLWizard.vsdir文件,将内容\Microsoft
Visual Studio 10.0\VC\vcprojects\Win32目录下的win32.vsdir文件的末尾,内容如下

..\Win32Wiz.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1171|1|#1172|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|0|4096|#1154
..\Win32Console.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1204|1|#1205|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|0|4096|#1154
..\Win32OpenGLWizard.vsz| |Win32OpenGLWizard|1|Win32 OpenGL 项目| |6777| |Win32OpenGLWizard

其中"Win32 OpenGL 项目"便是Win32OpenGLWizard向导的说明

打开Win32OpenGLWizard.vsz文件

VSWIZARD 7.0
Wizard=VsWizard.VsWizardEngine.10.0 Param="WIZARD_NAME = Win32OpenGLWizard"
Param="ABSOLUTE_PATH = E:\桌面\Custom\example\Win32OpenGLWizard\Win32OpenGLWizard"
Param="FALLBACK_LCID = 2052"
Param="WIZARD_UI = FALSE"
Param="SOURCE_FILTER = txt"

"ABSOLUTE_PATH = E:\桌面\Custom\example\Win32OpenGLWizard\Win32OpenGLWizard"是向导文件的位置,即第五步创建自定义向导的位置,这个路径下的文件不能被删除,否则向导不能新建项目。

参考:http://www.rupeng.com/forum/thread-9243-1-1-uid54410.html

VS2010 自定义向导的更多相关文章

  1. VS2010自定义添加创建者、创建时间等个人信息新建文件模版

    不知不觉VS2010已经成为.NET开发人员的必备工具,相比经典版VS2005,到过渡版vs2008,2010在性能稳定性和易用性上都得到很大的提高. 结合VS工具,其下的插件也层出不穷.今天重点给大 ...

  2. vs2010+ARX2012向导添加mfc支持类出现Error in default.htm PopulateDialogIDs():

    初步判断为ARX2012默认的编译器平台集是v90,如果你只安装了vs2010,没有安装vs2008sp1或者vs2008sp1的编译器,以及对应的Windows MFC SDK,就可能会出现这样的问 ...

  3. VS2008 自定义向导的default.js设置(DLL文件)

    function OnFinish(selProj, selObj) { try { var strProjectPath = wizard.FindSymbol('PROJECT_PATH'); v ...

  4. VS中创建自定义一个VC工程为基础的开发向导的总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 VS允许用户进行自定义开发向导.自定义开发向导的好处在于将常用的设置都通过向导生成,从而大大提供开发效率.特别是在开发 ...

  5. SharePoint 2013开发入门探索(一)- 自定义列表

    在SharePoint 2013中创建自定义列表的方式有很多,在网站内容页面添加应用程序就可以创建(站点内容-〉 您的应用程序),也可以通过SharePoint Designer 2013创建,而本文 ...

  6. VS 自定义新建文件模板方法

    自定义新建文件模板方法     VS 2010 及VS2008 自定义模板的方法如下: 结合VS工具,其下的插件也层出不穷.今天重点给大家介绍如何使用VS2010自定义新建文件模版,新建文件时,添加个 ...

  7. vs2010中使用luabind

    第一部分:在vs2010中生成luabind静态库和动态库 一.前期准备 1.安装boost 下载boost并解压到 D:\mylua\boost_1_56_0,进入 D:\mylua\boost_1 ...

  8. 抽取vs2010安装包中vc++ runtime

    写于2015-3-21 16:59 由qq空间转过来,格式有点乱     之前遇到一个问题,c++\cli的程序部署在服务器上面,程序运行后没有反应就退出了,日志管理器中记录两个错误信息分别如下:   ...

  9. sharepoint 2013 入门1_ 建立一个网页程序

    步骤: 1.新建项目. 2.项目到office/sharepoint 解决方案=>sharepoint2013 空项目 3.sharepoint 自定义向导(电脑必须要装sharepoint 不 ...

随机推荐

  1. hdu_5889_Barricade(最小割+最短路)

    题目链接:hdu_5889_Barricade 题意: 有n个点,m条边,每个边的长度都为1,每个边有一个消耗w,如果要阻断这条路,那么就会消耗w,现在让你阻断点1到点n的所有最短路,问你最小的消耗是 ...

  2. Caf音频文件混合

    一.两个同样时常的caf音频文件,可以通过下面的代码混合 二.代码地址: https://github.com/liqiushui/AudioRecorderCafMix  

  3. openwrt生成备份文件

    生成备份文件时所使用的脚本中调用的命令为sysgrade local image_tmp   = "/tmp/firmware.img" local backup_cmd  = & ...

  4. Excel教程(11) - 查找和引用函数

    ADDRESS 用途:以文字形式返回对工作簿中某一单元格的引用.    语法: sheADDRESS(row_num,column_num,abs_num,a1,et_text) 参数:Row_num ...

  5. hdu 1210 Eddy's 洗牌问题

    Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是 ...

  6. java邮件发送(以163邮箱为例)

    1.首先应该开通163邮箱的smtp和pop3,得到授权码 2.其次建立一个web项目,否则需要倒jar包mail.jar 3.创建一个类 4.注意:邮件内容必须为正式话语,否则系统会认为是垃圾邮件而 ...

  7. C -小晴天老师系列——竖式乘法

    C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others ...

  8. 1077. [NOIP2010冲刺六] 数列游戏

    [题目描述] 小M很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,1,2,5,4.接着她擦掉了一个1,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位.她希望 ...

  9. 值得一提:关于 HDFS 的 file size 和 block size

    转 http://blog.csdn.net/samhacker/article/details/23089157?utm_source=tuicool&utm_medium=referral ...

  10. 如何让图片在div里面剧中显示

    你可能有很多种方式,但是这种方式我觉得更加简单,供大家参考. 用一个 display:inline-block 的helper容器高度为height: 100% 并且vertical-align: m ...