Пошаговое руководство. Обработка поворотов экрана
Обновлен: Ноябрь 2007
Можно разработать приложения Direct3D для ориентаций экрана, отличных от книжной. Но драйверы устройств обеспечивают различные уровни поддержки отрисовки в не книжной ориентации, так что лучше следовать рекомендованной практике обработки ориентации экрана.
Примечание. |
---|
Управляемым мобильным приложениям Direct3D требуется программа Windows Mobile версии 5.0 для карманных ПК и смартфонов. Сведения о программе Windows Mobile и пакетах SDK см. в разделе Внешние ресурсы для платформы .NET Compact Framework. |
Следующие примеры кода находятся в SDK (пакет средств разработки программного обеспечения) для Windows.
Для определения того, что экран находится в повернутом состоянии
Добавьте ссылку на компонент Microsoft.WindowsCE.Forms в проект.
Самый легкий способ — это добавить код подлинности на место обработчика событий Resize главной формы. Добавьте делегат для обработчика событий в конструктор вашей формы.
this.Resize += new System.EventHandler(this.MyForm_Resize);
AddHandler Resize, AddressOf Me.MyForm_Resize
Добавьте переменную типа 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