Урок № 6 - Создание мастера диалогового окна
На этом уроке мы научимся создавать мастера приложений. Примером такого приложения является мастер AppWizard.
Окно мастера можно рассматривать как разновидность диалогового окна с вкладками.
Создайте диалоговое окно с именем WizApp (как создавать было описано на первом уроке).
Удалите все элементы управления и кнопки , расположенные на заготовке диалогового окна.
Щелкните правой кнопкой мыши на заготовке диалогового окна и в проявившемся контекстном меню выберите Properties. Откроется диалоговое окно Dialog Properties.
Раскройте вкладку General (Общие свойства) и измените ID: (идентификатор ресурса) на IDD_WIZPAGE1. В текстовое поле Caption введите текст "Окно 1". Откройте вкладку Styles (Стили). В раскрывающемся списке Style: (Стиль) выберите Child (Дочернее окно). Из раскрывающегося списка Border: (Рамка) выберите Thin (Тонкая). Снимите флажок System menu (Системное меню).
Щелкните правой кнопкой мыши на идентификаторе ресурса IDD_WIZPAGE1, расположенного в папке Dialog, во вкладке ResourceView окна Workspace. Выберите в раскрывающемся списке Language: (язык), диалогового окна Dialog Properties, язык Russian.
В панели инструментов Controls выберите элемент управления Static Text и поместите его на заготовку. Откройте диалоговое окно Static Text Properties и введите в текстовое поле ID: IDD_STATIC, в поле Caption: Статический элемент первого окна.
Вызовите мастер ClassWizard нажав на клавиши Ctrl+W. Появится диалоговое окно Adding a Class (Добавление класса). В этом окне сообщается, что идентификатор ресурса IDD_WIZPAGE1 соответствует новому ресурсу и спрашивается, создавать ли для него новый класс или использовать уже созданный.
Оставьте установку переключателя в положении Create a new class (Создать новый класс) и нажмите кнопку ОК. Появится диалоговое окно New Class (Новый класс).
Введите в текстовое поле Name: идентификатор CWizPage1. В раскрывающемся списке Base class: (Базовый класс) выберите класс CPropertyPage. Нажмите на кнопку ОК.
Во вкладке ResourceView окна Workspace щелкните правой кнопкой мыши на папке WizApp Resources (Ресурсы приложения WizApp) и в появившемся контекстном меню выберите команду Insert Dialog (Вставить диалоговое окно). Щелкните на этой заготовке и измените размер диалогового окна так, чтобы он соответствовал размеру диалогового окна первой панели. Размер и положение выделенного элемента управления или диалогового окна отображается в панели состояния.
Замените идентификатор ресурса новой заготовки на IDD_WIZPAGE2, а его заголовок на "Окно 2". Повторите все операции произведенные над ресурсом IDD_WIZPAGE1.
Создайте еще одну заготовку IDD_WIZPAGE3 и назовите ее "Окно 3". Повторите все операции произведенные над ресурсами IDD_WIZPAGE1 и IDD_WIZPAGE2.
Итак, у Вас должны быть созданы три заготовки IDD_WIZPAGE1, IDD_WIZPAGE2, IDD_WIZPAGE3. Должны быть созданы три класса CWizPage1, CWizPage2, CWizPage3. На каждой заготовке должен стоять статический элемент управления IDD_STATIC.
Вызовите ClassWizard. Нажмите на кнопку Add Class ... (Добавить класс). В появившемся контекстном меню выберите команду New... (Новый). На экране появится диалоговое окно New Class.
В текстовое поле Name: введите имя класса CWiz, в раскрывающемся списке Base class: выберите класс CPropertySheet.
Нажмите на кнопку ОК. Мастер ClassWizard создаст новый класс с именем CWiz. Закройте ClassWizard нажав на кнопку ОК.
Раскройте вкладку FileView (Просмотр файлов) окна Workspace. В ней раскройте папку WizApp files (Файлы приложения SheetApp). Откройте папку Header files (Файлы заголовков) и дважды щелкните левой кнопкой мыши по имени файла Wiz.h Откроется окно редактирования файла Wiz.h
Перед объявлением класса CWiz вставьте операторы включения файлов заголовков классов вкладок диалогового окна:
#include "WizPage1.h"
#include "WizPage2.h"
#include "WizPage3.h"
В раздел // Attributes описания класса CWiz вставьте операторы объявления данных-членов класса, представляющих собой объекты классов вкладок:
CWizPage1 m_page1;
CWizPage2 m_page2;
CWizPage3 m_page3;
Во вкладке FileView окна Workspace откройте папку Source files (Файлы реализации) и дважды щелкните левой кнопкой мыши на файле Wiz.cpp
В тело функции обоих конструкторов класса CWiz, добавьте операторы включения вкладок в диалоговое окно:
CWiz::CWiz(UINT nIDCaption, CWnd* pParentWnd,
UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
CWiz::CWiz(LPCTSTR pszCaption, CWnd* pParentWnd,
UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
Во вкладке FileView окна Workspace щелкните левой кнопкой мыши на файле WizApp.cpp.
В теле функции InitInstance замените оператор CWizAppDlg dlg; на оператор:
CWiz dlg("Урок № 6 - Создание мастера диалогового окна ");
и добавьте оператор
dlg.SetWizardMode();
Не забудьте в начале файла WizApp.cpp вставить оператор включения файла заголовка класса CWiz:
#include "Wiz.h"
Откройте окно редактирования файла WizPage1.cpp и вызовите из него мастер ClassWizard.
Раскройте вкладку Message Maps. Выделите в окне списка Object IDs: имя класса CWizPage1, а в окне списка Messages: имя функции OnSetActive.
Нажмите на кнопку Add Function (Добавить функцию). Эта функция появится в окне списка Member functions:.
Добавьте в класс CWizPage1 функцию OnWizardNext.
По методике описанной выше, выполните аналогичные операции для классов CWizPage2 и CWizPage3, но добавьте в них дополнительную функцию OnWizardBack.
Откройте окно редактирования файла WizPage1.cpp и внесите в его функции изменения, зафиксированные в Листинге 6.1.
Листинг 6.1.
/////////////////////////////////////////////////////////////////////////////
// CWizPage1 message handlers
BOOL CWizPage1::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* parent = (CPropertySheet*) GetParent();
parent->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
LRESULT CWizPage1::OnWizardNext()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnWizardNext();
}
Откройте окно редактирования файла WizPage2.cpp и внесите в его функции изменения, зафиксированные в Листинге 6.2.
Листинг 6.2.
/////////////////////////////////////////////////////////////////////////////
// CWizPage2 message handlers
BOOL CWizPage2::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* parent = (CPropertySheet*) GetParent();
parent->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
LRESULT CWizPage2::OnWizardNext()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnWizardNext();
}
LRESULT CWizPage2::OnWizardBack()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnWizardBack();
}
Откройте окно редактирования файла WizPage3.cpp и внесите в его функции изменения, зафиксированные в Листинге 6.3.
Листинг 6.3.
/////////////////////////////////////////////////////////////////////////////
// CWizPage3 message handlers
BOOL CWizPage3::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
CPropertySheet* parent = (CPropertySheet*) GetParent();
parent->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
LRESULT CWizPage3::OnWizardBack()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnWizardBack();
}
Сохраните Вашу работу и запустите приложение на исполнение. Появится диалоговое окно мастера.
Как видите в диалоговом окне "Окно 1" недоступна кнопка Back (Назад), в диалоговом окне "Окно 3" кнопка Next (Далее), а в диалоговом окне "Окно 2" доступны обе кнопки.
Доступность этих кнопок определяется функцией CPropertySheet::SetWizardButtons, которая обычно вызывается из функции CPropertySheet::OnSetActive. Функция SetWizardButtons определяет функцию и внешний вид кнопок диалогового окна мастера. В параметрами этой функции является набор флагов, объединенных функцией логического ИЛИ. Этот набор состоит из следующих флагов:
PSWIZB_BACK - отображает и делает доступной кнопку Back.
PSWIZB_NEXT - отображает и делает доступной кнопку Next.
PSWIZB_FINISH - отображает и делает доступной кнопку Finish.
PSWIZB_DISABLEFINISH - делает недоступной кнопку Finish.
Флаги PSWIZB_NEXT и PSWIZB_FINISH являются несовместимыми, т.к. относятся к одной и той же физической кнопке. Поэтому окно может содержать или кнопку Next (Далее) или кнопку Finish (Готово), но не обе сразу.
Но мастер AppWizard, с помощью маленьких хитростей, содержит и кнопку Next (Далее) и кнопку Finish (Готово).
Флаг PSWIZB_DISABLEFINISH может появиться только в комбинации с флагом PSWIZB_FINISH.
Смотрите также:
Лестничные ограждения недорого лестницы. Лестничные лазарные ограждения.