Образец MODELESS: использование объекта CDialog в качестве безрежимного диалогового окна

Обновлен: Ноябрь 2007

В образце MODELESS показано использование объекта MFC CDialog в качестве безрежимного диалогового окна. Образец MODELESS представляет простое приложение на основе диалоговых окон, которое управляет списком в главном окне и предоставляет безрежимное диалоговое окно, в котором можно добавлять строки в список главного окна.

zhk0y9cw.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

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

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца MODELESS

  1. Откройте решение modeless.sln.

  2. В меню Построение выберите команду Построить.

  3. В меню Отладка выберите пункт Запуск без отладки.

После запуска образец представляет пустой список. Можно открыть безрежимное диалоговое окно, нажав кнопку Add. Даже если открыто окно Modeless Adder, можно вернуть фокус в главное диалоговое окно. Кнопка Add в главном диалоговом окне недоступна, когда открыто безрежимное окно, поэтому пользователь не может создать несколько экземпляров безрежимного окна.

Класс CMainDlg главного диалогового окна управляет указателем на безрежимное диалоговое окно. Это выполняется исключительно для удобства. После создания безрежимного диалогового окна для него не требуется никаких операций управления. В приложении можно выводить сведения о безрежимном окне, и тогда этот указатель обеспечит доступ к объекту C++, который управляет диалоговым окном, образуя удобную стартовую точку.

Код для кнопки Add в главном диалоговом окне создает безрежимное диалоговое окно с помощью функции Create вместо вызова метода DoModal. В результате окно становится безрежимным, и Windows обрабатывает сообщения для него особым образом. Когда окно уничтожается, не используется метод EndDialog. Вместо него вызывается метод DestroyWindow. Поскольку обычные функции-члены OnOk и OnCancel из объекта CDialog будут вызывать метод EndDialog, убедитесь, что эти функции не вызываются в безрежимном диалоговом окне и переопределяются, чтобы вызывать метод DestroyWindow.

Обычно во время создания модального диалогового окна оно уничтожается вручную после завершения вызова DoModal. Поскольку нельзя ожидать завершения Create во время отображения безрежимного диалогового окна, необходим другой механизм для уничтожения объекта C++, сопоставленного с окном. В этом образце используется очень простой механизм. Он выполняет инструкцию delete this в функции PostNcDestroy, которая вызывается после уничтожения части окна, расположенной вне клиентской области.

Обратите внимание, что безрежимное диалоговое окно связывается с родительским окном двумя различными способами. Во-первых, когда пользователь нажимает кнопку OK, строка в элементе управления "Поле ввода" из безрежимного диалогового окна добавляется к содержимому списка в модальном диалоговом окне. Во-вторых, когда пользователь уничтожает окно любым способом, безрежимное диалоговое окно вызывает функцию BoxDone в модальном окне. Эта функция просто сбрасывает указатель на модальное диалоговое окно и вновь делает доступной кнопку Add.

Ключевые слова

В этом образце показаны следующие ключевые слова:

AfxGetApp; CDC::DrawIcon; CDC::GetSafeHdc; CDialog::Create; CDialog::DoModal; CDialog::OnCancel; CDialog::OnOK; CListBox::AddString; CMenu::AppendMenu; CMenu::ModifyMenu; CRect::Height; CRect::Width; CString::IsEmpty; CString::LoadString; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWnd::DestroyWindow; CWnd::DoDataExchange; CWnd::EnableWindow; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetWindowText; CWnd::IsIconic; CWnd::OnPaint; CWnd::OnQueryDragIcon; CWnd::OnSysCommand; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetActiveWindow; GetSystemMenu; GetSystemMetrics; LoadIcon

zhk0y9cw.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Примеры MFC