例えばExcel 2013の場合、今まで右下の表示スケールやマウスのセンターホイールで実現していた拡大縮小をピンチやストレッチでできるようになっていたり、また表示範囲の移動も指をスライドすることで可能になっており、これが予想以上に快適であったりします。
一方、Windows 8対応と称したアプリの中には、単にWindows 8での動作確認が完了したという意味合いのものも多数存在します。単なる動作確認済ではなく、タッチを有効活用するデスクトップアプリを作成するにはどうしたらよいでしょうか。
その答えの一つが、今回ご紹介する「InputMan for Windows Forms 7.0J SP1」を利用してアプリを構築することです。「InputMan for Windows Forms 7.0J SP1」に実装されたタッチを視野に入れた新機能を使って、本当のWindows 8対応デスクトップアプリを構築してみましょう。
(編注:本稿のサンプルファイルは記事冒頭のリンクからダウンロードしてください。以降、各見出しのカッコ内の文字が対応するプロジェクト名です)
Windows 8のIMEを制御(CZ1304InputScope)
「InputMan for Windows Forms 7.0J SP1」では、GcImeコンポーネントを使うことでWindows 8でのIMEの入力モード制御が可能になっています。
GcImeコンポーネントは非表示コンポーネントなので、ツールボックスからWindowsフォームデザイナにドラッグ&ドロップするとコンポーネントトレイに自動配置されます。
GcImeコンポーネントが配置されたフォーム上のコントロールには
- AutoShowSoftKeyboard
- CausesImeEvent
- ImeSentenceMode
- InputScope
- KanaMode
- ReadingStringOutput
などのプロパティが追加されます。
もちろん対象となるのはInputManで提供されるコントロールだけではなく、Windowsフォームに配置できる標準コントロールも対象です。
InputManのコントロール
- GcCharMask
- GcComboBox
- GcDateTime
- GcDate
- GcTime
- GcTextBox
- GcMask
- GcPostal
- GcAddressBox
標準コントロール
- ComboBox
- ContextMenuStrip
- DataGridView
- ListView
- MaskedTextBox
- MenuStrip
- PropertyGrid
- RichTextBox
- TextBox
- ToolStrip
- TreeView
入力モード制御は、この拡張されるプロパティの「InputScope」プロパティを使用します。しかし、ここで1つ疑問が生じます。Windowsフォームのコントロールには標準でImeModeプロパティがあります。このプロパティの説明には「選択されたときのオブジェクトのIMEの状態を決定します」とあります。ImeModeプロパティがあるのにInputScopeプロパティが必要な理由は何でしょうか。
Windows 8のデフォルト設定(グローバルインプットモード)では、IMEの切り替えがスレッド単位ではなくユーザ単位に変わった影響から、Windows 8のデスクトップアプリではImeModeプロパティが無視されてしまうのです。この状況はタッチ対応ディスプレイかどうかは影響しません。非タッチ対応ディスプレイのノートPCでも再現します。
対処方法としてはコントロールパネルでの変更というのも考えられますが、GcImeコンポーネントを使用し、グローバルインプットモードに対応したInputScopeプロパティで対応できます。
それではImeModeプロパティで「Katakana」を指定したTextBoxコントロールと、InputScopeプロパティで「KatakanaFullWidth」を指定したTextBoxコントロールでWindows 8でのIME入力モードがどうなるか確認してみましょう。
ImeModeプロパティの指定では「ひらがな」だったIME入力モードが、InputScopeプロパティの指定では「全角カタカナ」に変わってくれます。これでやっと従来の方法を踏襲した、より細かなIME入力モードの制御ができるようになりました。
いうなれば、ImeModeプロパティを使っているWindowsフォームアプリをWindows 8で動かしたり移植したりする場合は、GcImeコンポーネントの使用に切り替えることが仕様通り動作させるための大前提だといえます。
タッチキーボードを制御(CZ1304TouchKeyBoard)
Windows 8には、物理的なキーボードがないデバイス(例えばタブレットなどのスレートPC)用に、タッチ用ソフトウェアキーボードが標準装備されています。GcImeコンポーネントには、このソフトウェアキーボードの表示制御機能も組み込まれています。
GcImeコンポーネントでソフトウェアキーボード表示制御を行う方法は2通りあります。1つはGcImeコンポーネントが各コントロールに追加する「AutoShowSoftKeyBoard」プロパティ、もう一つはShowTouchKeyboardメソッド/HideTouchKeyboardメソッドによる明示的な制御です。
Public Class MainForm Private Sub Show_TextBox_Enter(sender As Object, e As EventArgs) Handles Show_TextBox.Enter Me.GcIme1.ShowTouchKeyboard() End Sub Private Sub Show_TextBox_Leave(sender As Object, e As EventArgs) Handles Show_TextBox.Leave Me.GcIme1.HideTouchKeyboard() End Sub End Class
GcImeコンポーネントによるソフトウェアキーボード表示制御で注意しなければならないのが、AutoShowSoftKeyBoardプロパティによる制御です。ヘルプファイルによると、コントロールのAutoShowSoftKeyBoardプロパティをTrueにした場合、そのコントロールが入力欄になったときに自動的にソフトウェアキーボードを表示すると説明があります。しかし、この機能はIMEパッドにソフトキーボード機能が付随するWindows XPやWindows Server 2003のみ有効の機能であるため、Windows Vista、Windows 7およびWindows 8ではいくらTrueに設定しても無視されてしまいます。
タッチキーボードに変更されているWindows 7以降で表示制御を行うには、ShowTouchKeyboardメソッド/HideTouchKeyboardメソッドで実現しなければなりません。タッチキーボードの場合はInputScopeプロパティの値に合わせて、表示されるキーボードのレイアウトが最適化されているためより使いやすいUIが実現できます。
なお、Windows VistaではOSの仕様で、いずれの方法でもスクリーンキーボードを表示させることはできません。
タッチによる選択範囲指定のサポート(CZ1304Gripper)
スマートフォンで文字入力を行ったことのある人にはおなじみともいえる機能が、文字の選択範囲を操作するときのグリッパー表示でしょう。グリッパー表示は文字列の選択範囲の始点と終点に〇印(グリッパー)を表示し、グリッパーをタッチ操作することで選択範囲の変更を容易にします。
InputManの入力コントロールであれば、どのコントロールであってもShowGrippersプロパティをTrueにすることで、タッチ操作で文字を選択しようとすれば自動的にグリッパー表示を行う設定が可能です。
ShowGrippersプロパティのデフォルト値はTrueなので、特にプロパティ値を変更する必要がないという点も効率的な開発に寄与します。なぜならば、実際に操作を行ってみるとグリッパーがない状態でのタッチ操作による文字列一部選択などは至難の業であり、グリッパー表示は必須ともいえる機能であると実感できるからです。
また、ShowGrippersプロパティがTrueであっても、タッチ操作ではなくマウス操作やキーボード操作で文字列選択を行ったときはグリッパー表示が行われません。これは従来の操作時には従来の動きを行うことで「なんか変なマークが表示される」というクレーム防止に役立ちます。
タッチで選択しやすい工夫(CZ1304DropDown)
InputManのコントロールにはドロップダウン表示を伴うものがいくつかあります。
- GcTextBox(テキスト)コントロール
- GcComboBox(コンボボックス)コントロール
- GcMask(マスク)コントロール
- GcPostal(郵便番号)コントロール
- GcDate(日付)コントロール
- GcDateTime(日時)コントロール
- GcNumber(数値)コントロール
- GcRichTextBox(リッチテキスト)コントロール
これらのコントロールには、TouchDropDownScaleプロパティという標準コントロールにはないプロパティが存在して、デフォルト値として「150%」が設定されています。
このプロパティはタッチ操作によりドロップダウン表示を行った際、ドロップダウン表示の一覧から項目を選択しやすいように、項目間の間隔を標準コントロールの間隔の「150%」に広げてくれます。
なお、あくまでも項目間の間隔を拡大するだけで、文字の大きさは変わらない点に注意してください。間隔拡大だけでもタッチの操作は容易になりますし、ドロップダウン時だけ文字の大きさも変えてしまうと、コントロールの横幅に収まる文字数が変わるといった影響が発生することになります。この機能設計はなかなか合理的だといえるでしょう。
また、この機能もタッチ操作を行ったときにだけ有効になります。ですから、マウス操作やキーボード操作でドロップダウン表示を行ったときの項目間の間隔は標準コントロールと互換性があります。しかしながらマウス操作であっても、項目間の間隔が広い方が使いやすいと感じる方もいると思います。そのため、今回の7.0J SP1では実装されていませんが、マウス操作でもドロップダウン表示の項目間の間隔を変更できる機能があると、さらに使いやすさが向上するのではないでしょうか。
MultiRowへの展開について
InputManでのタッチ操作時の機能追加を知ってしまうと、表形式でデータ入力を行うときにも同じような操作性を実現したいと思えてきます。
今回は詳しく触れませんが、そのようなときにお勧めなのが、「MultiRow for Windows Forms 7.0J SP1」です。
「MultiRow for Windows Forms 7.0J SP1」には、ズーム操作やスクロール操作のタッチ対応、InputManと同様の
- InputScopeプロパティによるIME入力モード制御
- グリッパー表示
- ドロップダウン時の項目間隔の拡大
など基本的な部分でのタッチ対応だけではなく、「InputMan for Windows Forms 7.0J SP1」をセル型として指定できるInputManCellもあります。
このようにInputMantとMultiRowを組み合わせることで、Windowsフォームで業務アプリを作成するときに必要な、ほぼすべてのデザインをタッチ対応にすることができます。
まとめ
InputManのコントロールでのタッチ操作機能を実体験してみると、Windowsフォームであったとしても、タッチに対する対応は必要不可欠であり「Windowsストアアプリじゃなくてデスクトップなのだから、従来の操作性だけ意識すれば問題ない」というのが手抜きのように思えてくるでしょう。そして、TouchDropDownScaleプロパティのように、マウス操作になれていない利用者が操作するときに適用したいと感じる機能もあります。
そういったことも含め、タッチ操作による操作性を考えることは、年齢などのさまざまな要素を加味した使いやすいデザイン(ユニバーサルデザイン)にも通じるということが見えてきます。
ぜひ、「InputMan for Windows Forms 7.0J SP1」を使って効率的にタッチ対応を行い、使いやすいデスクトップアプリを構築していただきたいと思います。