ごまなつ Blog

楽しく働ける世界を目指して

【C#】親フォームの中央に子フォームを表示したい

結論

親フォーム側で子フォームを呼び出すときに、

var frm = new Form1;
frm.Owner = this;
frm.StartPosition = FormStartPosition.CenterParent;

経緯

フォームアプリを作っており、子フォームにデータの内容を入力して、その内容を親フォームに反映するようにしていました。なにも設定せずに呼び出すと、子フォームが親フォームと離れた位置に表示されることがありました。よって、子フォーム側に

this.Location = new Point(
this.Owner.Location.X + (this.Owner.Width - this.Width) / 2,
this.Owner.Location.Y + (this.Owner.Height - this.Height) / 2);

を記載し、子フォームを表示したところ位置は親フォームの中心だったのですが、デュアルディスプレイの場合、サブディスプレイに親フォームを移動してから子フォームを表示すると、メインディスプレイに子フォームが表示されます(計算した座標は合っている)。

どちらのディスプレイに表示されているかを取得し、設定してもよかったのですが、調べていくうちに親フォーム側に設定することで実現できることが分かりました。それが

var frm = new Form1;
frm.Owner = this;
frm.StartPosition = FormStartPosition.CenterParent;

でした。呼び出す前(ShowDialogする前)に、親フォームは自分だと指定して、StartPositionを親の中心にする設定で実現できました。これなら、デュアルディスプレイでも親フォームの中心に子フォームが表示されます。

MessageBox

MessageBoxは、位置を指定するプロパティはなく、ディスプレイの中心に表示されます。位置を指定したいなら、拡張メソッドを書くしかないようです。