Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 2:

Диалоговое окно MFC

Создание обработчика для дочерней кнопки

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

  • Вызовите контекстное меню для кнопки " Выполнить " на шаблоне диалогового окна и выполните команду Add Event Handler (Добавить обработчик событий), чтобы запустить мастер Event Handler Wizard
  • Установите значения полей мастера как показано на рисунке и щелкните на кнопке Add and Edit (Добавить и редактировать)

Мастер создаст обработчик события в виде метода

Заготовка обработчика кнопки "Выполнить"
void CHelloDialogDlg::OnBnClickedOk()
{
  // TODO: Add your control notification handler code here
  OnOK();
}

Вызов метода OnOK() будет завершать работу диалогового окна. Одновременно в карте сообщений класса CHelloDialogDlg появится дополнительная строка, связывающая событие ON_BN_CLICKED о нажатии клавиши, имеющей идентификатор IDOK, с функцией-обработчиком OnBnClickedOk()

Карта сообщений класса CHelloDialogDlg с регистрацией обработчика
BEGIN_MESSAGE_MAP(CHelloDialogDlg, CDialog)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  //}}AFX_MSG_MAP
  ON_BN_CLICKED(IDOK, &CHelloDialogDlg::OnBnClickedOk)
END_MESSAGE_MAP()
  • Измените код обработчика OnBnClickedOk() на следующий
    Код обработчика OnBnClickedOk()
    void CHelloDialogDlg::OnBnClickedOk()
    {
      UpdateData(TRUE);
      AfxMessageBox(m_strText);
    }

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

  • Постройте приложение и испытайте его функциональность на данном этапе

Создание обработчика для родительского окна

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

  • Откройте панель Class View командой View/Class View
  • Найдите класс CHelloDialogDlg, отвечающий за главное диалоговое окно, выделите его и раскройте вкладку Properties (Свойства)
  • На вкладке Properties вверху щелкните по пиктограмме Messages (Сообщения)

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

  • Найдите и выделите сообщение WM_LBUTTONDBLCLK. Внизу окна появится краткий комментарий к выбранному сообщению.

  • Добавьте через раскрывающийся список обработчик этого сообщения Среда сама создаст функцию-член CHelloDialogDlg::OnLButtonDblClk() со стандартным именем и добавит элемент карты сообщений, переадресующий сообщение WM_LBUTTONDBLCLK на вызов этой функции. Карта сообщений станет выглядеть так
    Карта сообщений класса CHelloDialogDlg после регистрации обработчика
    BEGIN_MESSAGE_MAP(CHelloDialogDlg, CDialog)
      ON_WM_SYSCOMMAND()
      ON_WM_PAINT()
      ON_WM_QUERYDRAGICON()
      //}}AFX_MSG_MAP
      ON_BN_CLICKED(IDOK, &CHelloDialogDlg::OnBnClickedOk)
      ON_WM_LBUTTONDBLCLK()
    END_MESSAGE_MAP()

Обратите внимание, что среда не позволяет регистрировать обработчики родительского диалогового окна с произвольными именами, а назначает им стандартное имя. По этой причине в карте сообщений нет необходимости связывать для события конкретные элементы с конкретными обработчиками, как это требуется делать для дочерних элементов.

Объявление функции-обработчика помещается в заголовочный файл диалогового окна и имеет вид

Объявление обработчика в заголовочном файле HelloDialogDlg.h
class CHelloDialogDlg : public CDialog
{
  .................................................
public:
  // Содержимое текстового поля
  CString m_strText;
public:
  afx_msg void OnBnClickedOk();
public:
  afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};

Заготовка функции-обработчика щелчка по диалоговому окну, которую автоматически добавит среда, имеет вид

Обработчик двойного щелчка на родительском диалоговом окне приложения
void CHelloDialogDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code here and/or call default
  
  CDialog::OnLButtonDblClk(nFlags, point);
}
  • Скорректируйте заготовку обработчика события родительского диалогового окна так
    Обработчик двойного щелчка на родительском диалоговом окне приложения
    void CHelloDialogDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
    {
      // TODO: Add your message handler code here and/or call default
      CString mess;
      mess =  "Вы выполнили двойной щелчок \n"
          "по клиентской области диалогового окна";
      CString title;
      title = "Это заголовок окна сообщения";
      MessageBox(mess, title, MB_ICONSTOP); 
        
      CDialog::OnLButtonDblClk(nFlags, point);
    }
  • Постройте приложение, которое после двойного щелчка по клиентской области будет иметь вид

Итак, для каждого добавленного обработчика сообщений среда генерирует код в трех места:

  1. Объявление в заголовочном файле .h
  2. Определение в файле .cpp
  3. Внесение записи в карту сообщений файла .cpp
    • Постройте приложение и проверьте его работоспособность

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .