ハイコントラスト環境に対応しよう!!

先日、ハイコントラストモードで Windows を使用されている海外在住の目の不自由な方からリストコントロールの白背景が眩しいので修正して欲しいという要望をいただきました。恥ずかしながらハイコントラストモードを使ったことはほとんどなく存在しか知らなかったのですが、ストライプ対応のためにカスタムドローしているリストコントロールが悪さをしていました。

CDI5_6_0

ハイコントラストモード非対応


CDI5_6_1

ハイコントラストモード対応

対応方法 MFC の場合

BOOL IsHighContrast()
{
HIGHCONTRAST hc;
hc.cbSize = sizeof(HIGHCONTRAST);
SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(HIGHCONTRAST), &hc, 0);
return hc.dwFlags & HCF_HIGHCONTRASTON;
}

って感じの関数をカスタムドロー/オーナードローしている関数の先頭で呼び出してハイコントラストモードの場合、ただちに return してカスタムドロー/オーナードローの処理をスキップするだけです。Win32 標準コントロールはデフォルトでハイコントラストモード対応です。

HIGHCONTRAST とか SPI_GETHIGHCONTRAST あたりで検索すれば関連情報は色々見つかりますし、難しいことはないのでカスタムドロー/オーナードローを利用したコントロールを使っている方はぜひ対応を検討してみてください。

なお、ハイコントラストモードへは、左 Alt + 左 Shift + Print Screen で瞬時に切り替えることができます。そのため、ハイコントラストモードかどうかを1度だけ判定して変数に保存するのは一見高速化につながりますが不適切な対応となります。再描画の度に確認するか、ハイコントラストモードへの遷移を検出するコードを用意しておきましょう。なお、CrystalDiskInfo は単純な前者の方法で対応しています。

Windows Forms や WPF でもそれほど手間をかけずに対応出来ると思いますので、もし非対応な部分があればぜひこれを機に修正をご検討ください。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です