К сожалению, стандартная функция Win32 MessageBox
не поддерживает кнопки с пользовательскими метками. А поскольку функция VB.NET MsgBox
является тонкой оболочкой для этой собственной функции, она также не поддерживает их. Предопределенные значения - это все, что вы получаете. Это означает, что лучшее, что вы можете сделать, это что-то вроде «ОК» и «Отмена», с текстом, поясняющим, что «ОК» означает «продолжить проверку».
Стоит отметить, что в течение лет это была рекомендуемая практика, одобренная руководствами по стилю Windows. На самом деле, похоже, что это все еще . В частности, обратите внимание на исключения из следующего общего правила:
Используйте кнопки положительной фиксации, которые являются конкретными ответами на основную инструкцию, вместо общих меток, таких как OK или Да / Нет. Пользователи должны иметь возможность понять параметры, читая только текст кнопки.
Исключения:
- Используйте Close для диалогов, у которых нет настроек, таких как информационные диалоги. Никогда не используйте Close для диалогов, в которых есть настройки.
- Используйте OK, когда «конкретные» ответы все еще являются общими , такими как Сохранить, Выбрать или Выбрать.
- Используйте OK при изменении определенной настройки или набора настроек.
- Для устаревших диалоговых окон без основной инструкции вы можете использовать общие метки, такие как ОК. Часто такие диалоговые окна не предназначены для выполнения конкретной задачи, предотвращая более конкретные ответы.
- Некоторые задачи требуют более тщательного и внимательного прочтения, чтобы пользователи могли принимать обоснованные решения. Обычно это происходит с подтверждениями. В таких случаях вы можете целенаправленно использовать общие метки кнопок фиксации, чтобы заставить пользователей прочитать основные инструкции и предотвратить поспешные решения.
В Windows Vista появился новый API, предназначенный для замены устаревшего и не поддающегося настройке MessageBox
- он называется TaskDialog
. Если вы работаете в Windows Vista или 7, вы, несомненно, видели, что это диалоговое окно используется во всей оболочке Windows. Фактически, он позволяет вам задавать пользовательские имена для каждой из кнопок, а также предоставляет множество других параметров настройки. Но этот вид контроля не приходит бесплатно. Есть две проблемы с функцией TaskDialog
:
.NET Framework не включает в себя обертку для него из коробки. Вам нужно будет либо написать свою собственную простую оболочку, либо загрузить Windows API Code Pack , которая включает такую оболочку. Но это добавляет дополнительную зависимость к вашему коду - вы должны решить, стоит ли это того или нет.
Поскольку API был представлен только в Vista, это означает, что программы могут использовать его только при работе в Vista или более поздней версии. Если вам все еще нужно ориентироваться на Windows XP (или 2000), вам не повезло. Код для отображения TaskDialog
не будет выполнен, и вам нужно будет включить резервную процедуру, чтобы показать стандарт MessageBox
. Что, конечно, возвращает вас к тому, с чего вы начали, без возможности настраивать метки кнопок в этих устаревших операционных системах. Опять же, только вы можете решить, является ли это серьезной проблемой для вашего приложения и / или сценария развертывания.
Другая опция, используемая поколениями программистов на VB, заключается в создании собственной маленькой MessageBox
формы стиля. Не так сложно выложить простую форму с местом для иконки / изображения, текстом заголовка и всеми необходимыми кнопками. Поскольку вы создали всю форму, вы можете настроить ее по своему усмотрению.
Если вам абсолютно нужна эта функциональность в версиях Windows до Vista, то создание собственной формы окна сообщения является вашим единственным вариантом. В противном случае я настоятельно рекомендую вам воспользоваться новым TaskDialog
API. Выполнение этого в вашем приложении способствует согласованности с другими приложениями, которые пользователь, вероятно, установил на свой компьютер, и даже с самой Windows. Трудно убедиться, что ваша собственная форма сообщения имеет правильные штрихи, как, например, автоматическая обертка текста метки в зависимости от его длины и размера экрана пользователя. И показывает / скрывает кнопку закрытия «X» в строке заголовка в зависимости от того, содержит ли ваш диалог кнопку «Отмена». И невероятное количество других вещей, которые стандартная Windows MessageBox
/ TaskDialog
делает для вас бесплатно без необходимости поднимать палец. Это всего лишь переформулировка общего принципа: никогда не изобретайте велосипед, если в этом нет необходимости.
Хорошим компромиссом может быть использование чего-то вроде this TaskDialog
wrapper / emulator . В Vista и более поздних версиях, где доступен собственный API TaskDialog
, он автоматически вызывает эту функцию. В противном случае он использует стандартную форму и пытается симулировать поведение нативного TaskDialog
API. Я написал подобный пользовательский класс для собственного использования, но я так и не смог опубликовать его в Интернете.