代码之家  ›  专栏  ›  技术社区  ›  Simon

类库中的ShowDialog(IWin32Owner)

  •  0
  • Simon  · 技术社区  · 11 年前

    我有一个类库,它保存了一个“MessageBox”的等价物,还有几个铃铛和口哨。

    如果我打电话给 ShowDialog(IWin32Owner) 方法,这是有效的,表单将显示在父表单的中心。

    然而,有时,这个表单是从我的项目中的类调用的,因此我无权访问表单所有者。在这种情况下,我可以通过 null ShowDialog() 方法,但它似乎无法识别“当前活动窗口”并将其显示在中心。我假设是因为它在另一个类库中。

    那么,是否有任何方法可以获取用户正在处理的当前活动表单(或至少屏幕)?

    编辑

    好的,这与FormStartPosition枚举有关。

    如果我使用 CentreScreen 根据MSDN,这应该默认为当前活动的监视器。然而,如果窗体在类库中,则这似乎默认为默认监视器。

    好 啊:

    这是有问题的代码: 无法将表单设置为中心屏幕:

        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();
        }
    
    3 回复  |  直到 11 年前
        1
  •  1
  •   Hans Passant    11 年前

    这应该默认为当前活动的监视器

    问题是:如果您有多个“当前活动监视器”,那么哪个是“当前活动的监视器”?如果您有两个或多个,那么这将是一个困惑的问题,辅助监视器不会比主监视器更“活跃”,它同样能够显示窗口。

    Winforms使用的启发式方法是“显示鼠标光标的监视器”。基础调用是:

      Screen desktop = Screen.FromPoint(Control.MousePosition);
    

    如果要模拟MessageBox.Show()用于查找所有者的行为,请编写代码,以便查找当前活动的窗口。基础winapi调用是 GetActiveWindow() 。ShowDialog()已经使用了,所以可能会有更多的事情发生,就像不是Winforms窗口的活动窗口。本机MessageBox()winapi函数不介意,但ShowDialog()介意。使用Spy++诊断此问题。

        2
  •  1
  •   ybo    11 年前

    您可以使用 Form.ActiveForm :

    获取此应用程序的当前活动窗体。

    然而,类库在不了解UI的情况下自行显示此消息,这可能不是一个好兆头。

        3
  •  0
  •   Community Lee    7 年前

    Form.ActiveForm 只有在任何形式的应用程序都有焦点的情况下才有效。因此,如果您的应用程序处于后台,那将毫无帮助。

    使用 Application.OpenForms 相反检索集合中的最后一项,它表示最后一个打开的窗体。

    注意特殊形式的财产,如ShowInTaskBar。。。他们可能不会出现在这个集合中!此处描述: https://stackoverflow.com/a/3751748/2243584

    推荐文章