Visual StudioのC#で[Form.Show()]メソッドを利用してフォームの表示を行う場合に、事前に[Location]プロパティで設定した位置と異なる場所に表示される場合の対処法について備忘録的に投稿します。
パネルにコントロールを追加した後で発生
原因は分かりませんが、私の場合はフォームを表示する前にコードでパネルとボタンを複数個追加して、画面の解像度に応じてフォームのサイズやボタンのサイズを動的に変更後に、例えば画面の右下に合わせて表示した際に遭遇しました。
デバッグ用に表示前のフォームの位置情報を出力しても正しく、表示すると想定した場所ではない位置に表示されるのでハマりました。
調べてみると、最近は高解像度のモニターを利用する際にWindows側で[拡大・縮小]の設定や、解像度の異なる複数のディスプレイで構築されたマルチモニター環境などの場合に、Windows側が自動で表示位置などの補正をしてしまうそうです。
Windows側で「余計なおせっかい的な補正」は、フォームが表示される直前などで行われるのでデバッグ作業が意味を成しません。
Opacity プロパティで透明表示
色々試しましたが[Opacity]プロパティで透明な状態で表示してからフォームの位置を設定する手順で解決ができました。
コードにすると、こんな感じです。
//Opacity = 0; でフォームを透明状態にします。
form.Opacity = 0;
//フォームは透明で画面上では見えませんが、ボタンなどのコントロールはマウスなどでクリックできてしまうので一時的にコントロールを無効にします。
form.Enabled = false;
//透明状態で表示。この時点でWindowsが自動補正などが行われます。
form.Show();
//フォームの表示位置を設定
form.SetLocation();
//フォームを有効化
form.Enabled = true;
//フォームの透明化を解除
form.Opacity = 1;
Hide() メソッドや Visibleプロパティは、フォームが表示されないためなのかWindows側の自動補正が影響しません。
Opacity プロパティを設定すると、透明状態での表示が可能になります。
まとめ
今回は短い記事ですがC#で[Form.Show()]メソッドを利用してフォームの表示を行う場合に、事前に[Location]プロパティで設定した位置と異なる場所に表示される場合の対処法について書きました。
直接の原因は分かりませんが、フォームを表示する際に、Locationプロパティで設定した場所に表示されない場合がありました。
調べてみると、Windowsがフォームの縮尺や位置を補正している可能性があるので、デバッグしても原因が分からない場合があります。
WinFormsプロジェクトでフォームを表示する際に設定した位置とは異なる場所に表示されてしまう人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
