SlimDx FullScreen Переключение проблемы в оконном режиме
// 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 ответа
Я новичок в этом мире slimDX (и пишу на stackru) и столкнулся с вашим вопросом, основанным на той же проблеме. Я знаю, что это 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) в качестве предназначенной функции работает просто отлично. Принимая мое оригинальное, оконное, описание и повторно передавая режим, который является оконным и не полноэкранным, все работает как надо.
Так вот что я сделал:
if (e.Alt && e.KeyCode == Keys.Enter)
{
bool isFull = swapChain.Description.IsWindowed;
swapChain.SetFullScreenState(isFull, null);
}
Это работает для меня и немного чище, чем другие, вы могли бы даже сократить 1 строку и просто поместить строку.IsWindowed в SetFullScreenState.
Как отмечалось в этой учебной ссылке, мы добавили свойство IsFullScreen в библиотеку именно по этой причине, но в настоящее время оно находится только в репозитории (пока официального релиза для него нет).
Мы привязываем наши выпуски к расписанию выпусков DirectX, и мы никогда не предполагали, что они выпустят следующий выпуск так долго. Они делали это один раз в квартал, но мы не видели релиз с июня 2010 года.