C# 窗体位置 Show和ShowDialog

简介:

 CenterParent                     窗体在其父窗体中居中。     
  CenterScreen                    窗体在当前显示窗口中居中,其尺寸在窗体大小中指定。     
  Manual                               窗体的位置由   Location   属性确定。     
  WindowsDefaultBounds     窗体定位在   Windows   默认位置,其边界也由   Windows   默认决定。     
  WindowsDefaultLocation    窗体定位在   Windows   默认位置,其尺寸在窗体大小中指定。     
    
  也就是说,CenterScreen的意思并不是屏幕居中(是相对的),它是在"当前显示窗口"中居中,当用Show()方法时应选择CenterScreen,用ShowDialog()方法时应选择CenterParent,这样才能让要显示的窗口居中。

  在SDI中用ShowDialog()方法,并且设置对应的窗体的StartPosition为CenterParent时就可以让窗体居中,当然也可以用CenterScreen也是一样的效果,只是含意不一样罢了.   
  而在MDI中只能用Show(),如果你用ShowDialog(),无论选择CenterParent或是CenterScreen都会出错,说 ShowDialog只能用在顶级窗口之类的意思。用Show(),并且设置对应的窗体的StartPosition为CenterScreen时就可以 让窗体居中。


ShowDialog()    弹出模式化的窗体

Show()              弹出非模式化的窗体

模式窗体,在关闭或隐藏前无法切换到主窗体。

非模式窗体,变换焦点使不必关闭窗体

总结:显示重要的信息,还是用模式窗体,如删除文件,可以确保用户正真想要删除的是该文件

非模式的,窗体访问的顺序没有办法得知,比较适合显示程序的一些相关信息。


Application.Run()是"Begins running a standard application message loop on the current thread, and makes the specified form visible." 用代码可以表示为:
while(GetMessage(&msg)>0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
执 导受到WM_QUIT,退出应用程序。而使用Form.Show()方法则Form显示后就立刻退出程序。如果用Form.ShowDialog()是模 化对话框所以不会立刻消失,但是如果您还有其他窗口,Form.ShowDialog()显示的是模态窗口,只有它退出,其他窗口才能显示,但是一旦退出 整个程序就退出,其他窗口将永不会得到运行机会,而用Application.Run()就不会出现这种现象。

 

窗体显示中form1.Show()和form1.ShowDialog()的区别

窗体和对话框要么是有模式的,要么是无模式的。“模式”窗体或对话框必须关闭或隐藏,然后您才能继续使用应用程序的其余部分。

显示重要消息的对话框应始终是有模式的。模式对话框的一个示例是 Visual Studio 中的“关于”对话框。MessageBox是您可以使用的一个模式窗体。有模式对话框显示出来以后,那么开始打开的窗体或对话框就不能再获得焦点了。

“无模式”窗体让您在此窗体与另一窗体之间变换焦点,而不必关闭初始窗体。用户在该窗体显示的同时可继续在任何应用程序的其他位置工作。例如:文本编辑软件里面的搜索功能,就是一个无模式的,因为搜索对话框出来以后,还可以操作编辑本文,即它不影响其他窗体获得焦点。

将窗体显示为有模式对话框用form1.ShowDialog()方法。这个方法有一个可选参数 owner,该参数可用于指定窗体的父子关系。例如:

在Form1代码段中:

Form2 f2=new Form2();

f2.ShowDialog(this);//this表示Form1当前实例

这样f2实例就和Form1实例建立了一个父子关系,可以相互通讯。

如果没有使用f2.ShowDialog(this)而直接使用的是无参的,要定义父子关系,则需要语句f2.owner=this;

将窗体显示为无模式对话框则用form1.Show()方法。

注意   如果窗体显示为有模式,则在关闭该对话框之前,不执行 ShowDialog 方法后面的代码。但是,当窗体显示为无模式时,那么该窗体显示之后,会立刻执行 Show 方法后面的代码。

窗体的Show方法,没有给调用代码任何通知,如果需要通知,使用ShowDialog是一种好的选择。 
在调用Show方法后,Show 方法后面的代码会立即执行,调用ShowDialog方法后,调用代码被暂停执行,等到调用ShowDialog方法的窗体关系后再继续执行。而且窗体可 以返回一个dialogresult值,他描述了窗体关闭的原因,例如OK,Cancel,yes,no等。为了让窗体返回一个 dialogresult,必须设置窗体的dialogresult值,或者在窗体的一个按钮上设置dialogresult属性。

例子:
下面是子窗体代码,要求输入phone,然后会返回给父窗体。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Phone : Form
{
public Phone()
{
InitializeComponent();
btnOK.DialogResult = DialogResult.OK;
btnOK.DialogResult = DialogResult.Cancel;
}
public string PhoneNumber
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
private void Phone_Load(object sender, EventArgs e)
{
}
}
}
不包含任何处理按钮单击事件的代码,因为设置了每个按钮的dialogresult属性,所以单击OK或者Cancel按钮后,窗体就消失了。下面的代码显示了父窗体中调用Phone对话框的方法。


Form.Show和Form.ShowDialog的区别
区别1:ShowDialog是模态的(独占用户输入),Show是非模态的。
区别2:根据1,ShowDialog只能打开一个自己,Show可以打开多个自己。
区别3:根据2,使用Show方法打开的Form在关闭时会立即调用Dispose释放资源。那ShowDialog会在关闭时立即释放资源吗?我做了个实验。

public partial class Form1 : Form
  {
      private Form2 f2 = new Form2();

      public Form1()
      {
          InitializeComponent();
      }

      private void button1_Click(object sender, EventArgs e)
      {
        try
        {
            f2.Show();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
      }

      private void button2_Click(object sender, EventArgs e)
      {
        try
        {
            f2.ShowDialog();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
      }

      private void button3_Click(object sender, EventArgs e)
      {
          f2 = new Form2();
      }
  }
  
      
连 续点击button1会提示“无法访问已释放的对象。对象名:Form2”。而连续点击button2则不然,一切正常。继续调查发现,使用 ShowDialog时,第一次会调用构造函数Form2(),然后依次调用 Form2_Load,Form2_Activated,Form2_Shown。第二次及以后使用ShowDialog时,只会调用 Form2_Load,Form2_Activated,Form2_Shown。由此可以判断,Form2在关闭时只是被隐藏,而非解构。

      ShowDialog的这种设计也是有道理的,在连续调用时可以节省资源,但也要警惕"上辈子"影响到"这辈子"。如果想及时释放资源,在调用 Form.ShowDialog()后面不妨加一句Form.Close(),Close方法会调用Dispose解构Form。



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/5844744.html,如需转载请自行联系原作者

相关文章
|
6月前
|
Java 数据库 C#
C#winforms实现windows窗体人脸识别
C#winforms实现windows窗体人脸识别
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
70 0
|
1月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
73 0
|
4月前
|
开发框架 数据可视化 C#
|
6月前
|
C#
C#如何实现窗体最小化到托盘
C#如何实现窗体最小化到托盘
70 0
|
6月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
140 0
|
6月前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
176 0
|
11月前
|
C# 数据安全/隐私保护
C# 窗体之间参数互相传递的两种方法与使用
C# 窗体之间参数互相传递的两种方法与使用
|
11月前
|
C# Kotlin
C#is、as关键字及获取当前活动窗体的实例
这篇日志记录一下C#中is关键字及as关键字的用法。 Is :判断检查对象是否与给定类型兼容 As :将对象转换为指定类型(强转),就跟(int )这样的用法是一样的。 获取当前窗体的活动子窗体。
56 0
|
C# 数据安全/隐私保护
ApeForms | C# WinForm窗体控件平滑减速运动
在桌面软件开发中,有时会需要控制窗体或控件移动以实现某些界面效果,比如幻灯片换页、侧面的展开栏等。 通常情况下我们会使用Timer以每隔一段时间修改一下坐标位置的方式来实现目标对象的位移效果,但通过这个方式实现的动效存在几个问题: 匀速运动效果生硬; 运动过程中不便灵活改变运动状态(如侧栏展开一半时令其收起); 动效多时需要创建多个Timer对象,不易管理且占用资源; ApeForms中为控件和窗体提供了平滑运动的扩展方法,很好的解决了这些问题。不仅是坐标的平滑运动,还有控件\窗体尺寸的平滑变化、透明度的平滑变化。允许在变化的中途随时更改目标坐标\尺寸\透明度,且使用共享的Timer
11386 1
ApeForms | C# WinForm窗体控件平滑减速运动