Поделиться через


Пошаговое руководство. Обработка поворотов экрана

Обновлен: Ноябрь 2007

Можно разработать приложения Direct3D для ориентаций экрана, отличных от книжной. Но драйверы устройств обеспечивают различные уровни поддержки отрисовки в не книжной ориентации, так что лучше следовать рекомендованной практике обработки ориентации экрана.

ms229671.alert_note(ru-ru,VS.90).gifПримечание.

Управляемым мобильным приложениям Direct3D требуется программа Windows Mobile версии 5.0 для карманных ПК и смартфонов. Сведения о программе Windows Mobile и пакетах SDK см. в разделе Внешние ресурсы для платформы .NET Compact Framework.

Следующие примеры кода находятся в SDK (пакет средств разработки программного обеспечения) для Windows.

Для определения того, что экран находится в повернутом состоянии

  1. Добавьте ссылку на компонент Microsoft.WindowsCE.Forms в проект.

  2. Самый легкий способ — это добавить код подлинности на место обработчика событий Resize главной формы. Добавьте делегат для обработчика событий в конструктор вашей формы.

    this.Resize += new System.EventHandler(this.MyForm_Resize);
    
    AddHandler Resize, AddressOf Me.MyForm_Resize
    
  3. Добавьте переменную типа Boolean члена класса orientationChanged, которая будет отслеживать изменения ориентации экрана. Используйте значение свойства ScreenOrientation для определения текущей ориентации. Значение Angle0 указывает на книжный режим. Если текущая ориентация отличается от книжной, отметьте это установкой флага orientationChanged. Обычно, в этом случае ничего не происходит, т. к. приложение может выполняться в фоновом режиме. Здесь нельзя изменить ориентацию программно, т. к. изменение ориентации, вызывающее событие Resize, возможно, еще не завершено. Попытка прямо сейчас изменить ориентацию обратно будет неудачной.

        // Add a class member variable to
        // store that the orientation has changed.
        bool orientationChanged = false;
    
        private void MyForm_Resize(object sender, EventArgs e)
        {
           if (SystemSettings.ScreenOrientation !=
             ScreenOrientation.Angle0)
            orientationChanged = true;
        }
    
        ' Add a class member variable to
        ' store that the orientation has changed.
        Dim OrientationChanged As Boolean = False
    
    Private Sub MyForm_Resize(ByVal sender As Object, ByVal e As EventArgs)
        If (SystemSettings.ScreenOrientation <> ScreenOrientation.Angle0) Then
           orientationChanged = True
        End If
    End Sub
    

Как действовать при повороте экрана.

  • Можно проверить каждый фрейм для определения, изменилась ли ориентация. Метод CheckRotation в следующем примере кода изменяет ориентацию экрана обратно на книжную путем установки свойства ScreenOrientation. Следует рассмотреть возможность других действий, в зависимости от желаемого уровня удобства работы пользователя. Например, приложение не может само изменить ориентацию экрана, но вместо этого оно может напоминать пользователю, что отрисовка не будет возобновлена, пока пользователь не изменит ориентацию экрана обратно. Если Вы изменили ориентацию экрана, Вам следует сохранить и восстановить начальную ориентацию экрана, как показано в следующем примере. Если Вы не изменяли ориентацию экрана, а вместо этого предприняли какие-то другие действия, то отрисовка может продолжаться нормально, может быть прекращена или могут возникнуть ошибки с возвращением исключений.

    Следующий пример кода пытается вернуть устройство в режим книжной ориентации, если оно еще не в нем. Метод CheckOrientation возвращает true, если устройство находится в режиме книжной ориентации.

    private bool CheckOrientation()
    {
        // orientationChanged is set to true in resize if it is
        // detected that the orientation of the device has changed.
        if (orientationChanged)
        {
          // Attempt to change the display back to portrait mode.
          try
          {
             SystemSettings.ScreenOrientation =
              ScreenOrientation.Angle0;
             // Now that the orientation is back to portrait mode
             // Do not attempt to change it again.
             orientationChanged = false;
           }
          catch (Exception)
          {
             // Failed to change the display mode.
             return false;
          }
        }
        return true;
    }
    
    // Use the CheckOrientation() method before rendering occurs.
    // All rendering for each frame occurs here.
    
    private void Render()
    {
        // If the device is not oriented properly, 
        // some display drivers may not work.
        if (!CheckOrientation())
            return;
            // Rendering code omitted here.
    }
    
    Private Function CheckOrientation() As Boolean
        ' orientationChanged is set to true in resize if it is
        ' detected that the orientation of the device has changed.
        If orientationChanged Then
            ' Attempt to change the display back to portrait mode.
            Try 
                SystemSettings.ScreenOrientation = ScreenOrientation.Angle0
                ' Now that the orientation is back to portrait mode
                ' Do not attempt to change it again.
                orientationChanged = false
            Catch  As Exception
                ' Failed to change the display mode.
                Return false
            End Try
        End If
        Return true
    End Function
    
    ' Use the CheckOrientation() method before rendering occurs.
    ' All rendering for each frame occurs here.
    Private Sub Render()
        ' If the device is not oriented properly, 
        ' some display drivers may not work.
        If Not CheckOrientation Then
            Return
        End If
        ' Rendering code omitted here.
    End Sub
    

Чтобы восстановить ориентацию при выходе из приложения

  • Если Вы решили изменить ориентацию экрана программно, Вам следует также восстановить начальную ориентацию приложения при выходе из него. Т. к. приложение может пытаться изменить ориентацию при выполнении, следует сохранить начальную ориентацию и восстановить ее при выходе из приложения. Добавьте переменную-член, чтобы сохранить начальную ориентацию.

    ScreenOrientation initialOrientation = SystemSettings.ScreenOrientation;
    
    ScreenOrientation initialOrientation = SystemSettings.ScreenOrientation;
    

    Добавьте это в конец метода Main чтобы попытаться восстановить ориентацию при выходе из приложения.

    if (SystemSettings.ScreenOrientation != initialOrientation)
    {
        try
        {
           SystemSettings.ScreenOrientation = initialOrientation;
        }
        catch (Exception)
        {
            // Unable to change the orientation back 
            // to the original configuration. 
    
            MessageBox.Show("This sample was unable to set the " +
                "orientation back to the original state.");
        }
    }
    
    If (SystemSettings.ScreenOrientation <> initialOrientation) Then
        Try 
            SystemSettings.ScreenOrientation = initialOrientation
        Catch  As Exception
            ' Unable to change the orientation back 
            ' to the original configuration. 
            MessageBox.Show(("This sample was unable to set the " & _
                "orientation back to the original state."))
        End Try
    End If
    

См. также

Основные понятия

Разделы руководства по платформе .NET Compact Framework

Другие ресурсы

Direct3D Mobile Matrices Sample

Мобильное программирование Direct3D в .NET Compact Framework