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

Существует два способа добавления в проект ATL диалоговое окно: используйте мастер объектов ATL или добавить его вручную.

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

В мастере объектов ATL (менюВставка , команда Новый объект ATL ) выделить различные категории в левой панели, а затем дважды щелкните объект диалогового окна , в правой панели для добавления в проект ATL диалоговое окно. Введите в диалоговом окне Мастера свойств объекта ATL в соответствующих случаях и нажмите кнопку ОК. Мастер объектов ATL добавляет класс, производный от CAxDialogImpl проект и откроется редактор ресурсов с шаблоном поля диалогового окна.

Примечание   Если диалоговое окно ваш производный от CAxDialogImpl , его можно разместить элементы управления ActiveX и Windows. Если вы не хотите накладных расходов поддержка элементов управления ActiveX в вашем классе box диалогового окна, используйте вместо них CSimpleDialog или CDialogImpl.

Обработчики сообщений и событий могут добавляться к классу диалогового окна из контекстного таким же образом, чтобы класс MFC. В контекстного щелкните класс правой кнопкой мыши и выберите команду Добавить обработчик сообщений Windows , чтобы открыть диалоговое окно новые сообщения Windows и обработчики событий . Для получения дополнительной информации смотрите Добавление обработчика сообщений.

Чтобы открыть диалоговое окно новые сообщения Windows и обработчики событий из шаблона поля диалогового окна, щелкните правой кнопкой мыши элемент управления в шаблон поля диалогового окна и выберите команду события из контекстного меню. В проект ATL класс поля диалогового окна будет выделена в поле класса или объекта для обработки ; в то время как для проекта MFC, выделен элемент управления.

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

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

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

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

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

Если ваш объект окна Диалоговое окно содержит элементы управления ActiveX, и обработка событий от этих элементов, необходимо будет консультировать и unadvise всех интерфейсов элемента управления ActiveX. Это можно сделать, добавив следующую строку кода для вашего InitDialog функция:

AtlAdviseSinkMap (pMyDlg, TRUE)

Для unadvise элементов управления ActiveX, добавьте следующую строку кода для вашего EndDialog функция (или функция вызывается по окончании Вашего объекта поля диалогового окна):

AtlAdviseSinkMap (pMyDlg, FALSE)

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

Пример

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

класс CMyDialog: государственные CDialogImpllt;CMyDialog >,...
{
общественности:
   enum {IDD = IDD_MYDIALOG};

BEGIN_MSG_MAP(CMyDialog)
      MESSAGE_HANDLER (WM_INITDIALOG, OnInitDialog)
   END_MSG_MAP()

LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      / / Сделать некоторые инициализации кода
      возвращение 1;
   }
}

Index