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

类库中的ShowDialog(IWin32Owner)
EN

Stack Overflow用户
提问于 2014-02-14 00: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 01: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 00:37:35

您可以使用Form.ActiveForm

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

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

票数 1
EN

Stack Overflow用户

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

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

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

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

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

https://stackoverflow.com/questions/21774361

复制
相关文章
Flutter更新showDialog以及showModalBottomSheet中的状态中的内容
很多人在使用 showDialog 或者 showModalBottomSheet 的时候,都会遇到这个问题:通过 setState 方法无法更新当前的dialog。
拉维
2019/10/14
9.1K1
winform 多线程中ShowDialog()步骤无效的解决办法
private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(remind); thread.IsBackground = true; thread.Start(); } private void remind() { while (true) { string h = "0"; string m = "23";
跟着阿笨一起玩NET
2018/09/19
1.3K0
库中是如何实现string类的?
需要注意的是,如果采用无参构造,刚开始容量是0. 这就导致是初次扩容,容量开始是0,所以这里要判断扩容前,容量是否是0,再考虑1.5倍或者二倍扩容.
初阶牛
2023/10/14
1770
库中是如何实现string类的?
C#学习笔记——show()与showDialog()的区别
A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码 3.当窗体显示为模式窗体时,单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel 与无模式
vv彭
2021/04/15
2K0
Python标准库collections中与字典有关的类
Python标准库中提供了很多扩展功能,大幅度提高了开发效率。这里主要介绍OrderedDict类、defaultdict类和Counter类。 (1)OrderedDict类 Python内置字典dict是无序的,如果需要一个可以记住元素插入顺序的字典,可以使用collections.OrderedDict。例如: >>> import collections >>> x = collections.OrderedDict() #有序字典 >>> x['a'] = 3 >>> x['b'] = 5 >>
Python小屋屋主
2018/04/16
1.4K0
muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
该文介绍了如何使用 muduo 库实现 C++ 多线程服务端,并总结了在多线程环境下使用 CountDownLatch 进行线程同步需要注意事项。
s1mba
2017/12/28
1.1K0
muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
muduo网络库学习之BlockinngQueue<T>类、ThreadPool 类、Singleton类封装中的知识点
s1mba
2017/12/28
1K0
muduo网络库学习之BlockinngQueue<T>类、ThreadPool 类、Singleton类封装中的知识点
muduo网络库学习之Logger类、LogStream类、LogFile类封装中的知识点
s1mba
2018/01/03
1.4K0
muduo网络库学习之Logger类、LogStream类、LogFile类封装中的知识点
C#学习笔记——(Winform)的Show()和ShowDialog()方法
show()是非模式窗体. showDialog()是模式窗体. 区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制. 比如一下代码段: this.Hide(); Form2 obj = new Form2(); obj.Show(); Form3 obj3 = new Form3(); obj3.Show();
vv彭
2021/04/13
3.2K0
muduo 5 网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
class MutexLockGuard : boost::noncopyable
bear_fish
2018/09/20
9320
muduo 5 网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
muduo网络库学习之Timestamp类、AtomicIntegerT 类封装中的知识点
s1mba
2017/12/28
7700
muduo网络库学习之Timestamp类、AtomicIntegerT 类封装中的知识点
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文首发于Dotnet9,介绍使用Lib.Harmony库拦截第三方.NET库方法,达到不修改其源码并能实现修改方法逻辑、预期行为的效果,并且不限于只拦截public访问修饰的类及方法,行文目录:
沙漠尽头的狼
2023/09/23
3020
拦截|篡改|伪造.NET类库中不限于public的类和方法
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文首发于Dotnet9[1],介绍使用Lib.Harmony库拦截第三方.NET库方法,达到不修改其源码并能实现修改方法逻辑、预期行为的效果,并且不限于只拦截public访问修饰的类及方法,行文目录:
沙漠尽头的狼
2023/09/25
2290
拦截|篡改|伪造.NET类库中不限于public的类和方法
C# DialogResult.OK == Form.ShowDialog()
DialogResult 是Form类的一个属性, ShowDialog()是Form类的一个方法也就是函数。
全栈程序员站长
2022/06/25
7210
Java中时间类中的Data类与Time类
上面我们了解了Date类,我们知道,他是一个比较老的类,且不是线程安全的,所以,我们目前基本上是使用他的升级版LocalDate。
JanYork_简昀
2022/04/11
1.8K0
Java中时间类中的Data类与Time类
xUtils类库的使用
序言: 作为一个职业的程序猿,不会像新手一样把每一个需要实现的功能每次重写一遍,因为程序猿能熟练的使用各种第三方类库。 毕竟人类因为会使用工具才站到了食物链顶端。 现在就让我们学习使用xUtils类库 中的四个工具类 开源代码来自于:https://github.com/wyouflf/xUtils ---------------------------------------------------------------------------------------------------------
听着music睡
2018/05/18
1.1K0
如何加载第三方类库/项目类库/基类库?
如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,官方文档原话
PM吃瓜
2019/08/13
1.2K0
.NET Core类库中读取配置文件
最近在开发基于.NET Core的NuGet包,遇到一个问题: .NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.config或Web.config(.NET Core中是appsetings.json)文件中的数据。
雪飞鸿
2018/09/05
1.3K0
.NET Core类库中读取配置文件
C++中的stack类、QT中的QStack类
C++中的stack 实现一种先进后出的数据结构,是一个模板类. 头文件 #include<stack> 用法(以int型为例): stack <int> s;           //定义一个int型栈 s.empty(); //返回栈是否为空 s.size(); //返回当前栈中元素的个数 s.push(); //在栈顶上堆进一个元素 s.pop();
诺谦
2018/04/27
2.1K0
点击加载更多

相似问题

如何从动态加载的类中调用.showDialog()

12

InitializeComponent / ShowDialog与数据库

24

WPF中的ShowDialog

22

mdi中的ShowDialog

14

.Net中的ShowDialog

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文