天天看點

Form.ShowDialog 和Form.Modal 方法 基礎學習

1.DialogResult

擷取或設定窗體的對話框結果。

窗體的對話框結果是當窗體顯示為模式對話框時從該窗體傳回的值。

如果窗體顯示為對話框,用 DialogResult 枚舉中的值設定此屬性将”設定該窗體的對話框結果值、隐藏模式對話框并将控制傳回給調用窗體。”三種功能。

此屬性通常由窗體上 Button 控件的 DialogResult 屬性設定。當使用者單擊 Button 控件時,配置設定給 Button 的 DialogResult 屬性的值将配置設定給該窗體的 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 屬性來确定窗體是否顯示為模式窗體。如果不顯示為模式窗體,則将更改 FormBorderStyle 和 TopLevel 屬性,以使該窗體成為具有工具視窗邊框的非頂級窗體。

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 枚舉值之一配置設定給對話框,方法是将該值配置設定給窗體上 Button 的 DialogResult 屬性或通過使用代碼設定窗體的 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)

c#