前へ

スクリーンリーダー対応アプリ作成のために

PC-Talker試用記

メインウインドウ等の読み上げ(1)

まず、GDI関数群(TextOut等)で描いた文字は読まない
よく考えればあたりまえのことで、もしGDIで描いたものを読むなら、WM_PAINTが来るたびに読むことになってしまう。
(ところで、この文章をPC-Talkerに読ませてみたら、GDIを「グディー」と読んだ。ここは「ジーディーアイ」と読んでほしいところ。)

CreateWindow()で貼り付けたボタン等は、ダイアログボックス等と同じ扱いになる。

ただし、Tabキー等で移動できることが絶対条件である。フォーカスのある場所しか読まないわけだからこれも当然である。通常のウインドウでこれを実現するには,
・IsDialogMessage()を呼び出す
・コントロールをサブクラス化する
の二つの方法がある。
IsDialogMessage()を使う方法では、ダイアログと全く同じ挙動を簡単に実現できる。
サブクラス化は、もっと自由度が高くなる。

エディットコントロール、リストボックス、コンボボックス、スクロールバー等、直前のラベル文字列も読む場合、その「直前」は、CreateWindow()を呼び出した順番である。

また、IsDialogMessage()を使う場合、Tabキーで移動する順番も、CreateWindow()の順番になる。

WAVRECのメインウインドウ

WAVRECの場合、GDI関数による描画を読まないことはほとんど問題にならない。
経過時間を読ませてもアレだし、ファイル名はオープンの時に判っているはず。
(レベルオーバーの警告くらい出したほうがいいのかもしれないが…)

MioneMメインウインドウ

デター!スクロールバーの山。

当初「バランス」という文字列もGDI関数で描いていたため、複数あるスクロールバーの区別が全くつかなかった。(縦スクロールバーと横スクロールバーの区別もつかない)

とりあえず、CreateWindowの第二引数で個々のスクロールバーに別々の文字列を設定してみたが効果は無かった。SetWindowText()しても無駄だった。

また、旧バージョンであるPC-Talker 2.0では全てのスクロールバーを、無関係なグループボックスの文字列を使って「左右チャンネル処理のスクロールバー」と読んだ。CreateWindowの第三引数でウインドウスタイルにWS_GROUPを追加して別のグループであることを明示しても無駄だった。(新バージョンPC-Talker 3.0ではタイトルバーの文字列を使って「MioneMのドラッグバー 選択」と読む。)

この問題は、スクロールバーの直前にスタティックテキストを置くことで解決する。(あくまで「直前」なので、10個のスクロールバーには、同じ内容にもかかわらず10個の別々のスタティックテキストを置く必要がある。すげーリソースの無駄遣いな気がするが…。しかも、エディットコントロールの場合は1つのスタティックテキストで複数のコントロールのラベルを共用できるのに……)
このスタティックテキストは、WS_VISIBLEもしくはShowWindow(SW_SHOW)で見える状態にする必要があるが、実際に見える必要は無い。(他のコントロールの後ろに配置して隠しても良いということ。)

ただ、MioneMの場合、モード切り替えでグライコを使わない状態にできるので、その時「ウィンドウ全文読み」で読まないようにするには、ShowWindow(SW_HIDE)で隠す必要がある。

さて、上記の対策で、「バランスのドラッグバー」「グライコのドラッグバー」などと読ませることはできるが、まだ、つまみの位置は読まない。「+12デシベル」などの値をどうにかして読ませないと実用にならない。

私が現時点でとった解決方法

たいていのスクリーンリーダーにはクリップポードの内容を読む機能がある。
PC-Talkerの場合、「クリップポード自動読み」の設定項目があり、これをONにしていると、アプリがクリップボードに文字列を転送した瞬間に、それを読み上げる。(自動読みをOFFにしている場合でも、キーボード操作で現在のクリップボードの内容を読むことが可能。)

そこでこの機能を利用することにした。

ただし、つまみを動かすたびに転送したのでは、自動読みの場合にかえってわずらわしい気がした(特にPC-Talker2.0ではつまみを動かすと「スクロールバー ドラッグ」と読むのでこれと重なることが考えられる)ので、特定のキーを押した時に現在フォーカスのあるコントロールの値だけをクリップボードに転送するようにした。(この実現にはコントロールのサブクラス化が必要である。)

この方法を使う時の注意点

スクリーンリーダーを使っていない人にとっては、いつのまにかクリップボードの内容が変わっているというのは受け入れがたい。ので、必ずON/OFFの切り替えができるようにすること。

細かい話

"11〜32Hz -13db"という文字列をクリップボードに転送すると、 「じゅういち なみせん さんじゅうに ヘルツ マイナス じゅうさん でーびー」 と読んだ。この場合クリップボードに転送する情報は画面情報と共用にする必要はないので、 もっと工夫したほうが良いかもしれない。

他に考えられる解決方法

1.スタティックテキストに突っ込む
2.タイトルバーに突っ込む
3.ステータスバーを利用する
4.スクロールバーではなくトラックバーを使う
5.スクロールバーではなくエディットコントロールとスピンボタンを使う
などが考えられる。次のページで個別に検討してみる。
次ページ

コメント、トラックバックはココログ