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。
C# 窗体位置 Show和ShowDialog (转载)的更多相关文章
- C# 窗体位置 Show和ShowDialog(转)
CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前显示窗口中居中,其尺寸在窗体大小中指定. Manual 窗体的位置由 Location 属性确定. Windows ...
- C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- Delphi中Form的position属性与代码自定义窗体位置
通过Form的Position属性可设置窗体的初始位置,如选择DesktopCenter为桌面中心,ScreenCenter为屏幕中心,等等. 这个属性在很多时候简化了程序代码. 但是,如果设置了po ...
- C# 设定弹出窗体位置
一.C#中弹出窗口位置 加入命名空间 using System.Drawing using System.Windows.Forms 假定窗口名为form1,则 //窗体位置在屏幕中间 form1.S ...
- C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- delphi SetWindowPos改变窗体位置和状态
http://blog.163.com/yuanliaofan@126/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 ...
- Winfrom 弹出窗体位置设定
Winfrom 窗体弹出位置设定,其实就是两种模式,第一种模式是通过Winform提供的属性来设定:第二种模式是自定义,可以相对于软件本身,也可以是相对于屏幕. 一.第一种模式 使用Winform提供 ...
- 窗体位置设置StartPosition属性
有如下选项,分别含义如下: CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前 ...
- Android 高级UI设计笔记02:可以拖动交换item位置的GridView(转载)
如果大家不知道GridView基本使用,可以先参见:Android(java)学习笔记154:使用GridView以及重写BaseAdapter 1. 首先我们明白GridView拖拽的思路: ()根 ...
随机推荐
- 看了就学会之React redux入门示例
环境准备 为了方便,这里使用create-react-app搭建react环境 create-react-app mydemo 弹出配置 如果需要自定义react的配置,需要运行下面的命令把配置文件弹 ...
- 几个简单的VBS脚本程序以及其JS实现
1 语音发声脚本,调用sapi.spvoice读英语hh 保存为say.vbs,点击打开就可以念诗: set objTTS = CreateObject("sapi.spvoice&quo ...
- 我的代码,写的pagebase。还是留着吧。语义化,与我的云平台一样,只不过云平台是用js写的。这个是webform.下回写mvc吧。核心很简单。
Ps:记一下用的时候,一不小心我手贱碰到的问题吧:我在页面里面加上了form runat=server,然后所有的html控件就再也找不着了.就是下面的control collection这里,如果加 ...
- YYH的积木(NOIP模拟赛Round 6)
题目描述 YYH手上有n盒积木,每个积木有个重量.现在他想从每盒积木中拿一块积木,放在一起,这一堆积木的重量为每块积木的重量和.现在他想知道重量最少的k种取法的重量分别是多少. 输入输出格式 输入格式 ...
- 1.2.3 创建Cocos2D-iPhone的帮助文档
http://book.51cto.com/art/201303/383957.htm <Cocos2D权威指南>第1章开始前的准备工作,本章我们将介绍什么是Cocos2D以及有关Coco ...
- android与java的关系
摘自:http://bbs.51cto.com/thread-944897-1.html 相信学习android的人都会想过或者想知道这个问题,那就请你耐心的看完这篇文章吧,你会对android与 ...
- python 独立环境安装
python 即使是单独编译安装的,库文件的安装还是会与其它python的库存放到相同的地方 使用同版本库不会有问题,但是需要升级库的时候,就会出现冲突,导致依赖这个旧库的python出现问题 这时候 ...
- python 错误 error: invalid command 'egg_info'
Processing /bs4-0.0.1/setuptools-38.4.0/numpy-1.14.0 Complete output from command python setup.py ...
- python实现并发获取html的几种方式
1.线程池 from concurrent.futures import ThreadPoolExecutor import requests from fake_useragent import U ...
- hdu 5067(暴力搜索)
Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...