Окно сообщения с кнопками Подтвердить и Отменить - PullRequest
4 голосов
/ 29 июня 2011

Как получить сообщение с двумя кнопками: «Подтвердить» и «Отмена»?

1 Ответ

7 голосов
/ 29 июня 2011

К сожалению, стандартная функция Win32 MessageBox не поддерживает кнопки с пользовательскими метками. А поскольку функция VB.NET MsgBox является тонкой оболочкой для этой собственной функции, она также не поддерживает их. Предопределенные значения - это все, что вы получаете. Это означает, что лучшее, что вы можете сделать, это что-то вроде «ОК» и «Отмена», с текстом, поясняющим, что «ОК» означает «продолжить проверку».

Стоит отметить, что в течение лет это была рекомендуемая практика, одобренная руководствами по стилю Windows. На самом деле, похоже, что это все еще . В частности, обратите внимание на исключения из следующего общего правила:

Используйте кнопки положительной фиксации, которые являются конкретными ответами на основную инструкцию, вместо общих меток, таких как OK или Да / Нет. Пользователи должны иметь возможность понять параметры, читая только текст кнопки.
Исключения:

  • Используйте Close для диалогов, у которых нет настроек, таких как информационные диалоги. Никогда не используйте Close для диалогов, в которых есть настройки.
  • Используйте OK, когда «конкретные» ответы все еще являются общими , такими как Сохранить, Выбрать или Выбрать.
  • Используйте OK при изменении определенной настройки или набора настроек.
  • Для устаревших диалоговых окон без основной инструкции вы можете использовать общие метки, такие как ОК. Часто такие диалоговые окна не предназначены для выполнения конкретной задачи, предотвращая более конкретные ответы.
  • Некоторые задачи требуют более тщательного и внимательного прочтения, чтобы пользователи могли принимать обоснованные решения. Обычно это происходит с подтверждениями. В таких случаях вы можете целенаправленно использовать общие метки кнопок фиксации, чтобы заставить пользователей прочитать основные инструкции и предотвратить поспешные решения.


В Windows Vista появился новый API, предназначенный для замены устаревшего и не поддающегося настройке MessageBox - он называется TaskDialog. Если вы работаете в Windows Vista или 7, вы, несомненно, видели, что это диалоговое окно используется во всей оболочке Windows. Фактически, он позволяет вам задавать пользовательские имена для каждой из кнопок, а также предоставляет множество других параметров настройки. Но этот вид контроля не приходит бесплатно. Есть две проблемы с функцией TaskDialog:

  1. .NET Framework не включает в себя обертку для него из коробки. Вам нужно будет либо написать свою собственную простую оболочку, либо загрузить Windows API Code Pack , которая включает такую ​​оболочку. Но это добавляет дополнительную зависимость к вашему коду - вы должны решить, стоит ли это того или нет.

  2. Поскольку 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. Я написал подобный пользовательский класс для собственного использования, но я так и не смог опубликовать его в Интернете.

...