// 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属性。设备是否在某处丢失?
答案 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中。