SlimDx全屏切换到窗口模式的问题

时间:2011-01-24 10:12:09

标签: directx fullscreen slimdx directx-11

 // handle alt+enter ourselves
        form.KeyDown += (o, e) =>
        {
            if (e.Alt && e.KeyCode == Keys.Enter) {
                bool Full;

                Output ThisOut;
                swapChain.GetFullScreenState(out Full, out ThisOut);

                if (Full == true)
                {

                    swapChain.SetFullScreenState(false, ThisOut);

                }
                else if (Full == false)
                {

                    swapChain.SetFullScreenState(true, ThisOut);

                }
            }
           //     swapChain.IsFullScreen = !swapChain.IsFullScreen;

我在SlimDx上使用了一个教程 - http://slimdx.org/tutorials/devicecreation.php并注意到没有swapchain的IsFullScreen属性。因此,我尝试使用其他可用的方法并遇到了问题。 - 当我切换到全屏时,它按预期运行;但是,当我切换回非全屏时,我看到的只是一个不可移动的空白框。

发生了什么事?为什么没有像教程中那样的isFullScreen属性。设备是否在某处丢失?

3 个答案:

答案 0 :(得分:2)

我是这个slimDX世界的新手(并在stackoverflow上发布)并根据同样的问题遇到了你的问题。我知道这是VB,你使用的是C#,但我已经成功了,注意你需要你原来的窗口模式描述:

Private Sub Form_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.Alt And e.KeyCode = Keys.Enter Then
        Dim isFull As Boolean
        swapChain.GetFullScreenState(isFull, Nothing)
        swapChain.SetFullScreenState(Not isFull, Nothing)
        swapChain.ResizeTarget(swapChainDescription.ModeDescription)
    End If
End Sub

我不是C#程序员,但这是我对它的看法:

form.KeyDown += (o, e) =>
    {
        bool Full;
        swapChain.GetFullScreenState(out Full, Null);
        swapChain.SetFullScreenState(!Full, Null);
        swapChain.ResizeTarget(swapChainDescription.ModeDescription);
    }

如果我错了或者你可以提供帮助,希望有人会来找我纠正。

基本上,如果我理解正确的话,它就不会寻找你已经完成的模式的描述。你已经得到了ThisOut并传递了ThisOut和ThisOut包含一个全屏标志,基于SetFullScreenState方法的性质。虽然它是SlimDX,但它都是MS DX,所以这里是参考:

http://msdn.microsoft.com/en-us/library/bb174579%28v=vs.85%29.aspx

按照文章中的链接发现更多信息。

请注意,如果你没有全屏,你应该通过Null。你已经传递了Null以外的东西......现在的渲染目标是准确的。现在渲染目标已设置为全屏。传递Null(或Nothing因为它是VB)因为函数意图正常工作。通过我的原始,窗口,描述和重新传递窗口而不是全屏的模式,一切都按照应有的方式进行。

答案 1 :(得分:0)

如该教程链接中所述,出于这个原因,我们向库中添加了一个IsFullScreen属性,但它目前只在存储库中(目前尚未正式发布)。

我们将我们的版本与DirectX发布计划挂钩,我们从未想过要花费这么长时间才能获得下一个版本。他们过去每季度做一次,但我们自2010年6月以来没有看过发布。

答案 2 :(得分:0)

所以这就是我所做的:

if (e.Alt && e.KeyCode == Keys.Enter)
    {
        bool isFull = swapChain.Description.IsWindowed;
        swapChain.SetFullScreenState(isFull, null);
    }

它对我有用并且比其他方式更清晰,你甚至可以减少1行并将.IsWindowed行放在SetFullScreenState中。