C 模式與非模式對話方塊

2022-08-28 15:00:21 字數 1622 閱讀 4767

一、如何呼叫

任何窗體(派生於基類form的類),都可以以兩種方式進行顯示。

//非模式窗體

from qform=new form();      

qform.show();

//模式窗體

form qform=new form();

qform.showdialog();

一、控制權上的區別

form.show建立新窗體後(非模式),立即返回,且沒有在當前活動窗體和新窗體間建立任何關係,即在保持新視窗的情況下關閉(或最小化)現有窗體或在保留現有窗體情況下關閉(或最小化)新視窗,都是可以的。

form.showdialog建立模式窗體,即只有當建立的新視窗關閉之後,原有窗體才能重新獲得控制權。即如果不關閉新視窗,將無法對原活動視窗進行任何操作。對新視窗進行的最小化、還原將會和原視窗一起進行,但是新視窗的關閉對原視窗沒有影響。

二、owner屬性帶來了什麼

上面所講的是不建立擁有關係時的窗體。當為窗體間建立了擁有關係,情況就會有所變化。

1、首先看非模式的情況。為非模式新視窗建立擁有關係的方法是修改其owner屬性。(預設情況下,非模式視窗不存在擁有者)

form.owner=this;     //假設當前視窗是新視窗的擁有者

form.show();

很顯然,新建的非模式窗體已經被認為是原活動窗體的子窗體,原視窗的行為將會影響新視窗,所以我們姑且把它們稱作父視窗和子視窗之間的關係。

那麼,改動後會有什麼顯著的變化呢?主要有兩點:

第一,父視窗最小化、還原或關閉,子視窗也將隨之最小化、還原或關閉。(注意,在未新增擁有關係之前它們是互不相干的。)反過來,子視窗的最小化、還原或關閉對父視窗不構成影響。

第二、在工作列上,只顯示父窗體的圖示而不顯示子窗體的圖示。(在父子關係誕生之前,各窗體在工作列上有各自圖示。)

2、模式窗體的情況下。用showdialog方法顯示新窗體時,當前窗體被認為是新窗體的邏輯擁有者。所謂邏輯擁有者,是指預設情況下,用showdialog而明確指定擁有者的話,owner值為null。但無論owner屬性設定與否,與使用者的互動行為都是一樣的。

設定owner屬性的方法除了同上述show情況下的那種之外,還有一種,即當作showdialog的引數傳遞。如:

form.showdialog(this);    //當前窗體為新窗體的擁有者。

也就是說,如果你指定了第三個窗體為新模式視窗的owner,的確,新視窗和原視窗可能斷絕了關係,而是作為第三個視窗的子視窗的身份出現。但是事實上,它們間的這種父子關係的建立並沒有在行為上給我們帶來跟多驚喜。比如,新視窗關閉前,父視窗還是不能獲得控制權等等,一切行為都沒有變。

三、總結與說明

1、show方法建立的窗體在行為上具有不確定性,owner屬性對此責任重大。

2、當前活動視窗和用showdialog建立的模式視窗之間有著與生俱來的關係,這一關係的承載者是可以改變的,但是這一關係的建立或解除並不能給窗體的行為帶來任何變化。

3、乙個窗體可以擁有乙個可選的擁有者,同時可以成為多個窗體的擁有者。

4、這裡所指的子窗體和父窗體並不是真正意義上的,而是為了加深理解而杜撰出來的不科學的稱法。應與window窗體術語中的父窗體和子窗體區分開,不可混淆。後者存在邊緣裁剪

本文收集於谷哥部落格中的一篇文章,感覺很好,留下來,與君共享

MFC 對話方塊程式 模式對話方塊與非模式對話方塊

一 根據主視窗型別,mfc軟體工程可以分為以下幾種架構模型 例如 記事本和畫筆等。2 mdi multiple document inte ce 多文件介面,乙個主框架視窗下可以同時編輯多份文件。例如 vc 6.0,photoshop等軟體。3 基於對話方塊的軟體模型 主視窗是通過資源管理器,在對話...

QT對話方塊模式與非模式

非模態對話方塊 modeless dialog 的概念不是模態對話方塊就是在其沒有被關閉之前,使用者不能與同乙個應用程式的其他視窗進行互動,直到該對話方塊關閉。對於在模態來顯示對話方塊 另一種是使用show 方法,它使得對話方塊既可以非模態顯示,決定它是非模態的是對話方塊的modal屬性。在qt的非...

MFC 建立模式對話方塊與非模式對話方塊

模式對話方塊 my about cb cb.domodal 非模式對話方塊 my about cb new my about cb create idd myabout,this cb showwindow sw show vc2008 mfc 預設新增到對話方塊會有 確定跟取消,但這倆框在資源檢視...