.Net Compact Framework 2.0においてSIPに対応したアプリの作り方

SIP(Software Input Panel)は、キーボードのついていないWindowsCE端末では入力のために無くてはならない物です。具体的には「手書き文字入力」や「キーボードパネル」などのタッチパネル上の入力機器を表します。
SIPは、WindowsCEの世界では、画面の一部を占めるウィンドウの扱いとなっており、特にPocketPCにおいては240x80(pixelではないので注意)の大きさとして固定されています。ここでミソなのは、画面の一部を隠していても、その下にあるアプリケーションそのものの表示領域にちょっかいをかけているわけではないということです。ウィンドウ(.Net Framework的にはForm)はそのままの大きさで表示され続け、SIP経由で入力されているかキーボードから入力されているかを特に意識していません。


にもかかわらず、SIPは表示される場所が画面下の方に固定されています。
すると、たとえばこんな時に困る羽目になります。

ローマ字や、仮名漢字変換はキャレットの位置でインラインで表示されます。ですが、当のSIPの位置は固定なので、キャレットを隠してしまっています。
かくして、何が打ち込まれているのか判らない状態になってしまいます。


そこで。
SIPが表示されているということをアプリ側が検知して、SIPのある位置には意味のある表示を行わない、という細工をする必要があります。Form自体の大きさは変わりませんので、アプリとしては「ウィンドウの一部のみを更新対象とする」という形になります。
コードとしては、以下の手順となります。

  1. Form全体を覆うPanelやTabControlなどのコンテナを最背面にDockStyle.Fillで置く(したの例ではtabControl1)
  2. Microsoft.WindowsCE.Forms.InputPanelのインスタンスを作成し(したの例ではm_InputPanel)、EnableChangedイベントにハンドラを関連づける
  3. EnableChangedイベントのハンドラでOnResizeハンドラを呼ぶ
  4. OnResizeハンドラで、InputPanelの状態にあわせてコンテナのクライアント領域を変更する

protected override void OnResize(EventArgs e)
{
base.OnResize(e);

if (m_InputPanel.Enabled)
{
tabControl1.Dock = DockStyle.Top;
Size clientsize = m_InputPanel.VisibleDesktop.Size;
tabControl1.Size = clientsize;
}
else
{
if (tabControl1.Dock != DockStyle.Fill)
{
tabControl1.Dock = DockStyle.Fill;
}
}
}

……ほんとにこれでいいのかなぁ?
Formのクライアント領域を変更できない以上、こんな作りにはなると思うんだけど……。