Назад | Начало урока | Вперед
Содержание

День 6 (продолжение 3)

  • Использование в приложении конструируемого диалога
  • Вызов диалога и чтение значений переменных
  • Резюме
  • Вопросы и ответы.
  • Вопросы
  • Упражнения

    Вверх

    Использование в приложении конструируемого диалога

    Теперь ваш собственный конструируемый диалог готов. Его использование похоже на работу с общими диалогами, встроенными в Widows:

    1. Объявите экземпляр класса конструируемого диалога, который вызывает конструктор класса и создает экземпляр класса.
    2. Вызовите метод DoModal и сохраните возвращаемое им значение.
    3. Прочитайте значения переменных, связанных с элементами управления диалога.
    Создание экземпляра диалога
    Чтобы в приложении использовать конструируемый диалог, его переменные и методы должны быть доступны для класса главного окна приложения. Это достигается путем включения заголовочного файла конструируемого диалога в главный исходный файл главного окна приложения.

    Сделайте следующее:

    1. Выберите вкладку Solution Explorer
    2. Разверните папки Dialog Files и Source Files
    3. Дважды щелкните на файле DialogsDlg.cpp Откроется файл с исходным кодом для главного окна приложения.
    4. Найдите начало файла. Перед директивой #include для файла DialogsDlg.h поместите директиву #include для файла MsgDlg.h как в листинге 6.3

    Листинг 6.3 Заголовочные файлы

    #include "stdafx.h"
    #include "Dialogs.h"
    #include "MsgDlg.h"
    #include "DialogsDlg.h"

    Очень важно поместить директиву #include "MsgDlg.h" перед директивой #include "DialogsDlg.h".
    Дело в том.что в заголовочный файл главного окна приложения будет добавлено объявление переменной для конструируемого диалога. Если заголовочный файл MsgDlg.h включить после DialogsDlg.h , то компилятор обнаружит ошибку и не сможет скомпилировать.

    Теперь когда класс главного окна приложения располагает информацией о конструируемом диалоге, нужно добавить переменную конструируемого диалога.

    Для этого выполните следующее:

    1. Выберите вкладку Class View
    2. Щелкните правой кнопкой на классе CDialogDlg
    3. В контекстном меню выберите Add, а затем - пункт Add Variavble
    4. В качестве типа переменной введите CMsgDlg. Доступ - private Имя - m_dMsgDlg. Тем самым в класс главного окна приложения будет добавлена переменная.

    Если теперь вы откроете в дереве проекта класс CDialogDlg, то увидите экземпляр конструируемого диалога как член класса главного окна приложения. Это означает , что конструируемый диалог можно уже использовать в приложении.

    // CDialogsDlg dialog Класс главного окна приложения

    class CDialogsDlg : public CDialog
    {

    // Construction
    public:
    CDialogsDlg(CWnd* pParent = NULL); // standard constructor

    . . . (код пропущен)
    . . .

    private:
    CMsgDlg m_dMsgDlg; //экземпляр конструируемого диалога
    public:
    afx_msg void OnBnClickedBcustomdialog();
    afx_msg void OnBnClickedBwhichoption();
    };

    Вверх

    Вызов диалога и чтение значений переменных

    Теперь переменная конструируемого диалога добавлена в класс главного окна приложения как глобальная, а не как локальная переменная, доступная внутри отдельной функции (как например переменная для CFileDialog). И наконец можно вставить код, использующий конструируемый диалог. Выполните следующие инструкции :

    1. Добавьте функцию, обрабатывающую сообщение BN_CLICED о событии - щелчке на кнопке IDC_BCUSTOMDIALOG.
    2. Добавьте функцию, обрабатывающую сообщение BN_CLICED о событии - щелчке на кнопке IDC_WHICHOPTION.
    3. Отредактируйте функцию OnBnClickedBcustomdialog, добавив код из листинга 6.4

      Листинг 6.4 Функция OnBnClickedBcustomdialog


      void CDialogsDlg::OnBnClickedBcustomdialog()
      {
      if(m_dMsgDlg.DoModal() == IDOK)
      {
      m_strResults = m_dMsgDlg.m_strMessage;
      UpdateData(FALSE);
      m_cWhichOption.EnableWindow(TRUE);
      }
      }

      В листиге 6.4 Случай когда пользователь щелкнул на кнопке Custom Dialog: -вызывается метод DoModal нашего дочернего окна ( конструируемого диалога).

      if(m_dMsgDlg.DoModal() == IDOK)

      Данный метод отображает на экране диалоговое окно и ожидает, пока пользователь щелкнет на одной из двух кнопок.Если пользователь щелкнет на OK , то в переменную, соответствующую окну редактирования главного окна приложения, копируется текст, введенный пользователем в конструируемый диалог.(В дальнейшем этот текст отображается.)

      m_strResults = m_dMsgDlg.m_strMessage;

      После обновления диалогового окна приложения новыми значениями переменных,

      UpdateData(FALSE);

      становится доступной кнопка Which Option :

      m_cWhichOption.EnableWindow(TRUE);

      Если же пользователь щелкнет на Cancel, то ни какие действия производиться не будут и главное окно приложения останется без изменений.

    4. Отредактируйте функцию OnBnClickedBwhichoption()

      Листинг 6.5 Функция OnBnClickedBwhichoption()


      void CDialogsDlg::OnBnClickedBwhichoption()
      {
      switch(m_dMsgDlg.m_iOption)
      {
      case 0:
      m_strResults = "The first option was selected ";
      break;

      case 1:
      m_strResults = "The second option was selected ";
      break;

      case 2:

      m_strResults = "The third option was selected ";
      break;

      default:

      m_strResults = "No option was selected ";
      break;

      }

      UpdateData(FALSE);

      }

      Если теперь пользователь щелкнет на кнопке Which Option, (Листинг 6.5)то значение переменной, связанной с переключателем, будет передано оператору выбора switch, и он выберет для отображения пользователю то сообщение, в котором содержится информация о выбранном переключателе.

    Заметьте что в обеих функциях можно из класса главного окна приложения напрямую обращаться к переменным, назначенным для элементов управления конструируемого диалога, поскольку эти переменные были объявлены с модификатором public - именно благодаря этому они стали доступны даже из вне их класса. При необходимости в заголовочном файле класса модификатор доступа можно заменить на private.


    Вверх

    Резюме

    Вы научились добавлять в приложение собственные диалоговые окна для поддержки взаимодействия с пользователем. Вы изучили простую в использовании функцию MessageBox, а так же научились задавать различные сочетания кнопок и определять на какой из кнопок щелкнул пользователь. Вы увидели как можно использовать эту информацию для управления работой программы.

    Узнали о некоторых общих диалогах, встроенных в Windows, и о том в каких классах из библиотеки MFC они инкапсулированы. Вы научились применять стандартный диалог выбора файла File Open и определять какой из файлов выбрал пользователь.

    Вы научились создавать свои собственные диалоговые окна, и добавлять их в приложения с целью получить информацию от пользователя. И вы научились применять эту информацию в приложении.

    Вверх

    Вопросы и ответы.

    Вверх

    Вопросы
    1. Какие коды возврата может получить приложение от функции MessageBox если в ее аргументе указать сочетание кнопок MB_RETRYCANCEL?
    2. Какие общие диалоги, встроенные в операционную систему Windows определены как классы MFC?
    3. Чем отличаются друг от друга модальные и немодальные диалоговые окна?
    4. Как вместо диалога File Open отобразить диалог File Save?
    5. Почему не пришлось добавлять каких-либо функций или какой-либо код в конструируемый диалог сегодняшнего приложения?
  • Ответы
    Упражнения
    1. Измените ваше приложение так, чтобы оно включало каталог и имя файла (Подсказка:Функция GetPathName возвращает путь и имя файла, выбранного в окне диалога File Open.)

    2. Добавьте в конструируемый диалог кнопку, вызывающую функцию MessageBox, которая отображает диалоговое окно с двумя кнопками -Yes и No.Результат передайте обратно классу главного окна приложения.
  • Ответы

    Назад | Начало урока | Вверх | Вперед
    Содержание

    Hosted by uCoz