最近在学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_4742_Pinball Game 3D(cdq分治+树状数组)

    题目链接:hdu_4742_Pinball Game 3D 题意: 给你n个点,让你求三维的LIS,并且求出有多少种组合能达到LIS. 题解: 求三维的LIS,典型的三维偏序问题,x排序,解决一维,c ...

  2. 读取memo中某行内容

    方法1 可用以下代码读取Memo中指定行的内容: var   aLine:String; begin   aLine:=Memo1.Lines[2]; end; 在使用中,读取的行在Memo中需要保证 ...

  3. PHP中使用CURL(三)

    对 post 提交的数据进行 http_build_query处理,然后再send出去,能实现更好的兼容性,更小的请求数据包. <?php /** * PHP发送Post数据 * @param ...

  4. ZOJ 3702 Gibonacci number

    本来已经关上电脑了 但还是想打开电脑纪念一下这充实的一天…… 第一节高数课讲新课级数 讲完一个知识点 想问问女票今天咋又没来上课…… 突然发现院长问我自费去不去省赛…… !!! 当然是去啊! ……虽然 ...

  5. poj 3524 Charm Bracelet(01背包)

    Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd ...

  6. Chapter 15_0 模块和包

    通常,Lua不会设置规则,相反会提供很多强有力的机制来使开发者有能力实现出最适应的规则. 然而,这种方法对于模块就不行了.模块系统的一个主要目标是允许以不同的形式来共享代码. 但若没有一项公共的规则就 ...

  7. 10.按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package com.hanqi.test; public class People { private String name,sex; private int age; private doub ...

  8. 获取Camera 支持视频的尺寸

    <uses-permission android:name="android.permission.CAMERA" > </uses-permission> ...

  9. MyBatis 批量修改记录

    <insert id="update" parameterType="java.util.List"> UPDATE setting SET con ...

  10. redis持久化探究

    redis支持两种持久化方式,一种是RDB方式,另一种是AOF方式.redis3.0windows版本默认关闭AOF(appendonly no),而开启RDB,当达到一定条件时,redis就会将内存 ...