Как сделать диалоговое окно на с
Перейти к содержимому

Как сделать диалоговое окно на с

  • автор:

Практическое руководство. Создание диалогового окна (C++)

Расположение и размер диалогового окна C++, а также расположение и размер элементов управления в нем измеряются в диалоговых единицах. Значения отдельных элементов управления и диалогового окна отображаются в правом нижнем углу строки состояния Visual Studio при их выборе.

Если проект еще не содержит RC-файл, см. статью «Создание файла скрипта ресурсов».

Инструкции

Редактор диалогов включает следующие возможности:

Создание диалогового окна

  1. В представлении ресурсов щелкните правой кнопкой мыши файл RC и выберите «Добавить ресурс«.
  2. В диалоговом окне «Добавить ресурс» выберите диалоговое окно в списке «Тип ресурса«, а затем нажмите кнопку «Создать«. Если знак плюса (+) отображается рядом с типом ресурса диалогового окна, это означает, что шаблоны диалоговых окон доступны. Выберите знак плюса, чтобы развернуть список шаблонов, выбрать шаблон и нажмите кнопку «Создать«. Откроется новое диалоговое окно в редакторе диалогов.

Вы также можете открыть существующие диалоговые окна в редакторе диалогового окна для редактирования.

Создание диалогового окна, которое пользователь не может выйти

Вы можете создать диалоговое окно среды выполнения, которое пользователь не может выйти. Такой тип диалогового окна используется для входа в систему, блокирования приложений или документов.

  1. В области свойств диалогового окна задайте для свойства System Menu значение false . Этот параметр отключает системное меню диалогового окна и кнопку «Закрыть «.
  2. В форме диалогового окна удалите кнопки Отмена и ОК . Во время выполнения пользователь не может выйти из модального диалогового окна с этими характеристиками.

Чтобы включить тестирование этого типа диалогового окна, функция тестового диалогового окна обнаруживает, когда нажата клавиша ESC . Esc также называется виртуальным ключом VK_ESCAPE. Независимо от того, как диалоговое окно предназначено для поведения во время выполнения, можно завершить тестовый режим, нажав клавишу ESC.

Для приложений MFC, чтобы создать диалоговое окно, которое пользователи не могут выйти, необходимо переопределить поведение OnOK по умолчанию и OnCancel , даже если удалить связанные кнопки, диалоговое окно по-прежнему можно закрыть, нажав клавишу ВВОД или ESC.

Указание расположения и размера диалогового окна

В окне свойств можно задать свойства, чтобы указать, где появится диалоговое окно.

  • Логическое свойство Center . Если задать значение True, диалоговое окно всегда будет отображаться в центре экрана. Если для этого свойства задано значение False, можно задать свойства XPos и YPos.
  • Свойства XPos и YPos, используемые для явного определения места отображения диалогового окна на экране. Эти свойства позиции — это значения смещения из верхнего левого угла области просмотра, которая определяется как .
  • Свойство Absolute Align , влияющее на позицию. Если значение True, координаты относительны к экрану. Если значение False, координаты относительны к окну владельца диалогового окна.

Проверка диалогового окна

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

  • вводить текст, выбирать пункты в полях со списками, включать и отключать параметры, выбирать команды;
  • тестировать последовательность табуляции;
  • проверять группировку элементов управления, например переключателей и флажков;
  • тестировать сочетания клавиш, используемые для доступа к элементам управления в диалоговом окне.

Подключение в код диалогового окна, сделанный с помощью мастера, не включаются в имитацию.

При тестировании диалогового окна его положение обычно определяется относительно главного окна программы. Если для свойства Абсолютного выравниваниядиалогового окна задано значение True, диалоговое окно отображается в позиции, относительно левого верхнего угла экрана.

  1. Когда редактор диалогов является активным окном, перейдите в меню «Формат >теста».
  2. Чтобы завершить имитацию, нажмите клавишу ESC или нажмите кнопку «Закрыть » в диалоговом окне тестирования.

Практическое руководство. Отображение диалоговых окон для Windows Forms

Диалоговое окно отображается так же, как и любая другая форма в приложении. Форма запуска загружается автоматически при запуске приложения. Чтобы в приложении отображалась вторая форма или диалоговое окно, напишите код для загрузки и отображения этой формы. Аналогичным образом, чтобы форма или диалоговое окно исчезли, напишите код для их выгрузки или скрытия.

Отображение диалогового окна

  1. Перейдите к обработчику событий, с помощью которого нужно открыть диалоговое окно. Это может произойти при выборе команды меню, при нажатии кнопки или при возникновении любого другого события.
  2. В обработчике событий добавьте код, который открывает диалоговое окно. В этом примере событие нажатия кнопки используется для отображения диалогового окна:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dlg1 as new Form() dlg1.ShowDialog() End Sub 
private void button1_Click(object sender, System.EventArgs e)
private: void button1_Click(System::Object ^ sender, System::EventArgs ^ e) < Form ^ dlg1 = gcnew Form(); dlg1->ShowDialog(); > 

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как сделать диалоговое окно на с

WPF поддерживает возможность создания модальных диалоговых окон. При вызове модальное окно блокирует доступ к родительскому окну, пока пользователь не закроет модальное окно.

Для работы добавим в проект новое окно, которое назовем PasswordWindow . Это окно будет выполнять роль модального.

Изменим интерфейс PasswordWindow:

       Введите пароль: Пароль      

Здесь определено текстовое поле для ввода пароля и две кнопки. Вторая кнопка с атрибутом IsCancel=»True» будет выполнять роль отмены. А первая кнопка будет подтверждать ввод.

Для подтверждения ввода и успешного выхода из модального окна определим в файле кода PasswordWindow определим обработчик первой кнопки Accept_Click:

using System.Windows; namespace WindowApp < public partial class PasswordWindow : Window < public PasswordWindow() < InitializeComponent(); >private void Accept_Click(object sender, RoutedEventArgs e) < this.DialogResult = true; >public string Password < get < return passwordBox.Text; >> > >

Для успешного выхода из модального диалогового окна нам надо для свойства DialogResult установить значение true . Для второй кнопки необязательно определять обработчик, так как у нее установлен атрибут IsCancel=»True» , следовательно, ее нажатие будет эквивалентно результату this.DialogResult = false; . Этот же результат будет при закрытии диалогового окна на крестик.

Кроме того, здесь определяется свойство Password , через которое мы можем извне получить введенный пароль.

И изменим главную форму MainWindow, чтобы из нее запускать диалоговое окно. Во-первых, определим кнопку:

И определим обработчик для этой кнопки:

private void Login_Click(object sender, RoutedEventArgs e) < PasswordWindow passwordWindow = new PasswordWindow(); if(passwordWindow.ShowDialog()==true) < if(passwordWindow.Password=="12345678") MessageBox.Show("Авторизация пройдена"); else MessageBox.Show("Неверный пароль"); >else < MessageBox.Show("Авторизация не пройдена"); >>

В итоге при нажатии на кнопку будет отображаться следующее диалоговое окно:

Модальные диалоговые окна в WPF

И в зависимости от результатов ввода будет отображаться то или иное сообщение.

Как сделать диалоговое окно?

Предположим есть окно в котором в виде таблице отображается некий список, для каждой записи есть некий набор действий, для примера пусть будут «Edit»/»Detail»/»Delete». При выборе пользователем пункта «Delete» необходимо показать окно с неким предупреждающим текстом, и двумя возможными действиями: «Ok»/»Cancel». Как бы я это сделал в winforms приложении:

var dialogBox = new DialogBox.ShowModal(); if(dialogBox.DialogResult == DialogResult.Ok) < //здесь код который должен быть сделан в случае подтверждения действия >//здесь то что надо сделать в случае отмены 

В рамках mvvm, необходимо сделать View, ModelView, т.е. у нас должно быть что то типа Main , MainViewModel , Dialog , DialogViewModel ; в Main — будут кнопки которые будут прибиндины к командам из ViewModel. т.е. например так могла бы выглядеть команда для «Delete»:

private void Delete() < var dialog = new Dialog(new DialogViewModel()) dialog.Show(); //здесь как то надо сделать проверку на то что случилось в диалоге >

Как вариант можно сделать публичное свойство в DialogViewModel с типом boolean и устанавливать его в диалоге, по нажатии на любую из кнопок (Ok/Canсel) менять его значение, в главной форме смотреть значение этого свойства. Вот только меня терзают сомнения в правильности такого подхода. Как сделать Диалоговое окно в wpf с использованием mvvm? P.S.: код писал здесь, могут быть ошибки

Отслеживать
задан 28 янв 2016 в 5:26
6,509 7 7 золотых знаков 41 41 серебряный знак 78 78 бронзовых знаков

Постарайтесь писать более развернутые вопросы. Для получения ответа поясните, в чем именно вы видите проблему

28 янв 2016 в 5:54
@KromStern попытался написать более развернуто
28 янв 2016 в 6:29
Теперь гораздо лучше. Поставил плюсик за развернутость
28 янв 2016 в 6:43

Вопрос то в чем? Если у вас простой диалог уточнение — то это может быть на совести вьюшки\вьюмодели целиком. Пилить каждый раз на каждый чих вьюшки и вьюмодели к ним тоже не надо. С другой стороны, если таких диалогов в целом набирается хотя бы штук 5, то наверно стоит вынести куда то в отдельный класс возможность просто во вьюмодели сказать что нужен запрос подтверждения с таким то текстом\иконкой\кнопками. И тут уж ессна надо делать нормальную модель диалога и вьюшку диалога.

28 янв 2016 в 7:25

@Monk что бы так тупо написать Вы сначала реализовали свой класс Dialogs (Model), представление (View), логику (ViewModel), теперь это конечно легко и тупо. а я пока не реализовал это для себя и даже не знаю как сделать, наверно придется останавливаться на публичном свойстве в диалоге и проверять его из главного окна.

28 янв 2016 в 8:18

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Здесь есть два варианта действий:

    Более простой способ, но более неудобный в случае, если вы используете TDD: Вам нет необходимости создавать ViewModel и View отдельно для диалогового окна: достаточно перед удалением проверять ответ пользователя в диалоговом окне следующим образом:

 if (MessageBox.Show("Are you sure want to delete item?", "Delete confirmation", MessageBoxButton.YesNo) == MessageBoxResult.Yes) < modelInstance.Delete(); //execute delete >
public event EventHandler ConfirmEvent; 

Событие нужно декорировать специальным аттрибутом, который позволит транслировать его в другие ViewModel-классы, не нарушая при этом принцип high-cohesion loose-coupling. Для этого используются мессенджеры. Можете попробовать Appcelerate.EventBroker. В своих проектах я использую именно его.

Далее — создаёте команду, которая ссылается на метод, вызывающий вышеупомянутое событие. Привязываете команду к кнопке в вашем диалоговом окне.

 private ICommand confirmCommand; public ICommand ConfirmCommand < get < if(confirmCommand==null) < confirmCommand = new Command(p =>FireConfirmEvent(), p => ConfirmEventPredicate()); > return confirmCommand; > > 

В самом окне при помощи метода, декорированного аттрибутом из того же мессенджера обрабатываете это событие. Метод будет содержать код, выполняющий удаление.

View в этом случае создавайте, как пару Window.xaml + Window.cs, у которого есть метод ShowDialog(), что автоматически заблокирует вызывающее окно на время открытия диалогового.

PS: первый способ не совсем правильный, потому что будет сложно тестировать результат, выбранный пользователем в MessageBox.

Добавлено Если захотите использовать это окно в разных местах вашего приложения, создайте базовый абстрактный класс, а в унаследованных VM-классах перегрузите нужные вам свойства. Например, в некоторых случаях вам может понадобиться «дернуть» несколько событий, чтобы на подтверждение среагировало несколько ViewModel. Тут всё зависит от сложности проекта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *