方法 : 画面の回転を処理する

更新 : 2007 年 11 月

縦位置以外の画面の向きを使用する Direct3D アプリケーションを開発できます。ただし、縦位置以外の方向で表示するためのサポートは、デバイス ドライバによってレベルが異なります。そのため、アプリケーションで画面の回転を処理するには、次の推奨手順に従ってください。

ms229671.alert_note(ja-jp,VS.90).gifメモ :

マネージ Direct3D モバイル アプリケーションでは、Windows Mobile Version 5.0 Software for Pocket PC と Windows Mobile Version 5.0 Software for Smartphone が必要です。Windows Mobile ソフトウェアおよび SDK については、「.NET Compact Framework の外部資料」を参照してください。

次のコード例は Windows Software Development Kit (SDK) にあります。

画面が回転状態であることを検出するには

  1. Microsoft.WindowsCE.Forms コンポーネントへの参照をプロジェクトに追加します。

  2. 検出コードを追加する最も簡単な方法では、メイン フォームの Resize イベント ハンドラにコードを配置します。フォームのコンストラクタにイベントハンドラのデリゲートを追加します。

    this.Resize += new System.EventHandler(this.MyForm_Resize);
    
    AddHandler Resize, AddressOf Me.MyForm_Resize
    
  3. 方向が変更されたタイミングを追跡するブール型の orientationChanged クラス メンバ変数を追加します。ScreenOrientation プロパティの値を使用して現在の方向を特定します。Angle0 の値は、縦向きモードを示します。現在の向きが異なる場合は、orientationChanged フラグを設定することによってそれを示します。通常は、アプリケーションがバックグラウンドにある可能性があるため、この時点では何もアクションは行われません。サイズ変更イベントの原因となった向きの変更が完了していない可能性があるため、この時点では、プログラムで向きを変更しないでください。すぐに向きを元に戻そうとすると、失敗します。

        // 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 モバイルの行列のサンプル

.NET Compact Framework での Mobile Direct3D プログラミング