Перейти к содержимому

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

  • автор:

Практическое руководство. Создание диалогового окна (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 или нажмите кнопку «Закрыть » в диалоговом окне тестирования.

Реализация диалогового окна

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

Добавление диалогового окна с помощью мастера диалогового окна ATL

В диалоговом окне «Добавление класса» выберите объект диалогового окна ATL, чтобы добавить диалоговое окно в проект ATL. Заполните мастер диалогового окна ATL соответствующим образом и нажмите кнопку «Готово«. Мастер добавляет в проект класс, производный от CAxDialogImpl . Откройте представление ресурсов в меню «Вид«, найдите диалоговое окно и дважды щелкните его, чтобы открыть его в редакторе ресурсов.

Если диалоговое окно является производным, CAxDialogImpl оно может размещать элементы activeX и элементы управления Windows. Если вам не нужна поддержка элементов activeX в классе диалогового окна, используйте CSimpleDialog или CDialogImpl.

Обработчики сообщений и событий можно добавить в класс диалогов из представления классов. Дополнительные сведения см. в разделе «Добавление обработчика сообщений ATL».

Добавление диалогового окна вручную

Реализация диалогового окна аналогична реализации окна. Вы наследуете класс из CAxDialogImpl, CDialogImpl или CSimpleDialog и объявляете карту сообщений для обработки сообщений. Однако необходимо также указать идентификатор ресурса шаблона диалогового окна в производном классе. Класс должен иметь член данных, вызываемый IDD для хранения этого значения.

При создании диалогового окна с помощью мастера диалоговых окон ATL мастер автоматически добавляет IDD элемент в качестве enum типа.

CDialogImpl позволяет реализовать модальное или бессерверное диалоговое окно, в котором размещаются элементы управления Windows. CAxDialogImpl позволяет реализовать модальное или бессерверное диалоговое окно, в котором размещаются элементы управления ActiveX и Windows.

Чтобы создать модальное диалоговое окно, создайте экземпляр CDialogImpl класса-производного (или CAxDialogImpl производного), а затем вызовите метод DoModal . Чтобы закрыть модальное диалоговое окно, вызовите метод EndDialog из обработчика сообщений. Чтобы создать диалоговое окно без режима, вызовите метод Create вместо DoModal . Чтобы уничтожить диалоговое окно без режима, вызовите DestroyWindow.

События приемника автоматически выполняются в CAxDialogImpl. Реализуйте обработчики сообщений диалогового окна, как и обработчики в производном CWindowImpl классе. Если имеется возвращаемое значение для конкретного сообщения, верните его в качестве LRESULT значения. Возвращаемые LRESULT значения сопоставляются ATL для правильной обработки диспетчером диалоговых окон Windows. Дополнительные сведения см. в исходном коде для CDialogImplBaseT::D ialogProc в atlwin.h.

Пример

Следующий класс реализует диалоговое окно:

class CMyDialog : public CDialogImpl < public: enum < IDD = IDD_MYDLG >; BEGIN_MSG_MAP(CMyDialog) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnBnClickedCancel) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) < // Do some initialization code return 1; >public: LRESULT OnBnClickedCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); >; 

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

Предположим есть окно в котором в виде таблице отображается некий список, для каждой записи есть некий набор действий, для примера пусть будут «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 6 6 золотых знаков 39 39 серебряных знаков 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. Тут всё зависит от сложности проекта.

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

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

57

  1. Создайте форму и добавьте требуемые элементы управления диалогового окна формы.
  2. Откройте форму в режиме конструктора.
  3. Дважды щелкните область выделения формы, чтобы открыть окно свойств.
  4. Выберите значение Да для свойства Всплывающее окно (PopUp).
  5. В ячейке свойства Модальное окно (Modal) выберите значение Да.
  6. В ячейке свойства Тип границы (BorderStyle) выберите значение Окно диалога.
  7. В ячейке свойства Область выделения (RecordSelectors) выберите значение Нет.
  8. В ячейке свойства Кнопки перехода (NavigationButtons) выберите значение Нет.
  9. В ячейке свойства Разделительные линии (DividingLines) выберите значение Нет.
  10. Создайте макрос или процедуру обработки события для открытия диалогового окна.
  11. Свяжите макрос или процедуру обработки события с формой, указав имя макроса или процедуры обработки события в ячейке соответствующего свойства события. Например, введите имя макроса или процедуры обработки события в ячейку свойства кнопки Нажатие кнопки (OnClick).

Чтобы разместить диалоговое окно на экране нужным образом, откройте их в режиме конструктора, разверните окно Microsoft Access, выберите местоположение окна и сохраните форму. При открытии диалогового окна оно появится в этом месте (предполагается, что свойство Выравнивание по центру (AutoCenter) установлено в значение Нет и положение не задано в процедуре обработки события, открывающей диалоговое окно).

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

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