Практикум прикладного программирования на MFC и C++ в среде VS.NET

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

Разбить на страницы
Показывать лекцию целиком

Создание заготовки приложения

Файлы к данной лабораторной работе, Вы можете скачать здесь.
  • Создайте командой
  • В диалоговом окне New Project нужно выбрать тип проекта MFC Application, в текстовом поле Name задать имя проекта ( HelloDialog ), в поле ввода Location или через кнопку Browse (Выбрать) задать место расположения папки с проектом. Каждый проект оболочка располагает в отдельной папке с именем проекта. Туда помещаются все вспомогательные файлы и файлы с кодом программы. Итоговый загрузочный (исполняемый) модуль программы (файл с расширением .exe ) также будет носить имя проекта (в нашем случае HelloDialog.exe )

    Мастер создания приложений MFC Application Wizard слева имеет список вкладок, позволяющих задать параметры проекта, а справа - сами вкладки с элементами управления проектом. В зависимости от типа создаваемого проекта те или иные опции на вкладках мастера будут заблокированы.

    Первая вкладка Overview (Обзор) отображает параметры проекта, установленные в данный момент

  • Откройте вкладку
  • Если в раскрывающемся списке Resource language нет языка Русский, то оставьте эту установку как есть. Позднее вручную мы настроим файл ресурсов на правильное восприятие приложением надписей на русском языке
  • Остальные настройки вкладки Application Type оставьте в состоянии по умолчанию
  • Откройте вкладку
  • Возможно, что после создания проекта заголовок окна исказится и его нужно будет корректировать после настройки ресурсов на русский язык.

  • Щелкните на кнопке Finish и мастер приложений создаст папку с именем проекта и запишет в нее все необходимые для проекта файлы
  • По правой и левой границам окна среды проектирования будут расположены пиктограммы выдвигающихся панелей, обеспечивающих удобный интерфейс для программиста. Любую панель можно включить через меню View, если ее нет на рабочем столе.

  • Раскройте панель Resource View и настройте ресурсы на русский язык. Для этого раскройте все узлы дерева ресурсов и последовательно выделяя каждый узел в окне Properties из раскрывающегося списка Language выберите Русский
  • В заключение нужно подправить заголовок приложения, если он исказился при создании проекта. Для этого

  • Раскройте панель
  • Выделите форму и через панель свойств Properties установите в свойстве Caption требуемый заголовок
  • Построение каркаса приложения мастером MFC Application Wizard на этом закончено. Это работоспособное приложение, но оно пока имеет минимальную функциональность.

  • Постройте приложение и убедитесь, что представление окна имеет вид
  • Программирование заготовки приложения

    Создание программы включает в себя два этапа:

  • Визуальное проектирование
  • Написание кода
  • Подработаем наш проект и наполним его некоторой функциональностью, а именно:

  • Уберем статический текст на панели с дежурной надписью " TODO: Place dialog controls here "
  • Уменьшим диалоговую панель
  • Изменим надписи на кнопках на русские " Выполнить " и " Отмена "
  • Разместим в центре элемент управления Static Text и под ним элемент Edit Control из панели инструментов Toolbox
  • Сделаем так, чтобы после ввода текста в поле редактирования и нажатии на кнопке " Уберите дежурную надпись, щелкнув на ней и нажав клавишу Delete или в контекстном меню команду Delete
  • Уменьшите диалоговую панель, выделив ее и потянув за маркер в нижнем правом углу
  • Измените надписи на кнопках после их поочередного выделения и вызова панели свойств клавишей F4. В поле Caption поменяйте значения "OK" и " Cancel " на русские " Выполнить " и " Отмена "
  • Вспомним, что во всех ресурсах приложения мы установили язык Русский.

  • Из панели Toolbox поместите на форму текстовое поле Edit Control и текстовую метку Static Text
  • Выровняйте элементы пользовательского интерфейса относительно панели и друг друга с помощью панели инструментов редактора диалоговых окон
  • Щелкните на кнопке Test Dialog панели инструментов редактора диалоговых окон, чтобы получить визуальное представление пользовательской формы без компиляции всего приложения
  • Теперь нужно связать поле ввода, кнопку " Выполнить " и библиотечное диалоговое окно сообщений AfxMessageBox() или MessageBox() между собой так, чтобы после ввода сообщения в поле ввода и нажатии кнопки " Выполнить " появлялось бы стандартное диалоговое окно сообщений с набранным текстом.

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

  • Выделите правой кнопкой мыши текстовое поле Edit Control на шаблоне диалогового окна и через контекстное меню выполните пункт Add Variable, чтобы запустить мастер Add Member Variable Wizard
  • Настройте мастер в соответствии с рисунком и щелкните на кнопке Finish
  • Для того, чтобы посмотреть, что сделал мастер при добавлении переменной m_strText, выполните следующее:

  • Вызовите окно поиска и замены комбинацией клавиш Ctrl+F или командой Edit/Find and Replace/Quick Find меню оболочки и настройте его в соответствии с рисунком
  • Перемещаясь по ссылкам окна Find and Replace мы видим, что мастер переменных включил описание переменной в класс CHelloDialogDlg одноименного заголовочного файла

    Объявление переменной в классе CHelloDialogDlg
    class CHelloDialogDlg : public CDialog
    {
      ....................................................
    public:
      // Содержимое текстового поля
      CString m_strText;
    };

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

    Функция обмена данными между текстовым полем и переменной
    void CHelloDialogDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDialog::DoDataExchange(pDX);
      DDX_Text(pDX, IDC_EDIT1, m_strText);
    }

    В конструкторе класса мастер создал код инициализации переменной пустым значением

    Инициализация переменной в конструкторе класса CHelloDialogDlg
    CHelloDialogDlg::CHelloDialogDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CHelloDialogDlg::IDD, pParent)
      , m_strText(_T(""))
    {
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
  • Задайте вручную в конструкторе класса свой начальный текст для текстового поля
  • Инициализация переменной в конструкторе класса CHelloDialogDlg
    CHelloDialogDlg::CHelloDialogDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CHelloDialogDlg::IDD, pParent)
      , m_strText(_T("Элемент текстового поля"))
    {
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

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

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

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

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

    Заготовка обработчика кнопки "Выполнить"
    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 (Сообщения)
  • В окне появятся два столбца с перечнем всех сообщений, для которых можно создать обработчики, и перечень имен всех уже созданных обработчиков.

  • Найдите и выделите сообщение
  • Добавьте через раскрывающийся список обработчик этого сообщения Среда сама создаст функцию-член 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);
    }
  • Постройте приложение, которое после двойного щелчка по клиентской области будет иметь вид
  • Итак, для каждого добавленного обработчика сообщений среда генерирует код в трех места:

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

    Создание заготовки приложения

    Файлы к данной лабораторной работе, Вы можете скачать здесь.
  • Создайте командой
  • В диалоговом окне New Project нужно выбрать тип проекта MFC Application, в текстовом поле Name задать имя проекта ( HelloDialog ), в поле ввода Location или через кнопку Browse (Выбрать) задать место расположения папки с проектом. Каждый проект оболочка располагает в отдельной папке с именем проекта. Туда помещаются все вспомогательные файлы и файлы с кодом программы. Итоговый загрузочный (исполняемый) модуль программы (файл с расширением .exe ) также будет носить имя проекта (в нашем случае HelloDialog.exe )

    Мастер создания приложений MFC Application Wizard слева имеет список вкладок, позволяющих задать параметры проекта, а справа - сами вкладки с элементами управления проектом. В зависимости от типа создаваемого проекта те или иные опции на вкладках мастера будут заблокированы.

    Первая вкладка Overview (Обзор) отображает параметры проекта, установленные в данный момент

  • Откройте вкладку
  • Если в раскрывающемся списке Resource language нет языка Русский, то оставьте эту установку как есть. Позднее вручную мы настроим файл ресурсов на правильное восприятие приложением надписей на русском языке
  • Остальные настройки вкладки Application Type оставьте в состоянии по умолчанию
  • Откройте вкладку
  • Возможно, что после создания проекта заголовок окна исказится и его нужно будет корректировать после настройки ресурсов на русский язык.

  • Щелкните на кнопке Finish и мастер приложений создаст папку с именем проекта и запишет в нее все необходимые для проекта файлы
  • По правой и левой границам окна среды проектирования будут расположены пиктограммы выдвигающихся панелей, обеспечивающих удобный интерфейс для программиста. Любую панель можно включить через меню View, если ее нет на рабочем столе.

  • Раскройте панель Resource View и настройте ресурсы на русский язык. Для этого раскройте все узлы дерева ресурсов и последовательно выделяя каждый узел в окне Properties из раскрывающегося списка Language выберите Русский
  • В заключение нужно подправить заголовок приложения, если он исказился при создании проекта. Для этого

  • Раскройте панель
  • Выделите форму и через панель свойств Properties установите в свойстве Caption требуемый заголовок
  • Построение каркаса приложения мастером MFC Application Wizard на этом закончено. Это работоспособное приложение, но оно пока имеет минимальную функциональность.

  • Постройте приложение и убедитесь, что представление окна имеет вид
  • Программирование заготовки приложения

    Создание программы включает в себя два этапа:

  • Визуальное проектирование
  • Написание кода
  • Подработаем наш проект и наполним его некоторой функциональностью, а именно:

  • Уберем статический текст на панели с дежурной надписью " TODO: Place dialog controls here "
  • Уменьшим диалоговую панель
  • Изменим надписи на кнопках на русские " Выполнить " и " Отмена "
  • Разместим в центре элемент управления Static Text и под ним элемент Edit Control из панели инструментов Toolbox
  • Сделаем так, чтобы после ввода текста в поле редактирования и нажатии на кнопке " Уберите дежурную надпись, щелкнув на ней и нажав клавишу Delete или в контекстном меню команду Delete
  • Уменьшите диалоговую панель, выделив ее и потянув за маркер в нижнем правом углу
  • Измените надписи на кнопках после их поочередного выделения и вызова панели свойств клавишей F4. В поле Caption поменяйте значения "OK" и " Cancel " на русские " Выполнить " и " Отмена "
  • Вспомним, что во всех ресурсах приложения мы установили язык Русский.

  • Из панели Toolbox поместите на форму текстовое поле Edit Control и текстовую метку Static Text
  • Выровняйте элементы пользовательского интерфейса относительно панели и друг друга с помощью панели инструментов редактора диалоговых окон
  • Щелкните на кнопке Test Dialog панели инструментов редактора диалоговых окон, чтобы получить визуальное представление пользовательской формы без компиляции всего приложения
  • Теперь нужно связать поле ввода, кнопку " Выполнить " и библиотечное диалоговое окно сообщений AfxMessageBox() или MessageBox() между собой так, чтобы после ввода сообщения в поле ввода и нажатии кнопки " Выполнить " появлялось бы стандартное диалоговое окно сообщений с набранным текстом.

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

  • Выделите правой кнопкой мыши текстовое поле Edit Control на шаблоне диалогового окна и через контекстное меню выполните пункт Add Variable, чтобы запустить мастер Add Member Variable Wizard
  • Настройте мастер в соответствии с рисунком и щелкните на кнопке Finish
  • Для того, чтобы посмотреть, что сделал мастер при добавлении переменной m_strText, выполните следующее:

  • Вызовите окно поиска и замены комбинацией клавиш Ctrl+F или командой Edit/Find and Replace/Quick Find меню оболочки и настройте его в соответствии с рисунком
  • Перемещаясь по ссылкам окна Find and Replace мы видим, что мастер переменных включил описание переменной в класс CHelloDialogDlg одноименного заголовочного файла

    Объявление переменной в классе CHelloDialogDlg
    class CHelloDialogDlg : public CDialog
    {
      ....................................................
    public:
      // Содержимое текстового поля
      CString m_strText;
    };

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

    Функция обмена данными между текстовым полем и переменной
    void CHelloDialogDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDialog::DoDataExchange(pDX);
      DDX_Text(pDX, IDC_EDIT1, m_strText);
    }

    В конструкторе класса мастер создал код инициализации переменной пустым значением

    Инициализация переменной в конструкторе класса CHelloDialogDlg
    CHelloDialogDlg::CHelloDialogDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CHelloDialogDlg::IDD, pParent)
      , m_strText(_T(""))
    {
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
  • Задайте вручную в конструкторе класса свой начальный текст для текстового поля
  • Инициализация переменной в конструкторе класса CHelloDialogDlg
    CHelloDialogDlg::CHelloDialogDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CHelloDialogDlg::IDD, pParent)
      , m_strText(_T("Элемент текстового поля"))
    {
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

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

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

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

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

    Заготовка обработчика кнопки "Выполнить"
    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 (Сообщения)
  • В окне появятся два столбца с перечнем всех сообщений, для которых можно создать обработчики, и перечень имен всех уже созданных обработчиков.

  • Найдите и выделите сообщение
  • Добавьте через раскрывающийся список обработчик этого сообщения Среда сама создаст функцию-член 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);
    }
  • Постройте приложение, которое после двойного щелчка по клиентской области будет иметь вид
  • Итак, для каждого добавленного обработчика сообщений среда генерирует код в трех места:

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