Реализация диалогового окна
В проект 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<CMyDialog>
{
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*/);
};