Урок № 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.

Содержание

Hosted by uCoz



Смотрите также:
Лестничные ограждения недорого лестницы. Лестничные лазарные ограждения.



Hosted by uCoz