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。

C# 窗体位置 Show和ShowDialog (转载)相关推荐

  1. winform 弹出窗体位置设定

    [转]https://www.cnblogs.com/liushenglin/p/5350641.html 一.C#中弹出窗口位置 加入命名空间using System.Drawing和using S ...

  2. Winfrom 弹出窗体位置设定

    Winfrom 窗体弹出位置设定,其实就是两种模式,第一种模式是通过Winform提供的属性来设定:第二种模式是自定义,可以相对于软件本身,也可以是相对于屏幕. 一.第一种模式 使用Winform提供 ...

  3. C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private ...

  4. 窗体位置设置(StartPosition属性)

    StartPosition属性有如下选项,分别含义如下: CenterParent 窗体在其父窗体中居中.     CenterScreen 窗体在当前显示窗口中居中,其尺寸在窗体大小中指定.     ...

  5. C# 按Button弹出新的窗体 Show()方法 和 ShowDialog()方法

    在做串口通信程序时,有个想法,当点击串口设置按钮时,弹出一个新的窗口,可以设置串口相关信息,如何实现这一操作呢? 1 新建一个项目,窗体为form1 2 选择项目名称,单击右键,选择[添加]→[窗体] ...

  6. delphi SetWindowPos改变窗体位置和状态

    //声明: SetWindowPos( hWnd: HWND;            {窗口句柄} hWndInsertAfter: HWND; {窗口的 Z 顺序} X, Y: Integer;   ...

  7. linux ibus获取窗体位置,Ubuntu 12.04 显示ibus 的输入框

    在虚拟机中安装了Ubuntu 12.04,系统是英文版本的,我能接受,但是苦于没有中文输入法. 起先,我是安装SCIM,结果我折腾了半天,发现其只能在lib-office下使用.firefox,文字编 ...

  8. MFC SDI 中 通过注册表保存当前窗体的 显示状态位置

    在 框架类响应 WM_CLOSE消息的时候添加如下代码 HKEY  key;        //用于接收注册表项句柄  WINDOWPLACEMENT  info;  //获得窗体位置状态信息  Ge ...

  9. C#中在主窗体中用ShowDialog方法显示子窗体的使用技巧

    显示和关闭子窗体: 方法1:源代码: EatGood.FoodManageUI.MessageForm.ConfirmDelFeelkindOrFeelsForm feelkindform = new ...

最新文章

  1. 模板 - Min_25 筛法求素数和
  2. WKWebView高度自适应三种方式
  3. 05-01-部署 WSUS on Windows 2019 Core
  4. Universal Windows Platform(UWP)应用的窗口特性
  5. 【dfs】P1036 选数
  6. 使用sklearn自带公式计算余弦相似度
  7. centos安装 TA-Lib
  8. 走进webpack(1)--环境拆分及模块化
  9. JAVA入门级教学之(第一章总结)
  10. MySQL表的操作(二)
  11. 小米手机首发开箱图赏
  12. 【PA2014】【BZOJ3709】Bohater(贪心,排序)
  13. Base64序列化和反序列化
  14. [转] PHP:自己动手制作伪原创程序
  15. 关于sqlite多线程
  16. mysql导出csv 分隔符_导出到CSV文件,CSV文件好像是以逗号为分隔符的吧?如果数据库字段里含有逗号怎么处理?比如说下面这个字...
  17. 最新可用双端美化版在线音乐播放器网站源码
  18. 【九天教您南方cass 9.1】01 安装Cad和Cass9.1
  19. QtreeView 树形结构
  20. 大数据的应用领域有哪些

热门文章

  1. 那些jdk中坑你没商量的方法
  2. 非常有必要了解的Springboot启动扩展点
  3. 非常强悍的 RabbitMQ 总结,写得真好!
  4. 浅谈数据分析的魅力和能力要求!
  5. 小白如何用免费GPU跑天池算法大赛!
  6. 这是一份非常全面的开源数据集!
  7. 结营答辩!28天!Datawhale助力公益AI一起学,点亮最暖寒假!
  8. 华人团队用Transformer做风格迁移,速度快、可试玩,网友却不买账
  9. 我们常称自己“码农”,这次已得到官方认定:“新生代农民工!
  10. 蚂蚁金服大佬自述:保持学习力,永远胜过不切实际的一夜暴富幻想!