代码改变世界

Form.ShowDialog 和Form.Modal 方法 基础学习

2011-11-09 17:03  沐海  阅读(4492)  评论(1编辑  收藏  举报

1.DialogResult

获取或设置窗体的对话框结果。

 

窗体的对话框结果是当窗体显示为模式对话框时从该窗体返回的值。

 

如果窗体显示为对话框,用 DialogResult 枚举中的值设置此属性将”设置该窗体的对话框结果值、隐藏模式对话框并将控制返回给调用窗体。”三种功能。

 

此属性通常由窗体上 Button 控件的 DialogResult 属性设置。当用户单击 Button 控件时,分配给 ButtonDialogResult 属性的值将分配给该窗体的 DialogResult 属性。

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。当用户单击对话框的“关闭”按钮或设置 DialogResult 属性的值时,不会自动调用 Close 方法(也就是说还会再次显示出来。除非手写调用Close方法。)。而是隐藏该窗体并可重新显示该窗体,而不用创建该对话框的新实例。

 

 

因为此行为,所以当应用程序不再需要该窗体时,必须调用该窗体的 Dispose 方法。

可以使用此属性确定对话框是如何关闭的,以便正确处理在该对话框中执行的操作。

注意:

通过在窗体的 Closing 事件的事件处理程序中设置 DialogResult 属性,可以重写用户单击“关闭”按钮时分配给 DialogResult 属性的值。

注意:

如果 Form 显示为无模式窗口,则 DialogResult 属性返回的值可能不返回分配给该窗体的值,因为关闭该窗体时将自动释放该窗体的资源。

 

 

 

  static class Program

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static voidMain()

        {

            DevExpress.XtraEditors.Controls.Localizer.Active = new DevExpress.LocalizationCHS.XtraEditorsLocalizer();

            DevExpress.XtraGrid.Localization.GridLocalizer.Active = new DevExpress.LocalizationCHS.XtraGridLocalizer();

            //DevExpress.XtraLayout.Localization.LayoutLocalizer.Active = new DevExpress.LocalizationCHS.XtraLayoutLocalizer();

 

 

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            Form frm = new DLPro.Login();

           

            if (frm.ShowDialog() == DialogResult.OK)

            {

                  Application.Run(new ContainerForm());//这里之所以不再重新显示出LOGIN。是因为在Login中代码写了close方法。

若不写Close方法,LOGIN窗体依然会再次弹出。因为它是模式窗口不是无模式窗口(无模式窗口自动调用DISPOSE()方法。)

            }

        }

 

模态对话框就是对话框不结束,即Domodal就不返回
Domodal   下一句的程序就无法运行,需要输入参数时要用这种方法
而无模式没有这个限制
一般用于工具条等

 

 

模式对话框不返回的话是无法切换到调用窗口的,无模式的可以。
无模式的对话框是新建一个窗口(用CreateWindow函数),而模式对话框则是调用窗口的一个子窗口。

 

 

Modal是什么?就是模式,可以认为对话框有两种“模式”,一种是中止主程序执行,直到对话框返回,这就是“有模式”,另一种不中止主程序执行,就像Word的Find对话框,这就是“无模式”,《VC++6.0技术内幕》专门有两章讲这个

 

打开一个模式对话框后,其他所有对话框都不能用鼠标和键盘操作!非模对话框打开后,它下面的对话框还能操作。仅此而已!应用的时候,如果希望多个对话框能同时操作,就用非模态的,大多情况下是模态的,好控制!

无模式总结:创建时用Create,清除时用DestroyWindow,创建对象时用new,清除对象时用CDialog::PostNcDestroy并执行delete   this语句。非模态对话框的生存周期较长,其对象的生存周期需要存在于父窗口类对象的整个生存周期。因此需要在父窗口类添加指向非模态对话框类对象的指针成员变量。
模式总结:创建时用DoModal,清除时用EndDialog,对象的创建正常,并且利用析构函数清除对象。

 

Form..::.Modal 属性

当有模式地显示窗体时,不能进行任何输入(通过键盘或鼠标单击),对模式窗体上的对象的输入除外。该程序必须隐藏或关闭模式窗体(通常是响应某个用户操作),然后才能对另一窗体进行输入。有模式显示的窗体通常用作应用程序中的对话框。

可以使用此属性确定从某方法或属性获取的窗体是否已经有模式地显示。

若要有模式地显示某窗体,请使用 ShowDialog 方法。

 

 

下面的代码示例使用 Modal 属性来确定窗体是否显示为模式窗体。如果不显示为模式窗体,则将更改 FormBorderStyleTopLevel 属性,以使该窗体成为具有工具窗口边框的非顶级窗体。

 

private void ShowMyNonModalForm()

           {

                 Form myForm = new Form();

                 myForm.Text = "My Form";

                 myForm.SetBounds(10,10,200,200);

 

                 myForm.Show();

                 // Determine if the form is modal.

                 if(myForm.Modal == false)

                 {

                      // Change borderstyle and make it not a top level window.

                       myForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;

                      myForm.TopLevel = false;

                 }

           }

 

Form..::.ShowDialog 方法  返回值就是DialogResult类型的值.

 

将窗体显示为模式对话框。

 

 

名称

说明

 

ShowDialog()()()

将窗体显示为模式对话框,并将当前活动窗口设置为它的所有者。

 

ShowDialog(IWin32Window)

将窗体显示为具有指定所有者的模式对话框。

Form..::.ShowDialog 方法

可以使用此方法在应用程序中显示模式对话框。调用此方法时,直到关闭对话框后,才执行此方法后面的代码。可以将 DialogResult 枚举值之一分配给对话框,方法是将该值分配给窗体上 ButtonDialogResult 属性或通过使用代码设置窗体的 DialogResult 属性。此方法随后返回该值。可以使用此返回值确定如何处理对话框中发生的操作。例如,如果关闭了对话框,并通过此方法返回了 DialogResult.Cancel 值,则可防止执行在调用 ShowDialog 之后的代码。

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。与无模式窗体不同,当用户单击对话框的关闭窗体按钮或设置 DialogResult 属性的值时,.NET Framework 不调用 Close 方法。窗体转而可以隐藏并可重新显示,而不用创建该对话框的新实例。因为未关闭显示为对话框的窗体,所以在您的应用程序不再需要该窗体时,必须调用该窗体的 Dispose 方法。

ShowDialog 方法的此版本不将窗体或控件指定为其所有者。当调用此版本时,使当前活动窗口成为该对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本。

 

 

下面的代码示例将一个窗体显示为模式对话框并计算该对话框的返回值,然后确定是否读取该对话框窗体上 TextBox 控件的值。此示例要求已创建了一个名为 testDialog 的 Form,并且它包含一个名为 TextBox1 的 TextBox 控件。另外,该示例还要求另一个 Form 包含此示例中的代码并从中调用该代码,以便将 testDialog 显示为模式对话框。该示例使用指定对话框所有者的 ShowDialog 版本。

C# 

复制代码

public void ShowMyDialogBox()

{

   Form2 testDialog = new Form2();

 

   // Show testDialog as a modal dialog and determine if DialogResult = OK.

   if (testDialog.ShowDialog(this) == DialogResult.OK)

   {

      // Read the contents of testDialog's TextBox.

      this.txtResult.Text = testDialog.TextBox1.Text;

   }

   else

   {

      this.txtResult.Text = "Cancelled";

   }

   testDialog.Dispose();

}

 

Form..::.ShowDialog 方法 (IWin32Window)

将窗体显示为具有指定所有者的模式对话框。

C#

public DialogResult ShowDialog(

      IWin32Window owner

)

 

参数

owner

类型:System.Windows.Forms..::.IWin32Window

任何实现 IWin32Window(表示将拥有模式对话框的顶级窗口)的对象。

返回值

类型:System.Windows.Forms..::.DialogResult

DialogResult 值之一。

 

 

 

每个FORM都有自己的一个DialogResult属性。使用this就可以调出。并设置其属性值。然后我们利用模式对话框的返回值。SHOWDIALOG。来对比是否是正确的执行了我们的需要。这样你要关闭这个这个模式对话框时就要注意问题:就是如果你在此模式对话框中的函数中已经设置了其 this.DialogResult= DialogResult .NO;则此窗口就会自动关闭了。

 

DialogResult.None值。代表根本没有进行设置。只是一个状态,并没有任何实际应用意义。

,单独设置DialogResult.None将代表没有任何操作,此窗口继续执行。

 

因为只要是模式的对话框肯定要返回给父级,那么即使是直接调用this.close.其返回的值也是DialogResult.Cancel

 

但是要区分DialogResult.Cancel和this.close.返回的值DialogResult.Cancel。

因为DialogResult.Cancel会使窗口继续运行。而this.close则可以进行销毁.

 

 

 

 

Application..::.EnableVisualStyles 方法

启用应用程序的可视样式。

 

Application..::.SetCompatibleTextRenderingDefault 方法

:在应用程序范围内设置控件显示文本的默认方式(可以设为使用新的GDI+   ,   还是旧的GDI)

记录生活、工作、学习点滴!
E-Mail:mahaisong@hotmail.com 欢迎大家讨论。
沐海博客园,我有一颗,卓越的心!