Модальные и немодальные блоки диалога. Вспомогательный инструментарий
Блоки диалога
Блоки диалога это окна специального вида, включающие дочерние окна, называемые элементами управления(органами управления). Модальные блоки диалога блокируют все остальные окна приложения до завершения работы с ними, до их закрытия. Немодальные блоки диалога похожи на другие окна тем, что разрешают переключать фокус ввода на другие окна приложения.
И в 1-м и во 2-м случае необходимо вначале создать программный объект,затем связать его с шаблоном блока диалога (мы называем его ресурсом) и задать операцию воспроизведения блока диалога на экране. Отметим, что шаблон или ресурс может быть создан помимо обычного статичного способа и динамически (хотя в лаб. р. используется статический вариант):
Используемые методы класса CDialog:
CDialog::CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL )CDialog::CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL )Конструкторы, у которых 1-й параметр указатель на имя или код шаблона, 2-й параметр – ссылка на программныйобъект окна родителя или NULL(NULL – указывает, что само диалоговое окно – главное окно приложения).Если шаблон будет создаваться динамически, то используются конструкторы без параметров и для модального блока надо применить метод InitModallIndirect().Окно модального диалога отображается на экране с помощью метода:virtual int CDialog::DoModal()После завершения работы окна модального диалога эта функция возвращает значение констант IDOK или IDCANCEL, в зависимости от кнопки закрывшей окно.Функция возвращает -1, если окно не было открыто, т.е. сбой. После того, как окно закрыто по OK, можно прочитать данные из объекта, соответствующего диалоговому окну. Для немодального блока диалога надо для создания программного объекта использовать пустой конструктор (без параметров). Затем для связывания его с ресурсом (шаблоном) созданным статически или динамически используются, соответственно, методы:BOOL CDialog::Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );илиBOOL CDialog::CreateIndirect(...) с теми же параметрами. Эти функции возвратят управление сразу после отображения окна на экране и их можно (но не обязательно) вызывать непосредственно из конструктора программного объекта или за пределами конструктора. Окно диалога отображается, если для него установлен стиль WS_VISIBLE (в окне свойств ресурсов). Он устанавливается в редакторе ресурсов через окно свойств ресурса на вкладках стилей: visible. Если этот стиль не установлен, то надо дополнительно применить к программному объекту метод:CWnd::ShowWindow(int nCmdShow), режим отображения определяется параметром.После того, как работа с немодальным блоком диалога закончена, необходимо вызвать функцию CWnd::DestroyWindow(), чтобы закрыть окно.Пример(задачи по созданию модальных и немодальных окон будут на экзамене!!)Классы объектов для модальных и немодальных окон должны быть производными от CDialog и содержать соответственные атрибуты, чтобы хранить необходимую информацию. Работы с ними организовывается подобно тому, как это сделали для CEasyDialogDlg. В этом простом примере мы просто добавим к главному диалоговому окну ещё 3 кнопки: “Модальное”, “Немодальное”, “Закрыть немодальное”, со следующими идентификаторами: IDMOD, IDNMOD, IDNMOD2.
И определим, соответственно классы:
CModaldialog, CNmodaldialog производные от CDialog. В определении класса CEasyDialogDlg добавим 2 переменные:
public:
CModaldialog m_modalWnd;
CNmodaldialog* m_nmodalWnd;
По кнопкам «Модальное» и «Немодальное» открываются одинаковые диалоговые окна, содержащие по 2 кнопки: «ОК» и «Cancel». Соответствующие ресурсы имеют идентификаторы: IDD_DIALOG1 и IDD_DIALOG2.
Помимо этих кнопок немодальное окно можно закрыть кнопкой «Закрыть немодальное» из главного окна программы. В классе CEasyDialogDlg добавились обработчики сообщений от кнопок: Модальное, Немодальное, Закрыть немодальное: void CEasyDialogDlg::OnMod(){ m_modalWnd.DoModal();
}void CEasyDialogDlg::OnNmod()
{ m_nmodalWnd->Create(IDD_DIALOG2,this);}void CEasyDialogDlg::OnNmod2()
{ m_nmodalWnd->DestroyWindow();} Обработчики 2-х щелчков мыши вида OnDoubleClicked определяются точно так же. Здесь мы указали реакцию на 1-кратное нажатие кнопки. Потребовалось так же изменить обработчики OnOk() и OnCancel() в классе CNmodaldialog: void CNmodaldialog::OnCancel()
{ DestroyWindow();
}void CNmodaldialog::OnOK()
{ DestroyWindow();
}Обработчики вида OnDoubleClicked для этих кнопок определяются аналогичным образом. Для немодального окна был выбран стиль WS_VISIBLE.Конструктор объектов класса CEasyDialogDlg (для исходного диалогового окна) должен быть дополнен оператором:m_nmodalWnd = new CNmodaldialog(this);
!В реальном проекте (лаб. Работах) надо избегать повторного открытия окна немодального диалога. Надо применять переменную флажок и контролировать её состояние: «открыто/закрыто».Работа с органами управления и дополнительными переменными обычным образом через имя окна – свойства и DoDataExchange. |
Дата добавления: 2016-05-26; просмотров: 1720;