• VS2010 自定义向导


    最近在学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项目下的Templates2052目录,并添加到项目

    模板文件上添加现有项

    七、打开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"子项下。

    打开"我的文档",定位到“DocumentsVisual Studio 2010Wizards”目录,里面有三个文件Win32OpenGLWizard.ico、Win32OpenGLWizard.vsdir、Win32OpenGLWizard.vsz,如果将这三个文件删除后,那么Win32OpenGLWizard便会自动从向导中移除,现在我们将这三个文件移动到VS2010安装目录下的Microsoft Visual Studio 10.0VCvcprojects目录,打开Win32OpenGLWizard.vsdir文件,将内容Microsoft Visual Studio 10.0VCvcprojectsWin32目录下的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:桌面CustomexampleWin32OpenGLWizardWin32OpenGLWizard"
    Param="FALLBACK_LCID = 2052"
    Param="WIZARD_UI = FALSE"
    Param="SOURCE_FILTER = txt"
    

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

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

  • 相关阅读:
    java之正则表达式
    mysql之自定义函数
    mysql之replace into与 insert into duplicat key for update
    mysql之命令行导入导出
    Echarts修改legend样式
    ubuntu出现 E: Sub-process /usr/bin/dpkg returned an error code
    ubuntu总是提是E: 不能满足依赖关系。不妨试一下 -f 选项
    ubuntu安装和查看已安装软件
    放爬虫nginx
    nginx日志切割
  • 原文地址:https://www.cnblogs.com/dongc/p/5225117.html
Copyright © 2020-2023  润新知