调试时不会加载 Directx 窗口

Posted

技术标签:

【中文标题】调试时不会加载 Directx 窗口【英文标题】:Directx window will not load when debugged 【发布时间】:2016-01-14 07:29:51 【问题描述】:

我正在尝试创建一个窗口并将设备初始化到该窗口,但每次运行该程序时,该窗口都不会加载。我在 Visual Studio 2015 中为 Windows 窗体应用程序执行此操作。 这里是form1.cs:

using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX.Direct3D;
namespace DirectXTutorial2

public partial class Form1 : Form

    private Device device;

    public Form1()
    
        InitializeComponent();
        InitializeDevice();
    

    public void InitializeDevice()
    
        PresentParameters presentParams = new PresentParameters();
        presentParams.Windowed = true;
        presentParams.SwapEffect = SwapEffect.Discard;
        device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
    

    private void Render()
    
        device.Clear(ClearFlags.Target, Color.DarkSlateBlue, 0, 1);
        device.Present();
    

    private void Form1_Paint(object sender, PaintEventArgs e)
    
        Render();
    


有没有人知道这个问题的解决方案? 我不知道它是否有帮助,但我正在运行 Windows 10、64 位、Directx 2010,并且我之前已经添加了我的参考资料。

【问题讨论】:

【参考方案1】:

好的,我找到了解决问题的方法。开发人员不再支持托管代码的 DirectX。适用于 DirectX 的最新框架是 .net Framework 3.5。托管代码也不支持 64 位。要解决此问题,请转到项目属性。在应用程序选项卡中找到目标框架并将您的 .net 框架更改为 3.5 或更低。接下来转到构建选项卡并找到平台目标,将其更改为 x86。

【讨论】:

【参考方案2】:

首先考虑在你的应用程序中使用try catch,因为DirectX中发生了很多事情,所以你需要确认你得到错误的步骤。

try
    

        PresentParameters presentParams = new PresentParameters();
        presentParams.Windowed=true;
        presentParams.SwapEffect = SwapEffect.Discard;
        device = new Device(0, DeviceType.Hardware, this, 
                CreateFlags.SoftwareVertexProcessing, presentParams);

    
    catch (DirectXException)
     
         return false; 
    

尝试使用不同的设备类型,例如DeviceType.Software

清除设备后添加开始和结束场景

device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
    device.BeginScene();
    device.EndScene();
    device.Present();

并尝试调用您的“渲染”; 'Main'函数中的函数

【讨论】:

发布此问题一小时后,我尝试了 try&catch,但没有返回。相反,我使用了 MessageBox.Show()。我也尝试了不同的设备类型,但调试仍然没有出现,甚至消息框也没有。谢谢,但我 100% 确定这是编译器问题。我正在做一些研究,一个人做了一个教程,做同样的事情,我和他的工作发现。唯一的区别是他的视觉工作室是旧版本。 是的,我已经添加了 public form1(),它应该在从 Main 调用 appliction.run(new form1()) 时使用,并且我也将 Render 放入 main。两者都做了相同的结果有上面的代码。

以上是关于调试时不会加载 Directx 窗口的主要内容,如果未能解决你的问题,请参考以下文章

将 DirectX 精灵移出屏幕时如何防止其被擦除

挂钩/覆盖 DirectX 游戏?

使用 DirectX 11 后重置窗口

窗口内的 DirectX 覆盖

c++ - Win32 窗口在第一次绘制后冻结(directx 11)

旋转相机时 DirectX 基元不会在屏幕上移动