【问题标题】:Creating RenderForm (slimdx) outside main Program在主程序之外创建 RenderForm (slimdx)
【发布时间】:2014-03-13 18:19:30
【问题描述】:

我卡在slim DX的一开始..

我的 MdiParent 名字是 view

我想要做的是创建一个RenderForm() 或类似的,在作为 MdiChild 的表单应用程序内部,RenderForm() 是我们显示 DirectX 的表单。 这样做的原因是能够在父窗体中创建菜单栏和按钮等。 我尝试为渲染创建一个新表单,但它不适用于MessagePump()。整个应用程序挂起。其原因可能是无限循环。 我尝试过的另一种方法是通过从主程序调用函数在视图内创建一个 RenderForm 这也不是很好,因为主程序在

之后没有执行任何代码
Application.EnableVisualStyles();
Application.Run(new view()); 

我尝试了很多不同的方法,但都没有成功。我已经用谷歌搜索了几个小时没有结果。

我尝试修改的代码是从 SlimDX 教程 2 复制的:

使用 System.Windows.Forms; 使用 SlimDX; 使用 SlimDX.Direct3D11; 使用 SlimDX.DXGI; 使用 SlimDX.Windows; 使用设备 = SlimDX.Direct3D11.Device; 使用资源 = SlimDX.Direct3D11.Resource; 命名空间 DeviceCreation { 静态类程序 { 静态无效主要() { var form = new RenderForm("教程 2:设备创建"); var description = new SwapChainDescription() { 缓冲区计数 = 1, 用法 = Usage.RenderTargetOutput, OutputHandle = form.Handle, IsWindowed = 真, ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = 新的 SampleDescription(1, 0), 标志 = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; 装置装置; 交换链交换链; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, out device, out swapChain); // 创建我们的渲染目标的视图,这是我们刚刚创建的交换链的后台缓冲区 渲染目标视图渲染目标; 使用 (var resource = Resource.FromSwapChain(swapChain, 0)) renderTarget = new RenderTargetView(设备,资源); // 如果您想实际看到任何东西,则需要设置视口 var context = device.ImmediateContext; var viewport = new Viewport(0.0f, 0.0f, form.ClientSize.Width, form.ClientSize.Height); context.OutputMerger.SetTargets(renderTarget); context.Rasterizer.SetViewports(视口); // 防止 DXGI 处理 alt+enter,这在 Winforms 中不能正常工作 使用 (var factory = swapChain.GetParent()) factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAltEnter); // 处理 alt+enter 我们自己 form.KeyDown += (o, e) => { if (e.Alt && e.KeyCode == Keys.Enter) swapChain.IsFullScreen = !swapChain.IsFullScreen; }; MessagePump.Run(form, () => { // 将渲染目标清除为舒缓的蓝色 context.ClearRenderTargetView(renderTarget, new Color4(0.5f, 0.5f, 1.0f)); swapChain.Present(0, PresentFlags.None); }); // 清理所有资源 // 我们错过的任何东西都会显示在调试输出中 渲染目标.Dispose(); 交换链.Dispose(); 设备.Dispose(); } } }

我从来没有成功地将 MessagePump() 放在主程序之外。

【问题讨论】:

    标签: c# directx visual-studio-2013 slimdx


    【解决方案1】:

    我已经用 SlimDX 玩了几天了。 MessagePump() 确实创建了一个无限循环。我相信您可以在新线程上创建子表单,也可以使用 RenderForm 而不是 Form 扩展父表单,这就是我所做的。

    public partial class view: RenderForm
    {
        public View()
        {
            // The static void Main code goes here
        }
    }
    

    编辑

    这是您在父线程的新线程上启动它的方式:

    public partial class Form1 : Form
    {
        Form2 renderForm;
    
        public Form1()
        {
            InitializeComponent();
    
            openNewRenderForm();
        }
    
        private void openNewRenderForm()
        {
            Thread thread = new Thread(new ThreadStart(startRenderForm));
            thread.Start();
        }
    
        private void startRenderForm()
        {
            renderForm = new Form2();
        }
    }
    

    只需删除“var form = new RenderForm("Tutorial 2: Device Creation");”如果 Form2 扩展了 RenderForm,则来自 RenderForm 的行。

    【讨论】:

    • 非常感谢,这将为我带来一些新的想法。但是当我尝试从另一个表单打开 View() 时,应用程序仍然挂起。错误消息如果有帮助.. System.Windows.Forms.dll 中发生“System.InvalidOperationException”类型的未处理异常附加信息:在单个线程上启动第二个消息循环不是有效操作。请改用 Form.ShowDialog。我必须能够从另一个与 slimDX 完全没有连接的表单中打开 SlimDX RenderForm。我想知道创建多个项目是否更容易。
    • 确切的问题似乎是,如何从父级设置消息循环(MessagePump)。我坚信/希望这能解决所有问题!
    • 添加了一种在新线程上创建表单的方法。让它在我身边工作。希望它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2011-12-17
    • 2011-09-30
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多