发布
社区首页 >问答首页 >类库中的ShowDialog(IWin32Owner)

类库中的ShowDialog(IWin32Owner)
EN

Stack Overflow用户
提问于 2014-02-14 08:33:41
回答 3查看 1.1K关注 0票数 0

我有一个类库,这个类库包含一个"MessageBox“等价物,还有一些简单易懂的东西。

如果我调用ShowDialog(IWin32Owner)方法,这是可行的,该表单将显示在父窗体的中心。

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

那么,是否有任何方法来获取用户正在使用的当前活动窗体(或至少是屏幕)?

编辑

好的,这与FormStartPosition枚举有关。

如果我使用CentreScreen,按照MSDN,这应该默认为当前活动的监视器。但是,如果表单位于类库中,这似乎默认为默认监视器。

好的:

这是有问题的代码:--它未能将表单设置为中央屏幕:

代码语言:javascript
代码运行次数:0
复制
    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();
        }
    }

解决办法:

代码语言:javascript
代码运行次数:0
复制
    /// <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();
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-14 09:38:24

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

问题是:如果您有多个活动监视器,那么哪个是“当前活动监视器”?如果您有两个或更多的,这是一个混乱的问题,一个次要监视器不是或多或少的“活动”比主要的一个,它是同样能够显示窗口。

Winforms使用的启发是“显示鼠标光标的监视器”。根本的呼吁是:

代码语言:javascript
代码运行次数:0
复制
  Screen desktop = Screen.FromPoint(Control.MousePosition);

如果您想模仿MessageBox.Show()用于查找所有者的行为,那么编写代码,以便它找到当前活动的窗口。底层的winapi调用是GetActiveWindow()。ShowDialog()已经使用了哪个,所以可能会发生比眼前更多的事情,比如一个非Winforms窗口的活动窗口。本机MessageBox() winapi函数不介意,但是ShowDialog()会。使用Spy++来诊断这一点。

票数 1
EN

Stack Overflow用户

发布于 2014-02-14 08:37:35

您可以使用Form.ActiveForm

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

但是,类库在不了解UI的情况下单独显示这个消息这一事实可能不是一个好迹象。

票数 1
EN

Stack Overflow用户

发布于 2014-02-14 09:04:28

只有当您的应用程序的任何形式都有焦点时,Form.ActiveForm才能工作。因此,如果您的应用程序是背景,这将是没有帮助的。

使用Application.OpenForms代替。检索集合中的最后一个项,它表示最后一个openend表单。

注意特殊的形式属性,比如ShowInTaskBar.他们可能不会出现在这个收藏!在这里描述:https://stackoverflow.com/a/3751748/2243584

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21774361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档