私は、「MessageBox」に相当する機能をいくつか備えたクラス ライブラリを持っています。
メソッドを呼び出すとShowDialog(IWin32Owner)
、これが機能し、フォームが親フォームの中央に表示されます。
ただし、このフォームがプロジェクトのクラスから呼び出されることがあるため、フォームの所有者にアクセスできません。この状況ではnull
、ShowDialog()
メソッドに渡すことができますが、これは「現在アクティブなウィンドウ」を認識せず、中央に表示していないようです。それは別のクラスライブラリにあるためだと思います。
ユーザーが作業している現在アクティブなフォーム (または少なくとも画面) を取得する方法はありますか?
編集
わかりました、これは FormStartPosition 列挙と関係があります。
これを使用する場合CentreScreen
、MSDN に従って現在アクティブなモニターにデフォルト設定する必要があります。ただし、フォームがクラス ライブラリにある場合、これは既定のモニターに設定されているようです。
Ok:
これは問題のコードです:フォームを中央の画面に設定できません:
public static DialogResult ShowYesNoCancel(string message)
{
using (frmMessage form = new frmMessage())
{
form.Text = @"Input Required";
form.lblMessage.Text = message;
form.btnNo.Visible = true;
form.btnOK.Text = @"Yes";
form.btnOK.DialogResult = DialogResult.Yes;
form.StartPosition = FormStartPosition.CenterScreen;
return form.ShowDialog();
}
}
解決策:
/// <summary>
/// Overridden to ensure its in the centre of the current screen
/// </summary>
/// <returns></returns>
public new DialogResult ShowDialog()
{
Screen current = Screen.FromPoint(MousePosition);
Rectangle s = current.WorkingArea;
StartPosition = FormStartPosition.Manual;
Location = new Point(s.Left + s.Width / 2 - Width / 2, s.Top + s.Height / 2 - Height / 2);
return base.ShowDialog();
}