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 года.

Другие вопросы по тегам