【问题标题】:SlimDx FullScreen Switching Problem to Window ModeSlimDx 全屏切换到窗口模式的问题
【发布时间】:2011-03-08 15:06:20
【问题描述】:
 // 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 属性。设备是否在某处丢失?

【问题讨论】:

  • 我想我不明白。为什么上面给出的使用 GetFullScreenState、SetFullScreenState 的方法不起作用?根据这些方法的文档,它们似乎应该可以工作。

标签: directx fullscreen slimdx directx-11


【解决方案1】:

我也是这个 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)工作得很好。通过采用我原来的窗口化描述并重新传递窗口模式而不是全屏模式,一切正常。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这就是我所做的:

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多