Tatsu still writes something... Fourth season

これからも私はなにかをしてなにかを書く

Win32なダイアログとPer-Monitor DPI

弟が高DPIなタブレットPCを購入したことに触発されて拙作を高DPI対応にしている今日この頃だが、Win32 APIで作ったプログラムのダイアログをどう処理するかで苦労したので、ここに注意点を書いておく。

  • 何もしないとプライマリモニタのDPIに応じた位置・大きさでダイアログ上の各コントロールが表示される。よって、Per-Monitor DPIに対応するのでなければ特に処理を加えなくてもよい。
  • ダイアログはWM_DPICHANGEDメッセージを受け取ってもダイアログ上のコントロールを移動・リサイズしないので、Per-Monitor DPIにWin32 APIで作ったダイアログを対応させるときはプログラムで移動・リサイズを行う必要がある。
  • WM_INITDIALOGメッセージが来た段階ではダイアログ上の各コントロールは表示されないので、表示された段階で位置・大きさを設定する必要がある。

後は、他でも書いてあるようにWM_DPICHANGEDメッセージを受け取ったらフォントを設定しなおして、コントロールの大きさ・サイズを変えてやればよいのだが、座標系をきちんと把握していないと訳が分からなくなるので親ウインドウがどこかを把握する必要があり、そこが書いてて戸惑ったところであった。