天天看點

說說模态化1:使用者界面的模态化和代碼的模态化

從最終使用者的體驗來看,模态性是指,使用者開始了一項操作後,他要麼完成這項任務,或者取消整個任務。

例如,打開一個檔案就是一個模态性的操作:一旦”打開”菜單被點選後,使用者隻能選擇一個檔案來打開,或者取消整個操作。

另外一個例子是,當準備打開一個檔案的時候,使用者就不能和現有已經打開的文檔做任何的互動操作,例如,使用者不能滾動現有文檔來檢視一些内容來幫助他回憶應該打開哪個檔案。

從程式員的角度來看,模态性可以看做一個函數,它會執行一項使用者界面操作直至操作完成。換句話說,模态性是一個嵌套的消息循環,它會繼續處理消息,直到達到某個退出條件為止。在上面的示例中,模式性是GetOpenFileName函數被調用後,直到使用者選擇檔案名或取消對話框後才會傳回。

請注意,這些概念不一定總是一緻的。你可以建立模态化使用者界面,也就是說,在其他操作完成之前不讓使用者與主視窗互動,同時在代碼實作上将其編碼為非模态化的函數。

我們來看看下面的例子:

說說模态化1:使用者界面的模态化和代碼的模态化

上面是一個普通的非模态對話框的例子。 當你按下空格鍵時會顯示”查找”對話框。 請注意,你可以在“查找”對話框打開時單擊傳回主視窗,這是因為”查找”對話框是非模态的。與非模态對話框一樣,排程其消息是在主消息循環中通過調用 IsDialogMessage函數來處理的。

我們可以将上面的代碼轉換為一個模态對話框:

說說模态化1:使用者界面的模态化和代碼的模态化

請注意我們啟用和禁用視窗的時機。

當你運作這個修改後的程式時,除了”查找”對話框現在是模态的之外,一切看起來都一樣。 在關閉“查找”對話框之前,你無法與主視窗進行互動。 “查找”對話框在使用者界面意義上是模态的。但是,代碼是以非模态方式構造的。沒有對話框消息循環,主視窗循環根據需要分派對話框消息。

通常不會以這種方式設計模态化界面,因為這會使代碼更難結構化。例如,和管理對話框相關的代碼會分散在各處,并且對話框的管理需要作為狀态機處理,因為每個階段都傳回到主消息循環。這就需要花些功夫了。

總結

我十分不喜歡模态化界面,我想,和我一樣的使用者也有一些。

因為它會中斷工作流,更為糟糕的是,剛剛進入心流後,你被模态界面打斷并被迫做出一些選擇。

最後