読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Mobile(.NET Compact Framework)でSIP表示時にコントロールのサイズを変更して、SIPと干渉しないようにする

Windows Mobile 6.5 Professionalエディションが搭載されたWindows phoneでは、ハードキーボードを搭載しない端末が増えています。その手の端末では、文字の入力をする為にソフトキーボード(SIP:Soft Input Panel)を使用します。

ソフトキーボードを有効にすると、ソフトキーボード部分が最前面に表示されます。アプリが隠れてしまい、場合によっては文字を入力しようとしている部分を隠してしまう事になります。

カーソルがソフトキーボードで隠れてしまう

少し使い勝手が悪いですね。InputPanelコンポーネントを利用して改善しましょう。最終系としては、ソフトキーボードが表示されると、textEditの終端をソフトキーボードの上に移動させて被って表示されないようにします。

InputPanelは、マネージドコードからソフトキーボードの制御を行うことが出来るコンポーネントです。ツールボックスにありますので、フォームデザイナにてフォームにドラッグアンドドロップしてください。

f:id:ch3cooh393:20140515010924p:plain

追加したInputPanelをダブルクリックすると、EnabledChangedイベントのイベントハンドラがソースコードに追加されます。このEnabledChangedイベントは、ソフトキーボードが有効か無効に状態が変更されると通知されます。

  private void inputPanel1_EnabledChanged(object sender, EventArgs e)
  {
    if (inputPanel1.Enabled)
    {
      // ソフトキーボードが表示されている
    }
    else
    {
      // ソフトキーボードが表示されていない
    }
  }

次に、ソフトキーボードの表示状態の変化に応じて、textEditの高さを変更します。

「テキストエディタを作ろうの1回目」で、テキストボックスのDcokプロパティにはDockStyle.Fillを設定しました。Dockプロパティを設定すると、親コントロール(今回の場合はフォーム)のサイズ変更に合わせて、適切な配置でテキストのサイズを自動で変更します。

ソフトキーボードが非表示の場合は、今まで通りDockStyle.Fillを設定して、textEditをフォームの全部の端に合わせています。表示される場合は、DockプロパティにDockStyle.Topを設定して、フォームの上辺に揃えて配置した上で変更後の高さを設定します。

  private void inputPanel1_EnabledChanged(object sender, EventArgs e)
  {
    // 現在のテキストボックスの高さを取得
    int newHeight = textEdit.Height;
    
    if (inputPanel1.Enabled)
    {
      // ソフトキーボードが表示されている
      
      // テキストボックスの高さを設定するために
      // Dockプロパティを上辺にのみ揃える
      textEdit.Dock = DockStyle.Top;
      
      // ソフトキーボードの高さを考慮して、
      // 残った部分をテキストボックスの高さとする
      newHeight = newHeight - inputPanel1.Bounds.Height;
    }
    else
    {
      // ソフトキーボードが表示されていない
      
      // ソフトキーボードの事は考慮する必要がないので
      // フォームの全ての辺とドッキングさせる。
      textEdit.Dock = DockStyle.Fill;
    }
    
    // テキストボックスの高さを更新する
    textEdit.Height = newHeight;
  }

ソフトキーボードの有効・無効の切り替え時に、テキストボックスのDockプロパティと高さを変更しました。これでソフトウェアキーボードとテキストボックスが干渉しなくなりました。

テキストボックスの高さ変更後