【发布时间】: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