如何在WinForm项目中调用DirectX诸多问题解决方案汇总!

2024-03-24 12:10

本文主要是介绍如何在WinForm项目中调用DirectX诸多问题解决方案汇总!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近想在WinForm上调用Directx来渲染绘图,结果遇到了以下这些问题,经过一段时间的尝试这些问题已经得到解决,特此与大家一起分享以下经验!


首先我们来讲讲整个的正常思路,最后会在下面讲解在调用Directx过程中出现的一些问题及其解决方案!

笔者的电脑及其开发的相关环境: Win8.1   使用Visual Studio 2013 版本
一、 新建WinForm窗体。
二、点击菜单栏--->项目--->添加引用--->找你所调用的Directx相关引用,然后在所选引用名前“打勾”点击确定完成引用!



这里对一些所用到的引用做一些介绍,根据需求大家可以自己选,以上图是笔者一开始所需的所以没有添加完全
这里只介绍常用的
Microsoft.DirectX 包含DX所必须的引用,包含一些公共类和数学相关
Microsoft.DirectX.Direct3D 支持3D图形
Microsoft.DirectX.Direct3DX 支持3D图形
Microsoft.DirectX.DirectDraw DDraw,属于DX9版本前的东西了不需要也罢
Microsoft.DirectX.DirectPlay 多玩家游戏的,与网络编程相关,一些API。
Microsoft.DirectX.DirectSound DSound 播放音效 
Microsoft.DirectX.DirectInput DInput  游戏相关操作的输入, 鼠标键盘事件啥的
Microsoft.DirectX.AudioVideoPlayback 多媒体相关,播放视频和音频</span>
三、当我们完成第二步之后开始Using这些引用了
一般情况下我们都必须引用以下三个
Microsoft.DirectX
Microsoft.DirectX.Direct3D
Microsoft.DirectX.Direct3DX
然后开始Using 这里只需要以下2个就行了,看代码


四、接着开始初始化DirectX设备,笔者选择在游戏Form的初始化之后初始化DirectX

</pre><pre name="code" class="csharp">public partial class GameForm : Form{//类全局变量声明 Device g_pd3dDevice = null;<span style="white-space:pre">	</span>//D3D设备创建public GameForm(){InitializeComponent();InitD3D_Device();<span style="white-space:pre">		</span>//D3D设备初始化函数}private void InitD3D_Device(){try{PresentParameters presentParams = new PresentParameters();<span style="white-space:pre">	</span>presentParams.Windowed = true;<span style="white-space:pre">		</span>//窗体形式渲染presentParams.SwapEffect = SwapEffect.Discard;g_pd3dDevice = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);<span style="white-space:pre">	</span>//创建设备}catch(DirectXException e)<span style="white-space:pre">	</span>//捕捉创建异常{MessageBox.Show(e.ToString(), "ERROR", MessageBoxButtons.OK);this.Close();}}}

五、当我们完成以上步骤之后,我们的WinForm项目 已经跟DirectX融为一体了接着我们将会讲如何在WinForm界面中使用Sprite来渲染图片


//电脑没电了。接下来会马上更新


1:我电脑安装了Directx SDK 为什么在 Visual Studio的菜单栏-->添加引用  里面没有发现DX相关的引用?

解决方案:  这是由于系统盘 C:\Program Files\Reference Assemblies\Microsoft\VSTO40  下没有DX先关的引用文件。

   所以我们要到    C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0  文件下找到DX的相关dll文件

   这个时候只需要把C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0  

           文件拷贝到C:\Program Files\Reference Assemblies\Microsoft\VSTO40 下,重新返回Visual Studio 打开添加引用即可看见DX相关引用

   当然你也可以选择  不拷贝,直接通过  添加引用界面 的 “浏览按钮”直接访问

   C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0  文件夹。手动导入并打勾确定添加引用。

   添加引用成功后。别忘了在项目所需DX的地方Using 相关的文件哦。


2:我导入DX引用并运行之后,编译并运行程序时代码报错



解决方案: 这是由于你的系统是64位的,你需要在配置管理器中添加一个X86的平台





选择X86的平台,然后返回项目确认 DEBUG平台为 X86

这个时候在此编译运行,有些机子可以通过,但是有些机子依然还是无法通过。
为什么呢?
这是因为在 工程目录下 App.config 文件中的代码不兼容所致
将App.config 代码改成以下代码

<?xml version="1.0"?>
<configuration><startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0"/></startup>
</configuration>

最后点击编译并运行,这个时候就可以发现 一个融合了DirectX的窗口终于可以运行了


这篇关于如何在WinForm项目中调用DirectX诸多问题解决方案汇总!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/841554

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J