zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/dongc/p/5225117.html
Copyright © 2011-2022 走看看