0
 // 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并注意到交换链没有 IsFullScreen 属性。因此,我尝试使用其他可用的方法并遇到了问题。- 当我切换到全屏时,它会正常运行;但是,当我切换回非全屏时,我看到的只是一个不可移动的空白框。

怎么了?为什么没有教程中的 isFullScreen 属性。设备是否在某处丢失?

4

3 回答 3

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);
    }

希望有人会过来纠正我,如果我错了,或者你可以帮忙。

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

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

按照文章中的链接了解更多信息。

请注意,如果您不全屏显示,则应该传递 Null。您已经传递了 Null 以外的其他内容……确切地说是现有的渲染目标。现有的渲染目标现在已设置为全屏。按照函数的意图传递 Null(或 Nothing,因为它是 VB)工作得很好。通过采用我原来的、窗口化的、描述并重新传递窗口而不是全屏的模式,一切都像它应该的那样工作。

于 2011-01-29T21:16:41.063 回答
0

所以这就是我所做的:

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

它对我有用,并且比其他方式更干净,您甚至可以减少 1 行,只需将 .IsWindowed 行 a 放在 SetFullScreenState 中。

于 2011-03-08T07:06:20.697 回答
0

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

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

于 2011-02-04T17:11:17.660 回答