2011-06-29 103 views

回答

7

不幸的是,標準的Win32 MessageBox function不支持帶自定義標籤的按鈕。而且由於VB.NET MsgBox函數是該本地函數的一個薄包裝器,所以它也不支持它們。預定義的值就是你所能得到的,這意味着你可以做的最好的事情就像是「確定」和「取消」,文本解釋說「確定」意味着「繼續進行確認」。

值得注意的是,對於年的,這是Windows風格指南推薦的做法。實際上,它看起來像it still is。特別要注意的例外以下一般規則:

使用積極的承諾是到主指令具體答覆按鈕,而不是普通的標籤,如OK或是/否。用戶應該可以通過單獨閱讀按鈕文本來理解選項。
例外:

  • 使用關閉的沒有設置,如信息對話框的對話框。從不使用關閉有設置的對話框。
  • 當「特定」響應仍爲通用時(如保存,選擇或選擇),請使用「確定」。
  • 更改特定設置或設置集合時使用確定。
  • 對於沒有主指令的傳統對話框,可以使用通用標籤,如OK。通常,這些對話框並非設計用於執行特定任務,從而阻止了更具體的響應。
  • 某些任務需要更多思考和仔細閱讀,以便用戶做出明智的決定。確認通常是這種情況。 在這種情況下,您可以故意使用通用提交按鈕標籤來強制用戶閱讀主要說明並防止倉促做出決定。


Windows Vista中引入了旨在取代老化,不可能以進行配置MessageBox —它被稱爲TaskDialog一個新的API。如果您運行的是Windows Vista或7,那麼您無疑會在整個Windows Shell中看到此對話框。它實際上允許您爲每個按鈕指定自定義名稱,並提供一系列其他自定義選項。但是這種控制並不是免費的。有兩個問題與TaskDialog功能:

  1. .NET框架不包括它的包裝開箱。您需要編寫自己的簡單包裝器,或者下載包含這種包裝器的Windows API Code Pack。但是這增加了對代碼—的額外依賴性,您必須決定是否值得。

  2. 由於API僅在Vista中引入,這意味着程序只能在Vista或更高版本上運行時使用它。如果您仍然需要定位Windows XP(或2000),那麼您運氣不好。顯示TaskDialog的代碼將失敗,您需要包含後備例程以顯示標準MessageBox。當然,在那些舊版操作系統上,您無法定製按鈕標籤,從而使您立即回到起點位置。同樣,只有您可以決定這是否是您的應用程序和/或部署方案的重要關注點。

另一種選擇,由幾代VB程序員使用,是讓你自己的小型MessageBox風格的表單。要爲圖標/圖像,某些標題文本以及所需的所有按鈕設置一個簡單的表單並不難。由於您已經創建了整個表單,所以您可以根據自己的意願自由地從代碼中進行自定義。

如果你絕對在Vista之前的Windows版本中需要此功能,那麼創建您自己的消息框表單就是您唯一的選擇。否則,我高度建議您利用新的TaskDialog API。在您的應用程序中這樣做可以促進用戶可能在其計算機上安裝的其他應用程序的一致性,甚至可以與Windows本身一起安裝。很難確保您自己的自定義消息框表單正確地獲得小小的觸摸,例如根據其長度和用戶的屏幕大小自動包裝標籤文本。根據您的對話框是否包含「取消」按鈕,在標題欄中顯示/隱藏「X」關閉按鈕。還有一個令人難以置信的數量的標準Windows MessageBox/TaskDialog爲您免費提供,而無需舉手。這只是重申一般原則:當你不必絕對必須這樣做時,不要重新發明輪子。

一個很好的折衷辦法可能是使用像this TaskDialog wrapper/emulator這樣的東西。在Vista和更高版本中,原生TaskDialog API可用,它會自動調用該函數。否則,它會使用標準格式並嘗試模擬原生的API的行爲。我已經寫了一個類似的自定義類供我自己使用,但我從未在網上發佈它。