65.9K
CodeProject 正在变化。 阅读更多。
Home

Visual Studio .NET 中的 OpenGL 自定义向导

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2006 年 12 月 21 日

4分钟阅读

viewsIcon

79980

downloadIcon

2533

在 Visual Studio .NET 中使用 MFC 创建 OpenGL 窗口

Sample Image - wizard.gif

引言

本文将介绍如何使用 MFC 自定义向导在 Visual Studio .NET 2003 中创建自定义向导和 OpenGL 自定义向导。许多人都有关于 Visual Studio .NET 自定义向导的问题。这个问题的原因是发生了从对话框编码方法到 HTML 定义方法的公式变化。本文将介绍“如何在 Visual .NET 环境中创建自定义向导?”

比较 Visual Studio 6.0 和 Visual Studio .NET 的自定义向导

与 Visual Studio 6.0 不同,我们使用对话框资源来创建自定义向导。我们使用资源控件来定义属性和条件。

Sample screenshot

这张图片展示了 Visual Studio 6 中的资源编辑过程。但是 Visual Studio .NET IDE(集成开发环境)不再支持自定义向导的对话框资源编辑过程。此时,VS.NET 2003 或 VS.NET 2005 IDE 环境使用 HTML 编辑环境来代替对话框编辑环境。

Sample screenshot

Visual C++ 自定义向导概述

它解释了自定义向导最常见的功能。典型的项目向导模板包含以下文件:

[name].vsz

标识向导引擎,并提供上下文和可选的自定义参数。

    VSWIZARD 7.0
    Wizard=VsWizard.VsWizardEngine.7.1
    
    Param="WIZARD_NAME = OpenGL Wizard"
    Param="FALLBACK_LCID = 1033"
    Param="SOURCE_FILTER = cpp;.. and other options"
    Param="HEADER_FILTER = h; .. and other options"
    Param="RESOURCE_FILTER = rc; .. and other options"

[name].vsdir

此文件在 Visual Studio Shell 和向导项目中的项之间提供路由服务。

    OpenGL Wizard.vsz| |OpenGL Wizard|1|OpenGL MFC Application| |6777| |OpenGL Wizard
    

Templates.inf

Templates.inf 是一个文本文件,其中包含用于项目的模板列表。请注意,Template.inf 本身就是一个模板文件(您可以使用指令指定要包含在项目中的文件)。

default.vcproj

XML 文件包含项目类型信息。

    <?xml version="1.0" encoding="Windows-1252"?>
    <VisualStudioProject ProjectType="Visual C++" Version="7.10">
     <Platforms>
      <Platform
       Name="Win32"/>
     </Platforms>
     <Configurations>
      <Configuration Name="Debug|Win32"></Configuration>
      <Configuration Name="Release|Win32"></Configuration>
     </Configurations>
    </VisualStudioProject>

"Template file" 文件夹

此文件夹包含将包含在项目中的文件。请注意,硬盘上的位置是“$(ProjectDir)\Template Files\1033”。

    readme.txt
    sample.txt
    stdafx.h
    stdafx.cpp
    OpenGLView.h
    OpenGLView.cpp
    OpenGLDoc.h
    OpenGLDoc.cpp
    OpenGL.h
    OpenGL.cpp
    MainFrm.h
    MainFrm.cpp
    OpenGL.rc
    Res/OpenGL.ico
    Res/OpenGL.rc2
    Res/OpenGLDoc.ico
    Res/Toolbar.bmp
    Res/OpenGL.manifest
    Resource.h
    earth.bmp

"HTML files" 文件夹

包含向导使用的 HTML 文件(用户界面),每个页面一个向导文件。第一个文件是“Default.htm”。硬盘上的位置是“$(ProjectDir)\Html\1033”。

"Script Files" 文件夹

自定义向导为每个项目创建一个名为“Default.js”的 JScript 文件。
它还包括“Common.js”。这些文件包含 JScript 函数,让您可以访问 Visual C++ 对象模型来定制向导。

    function OnFinish(selProj, selObj) { ... etc } 
    function CreateCustomProject(strProjectName, strProjectPath) { ... etc } 
    function CreateCustomProject(strProjectName, strProjectPath) { ... etc }
    
    function AddFilters(proj) { ... ect } 
    function AddConfig(proj, strProjectName) { ... etc } 
    function DelFile(fso, strWizTempFile) { ... etc }
    
    function CreateCustomInfFile() { ... etc }
    
    function GetTargetName(strName, strProjectName) { ... etc }
    
    function AddFilesToCustomProj(proj, strProjectName, strProjectPath, InfFile) { ... etc }

如何创建项目结构

Sample screenshot

对于本文,我选择创建一个 MFC 应用程序项目来创建 C 项目。我的要求是:

  1. 预编译源文件:“stdafx.cpp”,“stdafx.h”
    1. 定义 OpenGL 头文件
  2. 应用程序源文件:“OpenGL.cpp”,“OpenGL.h”
  3. MainFrame 源文件:“MainFrm.cpp”,“MainFrm.h”
  4. Document 源文件:“OpenGLDoc.cpp”,“OpenGLDoc.h”
  5. View 源文件:“OpenGLView.cpp”,“OpenGLView.h”
  6. 资源文件:“OpenGL.rc”,“res/OpenGL.ico”,“res/OpenGLDoc.ico”,“res/Toolbar.bmp”,“res/OpenGL.rc2”,“OpeGL.manifest”,“Earth.bmp”
  7. 文件 -> 新建 -> 项目:选择自定义向导
  8. 添加项目名称
  9. 添加项目位置

编辑 HTML

Sample screenshot

这张图片展示了 HTML 编辑的截图。我从工具箱创建了 HTML 资源。并定义了一个 HTML 资源 ID。它使用条件来指定源文件到模板文件。

例如:

如果我在 html 中定义了 SUPPORT_FOG_SUPPORT,它会为源代码设置条件。它以这种方式用于源文件:[!if id_value] 一些源代码 [!endif]

    void C[!output PROJECT_NAME]View::InitOpenGL(void) // output project class
    {
    [!if SUPPORT_ALPHA_BLEND]
     glEnable(GL_DEPTH_TEST);                                      // depth buffering(z-buffering) 가동
    [!endif]
    
     glEnable(GL_NORMALIZE);                                       // unit vector change
     glEnable(GL_COLOR_MATERIAL);
    
     Obj=gluNewQuadric();
    
    [!if SUPPORT_OMNI_LIGHT || SUPPORT_SPOT_LIGHT]
     InitLight();
    [!endif]
    
    [!if SUPPORT_TEXTURE_EFFECT]
     InitTexture();
    [!endif]
    
    [!if SUPPORT_ALPHA_BLEND]
     InitAlphaTest();
    [!endif]
    <blink>[!if SUPPORT_FOG_EFFECT]</blink>
     InitFog();
    [!endif]
    [!if NOSUPPORT_FOG_EFFECT]
     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    [!endif]
     InitShadingModel();
    
     glMatrixMode(GL_PROJECTION);                                  // initialize projection matrix
     glLoadIdentity();
    
     InitProjection();
    
     glMatrixMode(GL_MODELVIEW);                                   // initialize modelview matrix
     glLoadIdentity();
    }

如何编写脚本

脚本文件决定了创建项目路径、项目名称、项目选项和文件的关键因素。

OnFinish 函数使用项目向导中的输入参数来创建项目名称和项目路径。

    
function OnFinish(selProj, selObj)
    {
     try
     {
      var strProjectPath = wizard.FindSymbol('PROJECT_PATH');
      var strProjectName = wizard.FindSymbol('PROJECT_NAME'); 
      selProj = CreateCustomProject(strProjectName, strProjectPath);
      AddConfig(selProj, strProjectName);
      AddFilters(selProj); 
      var InfFile = CreateCustomInfFile();
      AddFilesToCustomProj(selProj, strProjectName, strProjectPath, InfFile);
      PchSettings(selProj);
      InfFile.Delete(); 
      selProj.Object.Save();
     }
     catch(e)
     {
      if (e.description.length != 0)
       SetErrorInfo(e);
      return e.number
     }
    } 
    

CreateCustomProject 函数使用 default.vcproj 和向导类型来创建自定义项目向导。

function CreateCustomProject(strProjectName, strProjectPath)
    {
     try
     {
      var strProjTemplatePath = wizard.FindSymbol('PROJECT_TEMPLATE_PATH');
      var strProjTemplate = '';
      strProjTemplate = strProjTemplatePath + '\\default.vcproj'; 
      var Solution = dte.Solution;
      var strSolutionName = "";
      if (wizard.FindSymbol("CLOSE_SOLUTION"))
      {
       Solution.Close();
       strSolutionName = wizard.FindSymbol("VS_SOLUTION_NAME");
       if (strSolutionName.length)
       {
        var strSolutionPath = strProjectPath.substr(0, strProjectPath.length - strProjectName.length);
        Solution.Create(strSolutionPath, strSolutionName);
       }
      } 
      var strProjectNameWithExt = '';
      strProjectNameWithExt = strProjectName + '.vcproj'; 
      var oTarget = wizard.FindSymbol("TARGET");
      var prj;
      if (wizard.FindSymbol("WIZARD_TYPE") == vsWizardAddSubProject)  // vsWizardAddSubProject
      {
       var prjItem = oTarget.AddFromTemplate(strProjTemplate, strProjectNameWithExt);
       prj = prjItem.SubProject;
      }
      else
      {
       prj = oTarget.AddFromTemplate(strProjTemplate, strProjectPath, strProjectNameWithExt);
      }
      return prj;
     }
     catch(e)
     {
      throw e;
     }
    } 
    
AddFilter 函数过滤模板文件中的每种类型。
    function AddFilters(proj)
    {
     try
     {
      // Add the folders to your project using Templates.inf
      var strSrcFilter1 = wizard.FindSymbol('SOURCE_FILTER'); 
      var strSrcFilter2 = wizard.FindSymbol('HEADER_FILTER');  
      var strSrcFilter3 = wizard.FindSymbol('RESOURCE_FILTER');
      
      var group1 = proj.Object.AddFilter('Source Files');  // Source Files Group create
      var group2 = proj.Object.AddFilter('Header Files');  // Header Files Group create
      var group3 = proj.Object.AddFilter('Resource Files');   // Resource files Group create
    
    
      // Apply Filter
      group1.Filter = strSrcFilter1; 
      group2.Filter = strSrcFilter2;
      group3.Filter = strSrcFilter3;   
     }
     catch(e)
     {
      throw e;
     }
    }

这次是 AddConfig 函数。此函数对于项目属性非常重要。此函数决定编译类型。对象获取编译类型(如 Debug 和 Release)的配置。config 变化会在项目属性中插入选项,例如字符集、库类型、使用 mfc 库。CLTool 变体是“编译选项”变体。此变体决定编译选项,例如 debugenabled、多线程、编译级别、预编译头和预处理选项。LinkTool 变体是“链接选项”变体。此变体决定链接
选项,例如数据库文件、附加库。

    function AddConfig(proj, strProjectName)
    {
     try
     {
      var config = proj.Object.Configurations('Debug');
      config.IntermediateDirectory = 'Debug';
      config.OutputDirectory = 'Debug';
      config.CharacterSet = charSetMBCS;
      config.useOfMfc = useOfMfc.useMfcDynamic; 
      var CLTool = config.Tools('VCCLCompilerTool');
      // TODO: Add compiler settings 
      CLTool.DebugInformationFormat = debugEnabled; 
      CLTool.DebugInformationFormat = debugOption.debugEditAndContinue;
      CLTool.SuppressStartupBanner = true; 
      CLTool.RuntimeLibrary = runtimeLibraryOption.rtMultiThreadedDebugDLL; 
      CLTool.WarningLevel = warningLevelOption.warningLevel_3; 
      CLTool.Optimization = optimizeOption.optimizeDisabled;
      CLTool.MinimalRebuild = true;
      CLTool.DebugInformationFormat = debugOption.debugEditAndContinue;
      CLTool.PreprocessorDefinitions = "WIN32;_WINDOWS;_DEBUG";
      CLTool.UsePrecompiledHeader = pchGenerateAuto;  
      var LinkTool = config.Tools('VCLinkerTool');
      // TODO: Add linker settings 
      LinkTool.ProgramDatabaseFile = "$(OutDir)/$(ProjectName).pdb"; 
      LinkTool.GenerateDebugInformation = true;
      LinkTool.LinkIncremental = linkIncrementalYes; 
      LinkTool.OutputFile = "$(OutDir)/$(ProjectName).exe";
      LinkTool.SuppressStartupBanner=true;  // nologo
      LinkTool.AdditionalDependencies="opengl32.lib glu32.lib glut32.lib";
      LinkTool.SubSystem = subSystemOption.subSystemWindows; 
      
      config = proj.Object.Configurations('Release');
      config.IntermediateDirectory = 'Release';
      config.OutputDirectory = 'Release';
      config.CharacterSet = charSetMBCS; 
      config.useOfMfc = useOfMfc.useMfcDynamic;
      
      var CLTool = config.Tools('VCCLCompilerTool');
      // TODO: Add compiler settings 
      CLTool.DebugInformationFormat = debugEnabled; 
      CLTool.DebugInformationFormat = debugOption.debugEnabled; 
      CLTool.SuppressStartupBanner = true; 
      CLTool.RuntimeLibrary = runtimeLibraryOption.rtMultiThreadedDLL; 
      CLTool.WarningLevel = warningLevelOption.warningLevel_3; 
      CLTool.Optimization = optimizeOption.optimizeMaximizeSpeed;
      CLTool.MinimalRebuild = true;
      CLTool.PreprocessorDefinitions = "WIN32;_WINDOWS;NDEBUG";
      CLTool.UsePrecompiledHeader = pchGenerateAuto;  
      var LinkTool = config.Tools('VCLinkerTool');
      // TODO: Add linker settings 
      LinkTool.ProgramDatabaseFile = "$(OutDir)/$(ProjectName).pdb"; 
      LinkTool.GenerateDebugInformation = true;
      LinkTool.LinkIncremental = linkIncrementalYes; 
      LinkTool.OutputFile = "$(OutDir)/$(ProjectName).exe";
      LinkTool.SuppressStartupBanner=true;  // nologo
      LinkTool.AdditionalDependencies="opengl32.lib glu32.lib glut32.lib";
      LinkTool.SubSystem = subSystemOption.subSystemWindows; 
     }
     catch(e)
     {
      throw e;
     }
    }
      

最后,我修改了 GetTargetName 函数。此函数使用项目名称创建目标项目文件。首先,我从项目向导中获取项目名称。然后此函数将模板文件更改为目标文件。

    function GetTargetName(strName, strProjectName)
    {
     try
     {
      // TODO: set the name of the rendered file based on the template filename
      var strTarget = strName;
      var strProjectName = wizard.FindSymbol('PROJECT_NAME');
    
      if (strName == 'readme.txt')
       strTarget = 'ReadMe.txt';
    
      if (strName == 'sample.txt')
       strTarget = 'Sample.txt';
       
      if (strName == 'stdafx.cpp')
       strTarget =  'stdafx.cpp';
     
      if (strName == 'stdafx.h')
       strTarget =  'stdafx.h'; 
    
      if (strName == 'OpenGL.h')
       strTarget =  strProjectName + '.h';  
       
      if (strName == 'OpenGL.cpp')
       strTarget =  strProjectName + '.cpp';     
    
      if (strName == 'MainFrm.h')
       strTarget =  'MainFrm.h';  
       
      if (strName == 'MainFrm.cpp')
       strTarget =  'MainFrm.cpp';     
    
      if (strName == 'OpenGLView.h')
       strTarget =  strProjectName + 'View.h';  
       
      if (strName == 'OpenGLView.cpp')
       strTarget =  strProjectName + 'View.cpp';     
    
      if (strName == 'OpenGLDoc.h')
       strTarget =  strProjectName + 'Doc.h';  
       
      if (strName == 'OpenGLDoc.cpp')
       strTarget =  strProjectName + 'Doc.cpp';     
    
      if (strName == 'OpenGL.rc')
       strTarget =  strProjectName + '.rc';
    
      if (strName == 'resource.h')
       strTarget =  'Resource.h';  
       
      if (strName == 'Res/OpenGL.ico')
       strTarget =  'Res/' + strProjectName + '.ico';     
    
      if (strName == 'earth.bmp')
       strTarget =  'earth.bmp';     
    
      if (strName == 'Res/OpenGL.rc2')
       strTarget =  'Res/' + strProjectName + '.rc2';
       
      if (strName == 'Res/OpenGLDoc.ico')
       strTarget =  'Res/' + strProjectName + 'Doc.ico';     
          
      if (strName == 'Res/OpenGL.manifest')
       strTarget =  'Res/' + strProjectName + '.manifest';       
      
      return strTarget; 
     }
     catch(e)
     {
      throw e;
     }
    }

安装指南

您解压演示 zip 文件。它会创建一个 Visual Studio .NET 2003 文件夹。此文件夹的组成如下:

    vc 7-> vcprojects
    
                 -> OpenGL Wizard.ico : icon file
    
                 -> OpenGL Wizard.vsz : Project Wizard connection file
    
          -> VCWizards
    
                 ->  OpenGL Wizard
    
                       -> 1033 : html style css file
    
                       -> HTML : html files
    
                       -> Images : wizard image fles
    
                       -> Scripts : script for wizard 
    
                       -> Templates : project template source files for creating project
然后将其复制到 Visual Studio .NET 文件夹。如果您复制了这些文件,您将在新建项目创建向导中看到 OpenGL 向导。OpenGL 向导包含九个步骤。第一步是文档类型。它描述了该程序。其他选项与 OpenGL 库相关,例如光照、投影、着色、Alpha 混合、雾、纹理、动画、拾取。
© . All rights reserved.