using System; using System.Windows.Forms; using WinAPI; namespace ryCommon { /// /// 新模态窗体 /// public class ModalForm { /// /// 设置窗体返回的结果值,并关闭窗体。 /// /// 当前窗体 /// 模态变量 /// 防止 public static void SetDialogResult(Form frm, ModalForm mr,DialogResult dr) { if(mr==null) { if(frm.Modal) { frm.DialogResult = dr; } else { frm.Close(); } } else { mr.Form_Result = dr; } } /// /// 窗体返回的结果事件 /// /// /// public delegate void DialogResultHandler(object sender, DialogResult e); /// /// 当打开的窗体返回结果时激发 /// public event DialogResultHandler OnDialogResult; DialogResult dg = DialogResult.None; /// /// 窗体返回的状态 /// public DialogResult Form_Result { set { dg = value; sub_Form.Close(); } get { return dg; } } private Form parent; private Form sub_Form; /// /// 实例化类 /// /// 父窗体,如果为null,则取桌面为父窗体 /// public ModalForm(Form parent,Form sub_Form) { this.parent = parent; this.sub_Form = sub_Form; } /// /// 获取最顶级的父窗口 /// /// private Form GetTopParentForm() { var _parent = parent; while(_parent!=null) { if (_parent.Parent != null) { _parent = _parent.Parent.FindForm(); } else { break; } } return _parent; } /// /// 显示新模态窗体,会暂时禁用父窗体,关闭当前窗体后,父窗体会恢复。 /// public void ShowModal() { Form parent_form = parent; if (parent_form != null) { parent_form.Enabled = false; } sub_Form.FormClosing += new FormClosingEventHandler((object t, FormClosingEventArgs e1) => { if (parent_form != null){ parent_form.Enabled = true; } OnDialogResult?.Invoke(sub_Form, dg); }); if (parent_form != null) { var screen = Screen.FromControl(parent_form); sub_Form.StartPosition = FormStartPosition.Manual; //User32.GetWindowRect(parent_form.Handle, out var rect); var x = parent_form.Left + (parent_form.Width - sub_Form.Width) / 2; var y = parent_form.Top + (parent_form.Height - sub_Form.Height) / 2; if ((x + sub_Form.Width) > screen.WorkingArea.X + screen.WorkingArea.Width) { x = screen.WorkingArea.X + screen.WorkingArea.Width - sub_Form.Width; } if ((y + sub_Form.Height) > screen.WorkingArea.Y + screen.WorkingArea.Height) { y = screen.WorkingArea.Y + screen.WorkingArea.Height - sub_Form.Height; } sub_Form.Location = new System.Drawing.Point(x, y); if (parent_form.TopMost) { sub_Form.TopMost = true; } sub_Form.Show(parent_form); } else { sub_Form.StartPosition = FormStartPosition.CenterScreen; sub_Form.Show(); } } /// /// 只运行一个实例,打开后,所有窗体都依然有效。 /// /// public bool ShowOnce() { try { foreach (Form frm in Application.OpenForms) { if (frm.GetType() == sub_Form.GetType()) { frm.WindowState = FormWindowState.Normal; frm.BringToFront(); return true; } } sub_Form.StartPosition = FormStartPosition.CenterScreen; if (parent != null) { if (parent.TopMost) { sub_Form.TopMost = true; } sub_Form.Show(parent); } else { sub_Form.Show(); } } catch { } return false; } /// /// 显示窗体 /// /// 显示的位置 public void Show(FormLocation location) { int x = 0; int y = 0; switch(location) { case FormLocation.BottomLeft: x =0; y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height - sub_Form.Height; break; case FormLocation.BottomMiddle: x = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width)/2; y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height - sub_Form.Height; break; case FormLocation.BottomRight: x = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width; y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height - sub_Form.Height; break; case FormLocation.DesktopMiddle: x = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width)/2; y = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height - sub_Form.Height)/2; break; case FormLocation.ParentMiddle: if (parent != null) { User32.GetWindowRect(parent.Handle, out var rect); x = rect.Left + (rect.Right- rect.Left - sub_Form.Width) / 2; y = rect.Top + (rect.Bottom- rect.Top - sub_Form.Height) / 2; } else { x = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width) / 2; y = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height - sub_Form.Height) / 2; } break; case FormLocation.TopLeft: x =0; y =0; break; case FormLocation.TopMiddle: x = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width) / 2; ; y = 0; break; case FormLocation.TopRight: x = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width - sub_Form.Width); ; y = 0; break; } sub_Form.Load += new EventHandler((object t, EventArgs e) => { sub_Form.SetDesktopLocation(x, y); try { sub_Form.BringToFront(); } catch { } }); if (parent != null) { if (parent.TopMost) { sub_Form.TopMost = true; } } sub_Form.Show(); } /// /// 显示在父窗体中间 /// public void Show() { Show(FormLocation.ParentMiddle); } } /// /// 窗体显示位置 /// public enum FormLocation { /// /// 右上角 /// TopLeft, /// /// 顶部中间 /// TopMiddle, /// /// 顶部右边 /// TopRight, /// /// 中间 /// DesktopMiddle, /// /// 左下角 /// BottomLeft, /// /// 底部中间 /// BottomMiddle, /// /// 右下角 /// BottomRight, /// /// 父窗体居中 /// ParentMiddle, } }