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

Упаковка кода в статическую библиотеку Win32Lib

Разбить на страницы
Показывать лекцию целиком
Файлы к данной лабораторной работе, Вы можете скачать здесь.

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

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

  • Программист - лицо, разрабатывающее программный модуль и упаковывающее его в библиотеку Lib
  • Пользователь - программист, использующий упакованный программный код Lib -библиотеки при разработке своих приложений
  • Существует несколько причин, по которым возникает необходимость распространять свои программные наработки не в открытом исходном коде, а в откомпилированном виде:

  • Лицо, которое получит код, может вольно или невольно испортить его
  • Программист хочет сохранить подробности решения задачи в тайне и тем самым обеспечить себе авторское право и контроль за возможностью внесения изменений
  • Чтобы не компилировать хорошо разработанное одно и то же много раз
  • Вынесение части программного кода в самостоятельные модули-полуфабрикаты называется модульным программированием. Многие программисты специализируются не на создании исполнимых модулей, а на создании именно их модульных компонентов. Различают следующие форматы модулей программного обеспечения:

  • DLL (Dynamic-Link Library) - динамически загружаемые библиотеки
  • Элементы управления ActiveX. Они хранятся в файлах, имеющих расширение OCX
  • Lib (Library) - статическая библиотека Win32
  • Поставщик программного модуля любого типа должен позаботиться о сопроводительной документации к распространяемому модулю. Включаемые заголовочные файлы для Lib -модуля также должны распространяться в открытом виде, чтобы пользователь имел возможность сообщить компилятору о спецификации Lib -кода, используемого в приложении и подключаемого позже линковщиком.

    Рассмотрим создание Lib -модуля на простом примере моделирования круга. Для этого создадим свой класс круга, в котором предусмотрим минимальные возможности. Затем упакуем созданный код в Lib -библиотеку и построим тестовое приложение для проверки возможности подключения готового модуля круга.

    Создание заготовки проекта типа Lib

  • Перейдите в свой каталог выполнения лабораторной работы
  • Выберите команды меню по созданию нового проекта
  • Назовите проект
  • После нажатия кнопки
  • После создания мастером заготовки приложения установите режим
  • На этом создание заготовки проекта CircleLib закончено. Обратите внимание на файл ресурсов. В нем ничего не содержится. Это правильно, поскольку весь остальной код программного модуля предстоит разработать самому программисту.

    Далее мы создадим файлы Circle.cpp и Circle.h, в которых будет размещен программный код моделирования круга и из которых в дальнейшем создадим библиотечный файл.

    Создание файлов Circle.cpp и Circle.h

  • Выполните команду меню по добавлению в проект нового cpp-файла
  • В окне мастера выберите настройку создания cpp-файла и задайте его имя
  • Щелкните по кнопке
  • В текстовом редакторе созданного файла добавьте вначале пустого пока файла следующий код
    Служебный заголовок к файлу Circle.cpp реализации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.cpp
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит реализацию класса CCircle 
    // и используется для генерации библиотечного файла 
    /////////////////////////////////////////////////////////
  • Аналогичным образом создайте файл
  • В созданном файле Circle.h внесите служебную информацию о создателе будущего библиотечного файла

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

    Служебный заголовок к файлу Circle.h спецификации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.h
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит спецификацию класса CCircle 
    // и используется для генерации библиотечного файла
    // Распространяется вместе с библиотекой 
    /////////////////////////////////////////////////////////
  • Сохраните изменения в обеих файлах на диске
  • Теперь файлы Circle.cpp и Circle.h являются частью проекта.

    Создание собственного класса CCircle и построение библиотеки

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

  • Внесите в файл спецификации Circle.h и в файл реализации Circle.cpp следующий код
    Файл Circle.h спецификации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.h
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит спецификацию класса CCircle 
    // и используется для генерации библиотечного файла
    // Распространяется вместе с библиотекой 
    /////////////////////////////////////////////////////////
    #pragma once
      
    #include          // MFC core and standard components
      
    class CCircle
    {
    private:
      int m_radius;
    public: // Конструктор/Деструктор
      CCircle(int r = 5){ m_radius = r;}
      ~CCircle(){}
    public:
      // Сервисы класса
      void SetRadius(int);
      int GetRadius();
      float GetArea();
      void DisplayArea();
    };
    Файл Circle.cpp реализации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.cpp
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит реализацию класса CCircle 
    // и используется для генерации библиотечного файла 
    /////////////////////////////////////////////////////////
      
    #include "Circle.h"
      
    // Реализация сервисов класса CCircle
    void CCircle::SetRadius(int r)
    {
      m_radius = r;
    }
      
    int CCircle::GetRadius()
    {
      return m_radius;
    }
      
    float CCircle::GetArea() // Секретная формула
    {
      return (float)3.1415926538 * (float)m_radius * (float)m_radius;
    }
      
    void CCircle::DisplayArea()
    {
      float fArea = GetArea();
      CString str;
      str.Format("Площадь круга равна: %f", fArea);
      AfxMessageBox(str);
    }
  • Постройте проект, выполнив команду Build Solution или Build Circle из меню Build оболочки
  • Войдите в каталог Release и убедитесь, что там создался файл Circle.lib
  • Создание тестового приложения

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

  • Закройте проект создания библиотеки и, оставаясь в том же каталоге выполнения лабораторной работы, создайте новый проект с именем TestLib
  • Создание заготовки тестового приложения

  • Выполните команду меню оболочки
  • Заполните вкладки мастера создания проекта так
  • После нажатия на кнопке
  • Установите режим построения тестового приложения в Release
  • Откройте в режиме дизайна (визуального проектирования) ресурс Таблица свойств диалоговой панели Элемент Свойство Значение Диалоговая панель ID IDD_TESTLIB_DIALOG Caption Тест для Lib Button ID IDC_BUTTON_EXIT Caption Выход Group Box Caption Параметры круга Static Text ID IDC_STATIC Caption Радиус: Align Text Right Static Text ID IDC_STATIC Caption Площадь: Align Text Right Button ID IDC_BUTTON_EXECUTE Caption Решить Button ID IDC_BUTTON_DISPLAY Caption Показать Edit Control ID IDC_EDIT_RADIUS Width 50 Edit Control ID IDC_EDIT_AREA Width 50
  • Оформите интерфейс пользователя так, как показано на рисунке
  • Подключение библиотеки к проекту

    В тестовом приложении мы будем использовать класс CCircle и его реализацию. Описание класса хранится в файле Circle.h, а объектный код функций-членов хранится в библиотеке Circle.lib. На этапе компиляции тестового приложения компилятору достаточно информации об описании класса CCircle, поэтому требуется только поместить вначале файла TestLibDlg.cpp директиву #include "path\\Circle.h".

    Здесь path указывает место размещения файла Circle.h в дереве каталогов. Двойной обратный слеш ставится потому, что одинарный слэш в C++ по умолчанию считается экраном и чтобы компилятор правильно его принял, его нужно заэкранировать (экран экранирует экран - мама мыла раму).

    Чтобы не связываться с путем, лучше скопировать файл Circle.h в каталог проекта тестового приложения.

    Компоновщику тестового приложения нужен объектный код реализации класса CCircle, который содержится в файле Circle.lib. Этот файл тоже необходимо включить в тестовое приложение.

  • Скопируйте из предыдущего проекта два файла: Circle.h и из каталога Release - файл Circle.lib
  • Откройте файл TestLibDlg.h и добавьте в начало код
    Подключение описания класса CCircle в тестовое приложение
    // TestLibDlg.h : header file
    //
      
    #pragma once
      
    #include "Circle.h"
      
    // CTestLibDlg dialog
    class CTestLibDlg : public CDialog
    {
    ...............................................
    };
  • Теперь описание класса CCircle будет доступно компилятору при построении проекта.

  • Через меню
  • В открывшемся окне установите фильтр файлов на
  • Теперь объектный код библиотеки стал частью проекта и будет доступен компоновщику при построении проекта, в чем можно убедиться, открыв дерево файлов проекта

    Создание ассоциированных переменных для элементов управления

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

  • Выделите элемент
  • Выделите элемент
  • Для реализации механизма обмена DDX мастер добавит не только описания переменных в класс, но и в функцию DoDataExchange() также добавит код

    Код для реализации DDX-механизма обмена
    void CTestLibDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDialog::DoDataExchange(pDX);
      DDX_Text(pDX, IDC_EDIT_RADIUS, m_iRadius);
      DDX_Text(pDX, IDC_EDIT_AREA, m_fArea);
    }

    Добавление управляющего кода

    Прежде всего нужно создать в классе поддержки диалогового окна приложения CTestLibDlg экземпляр ранее разработанного нами класса CCircle, считая, что он доступен тестовому приложению.

  • В файле TestLibDlg.h добавьте в конец класса CTestLibDlg следующий код
    Включение объекта круга в описание класса диалогового окна
    // TestLibDlg.h : header file
    //
    
    #pragma once
    
    // CTestLibDlg dialog
    class CTestLibDlg : public CDialog
    {
    ..................................................
    private:
      // Переменная для поля радиуса
      int m_iRadius;
      // Переменная для поля площади
      float m_fArea;
      CCircle circle;
    };
  • В метод OnInitDialog() класса CTestLibDlg в самый конец перед оператором return добавьте код инициализации
    Код инициализации в файле TestLibDlg.cpp
    BOOL CTestLibDlg::OnInitDialog()
    {
    .......................................................
      // TODO: Add extra initialization here
      m_iRadius = circle.GetRadius();
      m_fArea = circle.GetArea();
      UpdateData(FALSE);
      
      return TRUE;  // return TRUE  unless you set the focus to a control
    }
  • Постройте проект приложения и убедитесь, что оно работает, но пока не хватает функциональности
  • Дальше мы добавим функциональность к элементам управления, а пока наше тестовое приложение после запуска должно выглядеть так

    Обратите внимание, что начальный радиус (5) сгенерирован конструктором класса CCircle со значением параметра по умолчанию, которое мы задали ранее при разработке класса.

    Связывание кода с кнопкой "Выход"

  • В режиме дизайна двойным щелчком по кнопке Выход создайте обработчик и внесите в него код завершения приложения
    Обработчик кнопки "Выход"
    void CTestLibDlg::OnBnClickedButtonExit()
    {
      // TODO: Add your control notification handler code here
      OnOK();
    }
  • Связывание кода с кнопкой "Решить"

  • В режиме дизайна двойным щелчком по кнопке Решить создайте обработчик и внесите в него код
    Обработчик кнопки "Решить"
    void CTestLibDlg::OnBnClickedButtonExecute()
    {
      // TODO: Add your control notification handler code here
      UpdateData(TRUE);
      circle.SetRadius(m_iRadius);
      m_fArea = circle.GetArea();
      UpdateData(FALSE);
    }
  • Связывание кода с кнопкой "Показать"

  • В режиме дизайна двойным щелчком по кнопке Показать создайте обработчик и внесите в него код
    Обработчик кнопки "Показать"
    void CTestLibDlg::OnBnClickedButtonDisplay()
    {
      // TODO: Add your control notification handler code here
      OnBnClickedButtonExecute();
      circle.DisplayArea();
    }
  • В последнем обработчике мы задействовали код предыдущего обработчика, чтобы показывать в диалоговом окне свежую информацию.

    Запуск теста и оформление About

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

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

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

  • Программист - лицо, разрабатывающее программный модуль и упаковывающее его в библиотеку Lib
  • Пользователь - программист, использующий упакованный программный код Lib -библиотеки при разработке своих приложений
  • Существует несколько причин, по которым возникает необходимость распространять свои программные наработки не в открытом исходном коде, а в откомпилированном виде:

  • Лицо, которое получит код, может вольно или невольно испортить его
  • Программист хочет сохранить подробности решения задачи в тайне и тем самым обеспечить себе авторское право и контроль за возможностью внесения изменений
  • Чтобы не компилировать хорошо разработанное одно и то же много раз
  • Вынесение части программного кода в самостоятельные модули-полуфабрикаты называется модульным программированием. Многие программисты специализируются не на создании исполнимых модулей, а на создании именно их модульных компонентов. Различают следующие форматы модулей программного обеспечения:

  • DLL (Dynamic-Link Library) - динамически загружаемые библиотеки
  • Элементы управления ActiveX. Они хранятся в файлах, имеющих расширение OCX
  • Lib (Library) - статическая библиотека Win32
  • Поставщик программного модуля любого типа должен позаботиться о сопроводительной документации к распространяемому модулю. Включаемые заголовочные файлы для Lib -модуля также должны распространяться в открытом виде, чтобы пользователь имел возможность сообщить компилятору о спецификации Lib -кода, используемого в приложении и подключаемого позже линковщиком.

    Рассмотрим создание Lib -модуля на простом примере моделирования круга. Для этого создадим свой класс круга, в котором предусмотрим минимальные возможности. Затем упакуем созданный код в Lib -библиотеку и построим тестовое приложение для проверки возможности подключения готового модуля круга.

    Создание заготовки проекта типа Lib

  • Перейдите в свой каталог выполнения лабораторной работы
  • Выберите команды меню по созданию нового проекта
  • Назовите проект
  • После нажатия кнопки
  • После создания мастером заготовки приложения установите режим
  • На этом создание заготовки проекта CircleLib закончено. Обратите внимание на файл ресурсов. В нем ничего не содержится. Это правильно, поскольку весь остальной код программного модуля предстоит разработать самому программисту.

    Далее мы создадим файлы Circle.cpp и Circle.h, в которых будет размещен программный код моделирования круга и из которых в дальнейшем создадим библиотечный файл.

    Создание файлов Circle.cpp и Circle.h

  • Выполните команду меню по добавлению в проект нового cpp-файла
  • В окне мастера выберите настройку создания cpp-файла и задайте его имя
  • Щелкните по кнопке
  • В текстовом редакторе созданного файла добавьте вначале пустого пока файла следующий код
    Служебный заголовок к файлу Circle.cpp реализации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.cpp
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит реализацию класса CCircle 
    // и используется для генерации библиотечного файла 
    /////////////////////////////////////////////////////////
  • Аналогичным образом создайте файл
  • В созданном файле Circle.h внесите служебную информацию о создателе будущего библиотечного файла

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

    Служебный заголовок к файлу Circle.h спецификации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.h
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит спецификацию класса CCircle 
    // и используется для генерации библиотечного файла
    // Распространяется вместе с библиотекой 
    /////////////////////////////////////////////////////////
  • Сохраните изменения в обеих файлах на диске
  • Теперь файлы Circle.cpp и Circle.h являются частью проекта.

    Создание собственного класса CCircle и построение библиотеки

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

  • Внесите в файл спецификации Circle.h и в файл реализации Circle.cpp следующий код
    Файл Circle.h спецификации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.h
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит спецификацию класса CCircle 
    // и используется для генерации библиотечного файла
    // Распространяется вместе с библиотекой 
    /////////////////////////////////////////////////////////
    #pragma once
      
    #include          // MFC core and standard components
      
    class CCircle
    {
    private:
      int m_radius;
    public: // Конструктор/Деструктор
      CCircle(int r = 5){ m_radius = r;}
      ~CCircle(){}
    public:
      // Сервисы класса
      void SetRadius(int);
      int GetRadius();
      float GetArea();
      void DisplayArea();
    };
    Файл Circle.cpp реализации класса CCircle
    /////////////////////////////////////////////////////////
    //   Circle.cpp
    // Copyright (C), разработал программист (студент) ФИО
    // Этот файл содержит реализацию класса CCircle 
    // и используется для генерации библиотечного файла 
    /////////////////////////////////////////////////////////
      
    #include "Circle.h"
      
    // Реализация сервисов класса CCircle
    void CCircle::SetRadius(int r)
    {
      m_radius = r;
    }
      
    int CCircle::GetRadius()
    {
      return m_radius;
    }
      
    float CCircle::GetArea() // Секретная формула
    {
      return (float)3.1415926538 * (float)m_radius * (float)m_radius;
    }
      
    void CCircle::DisplayArea()
    {
      float fArea = GetArea();
      CString str;
      str.Format("Площадь круга равна: %f", fArea);
      AfxMessageBox(str);
    }
  • Постройте проект, выполнив команду Build Solution или Build Circle из меню Build оболочки
  • Войдите в каталог Release и убедитесь, что там создался файл Circle.lib
  • Создание тестового приложения

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

  • Закройте проект создания библиотеки и, оставаясь в том же каталоге выполнения лабораторной работы, создайте новый проект с именем TestLib
  • Создание заготовки тестового приложения

  • Выполните команду меню оболочки
  • Заполните вкладки мастера создания проекта так
  • После нажатия на кнопке
  • Установите режим построения тестового приложения в Release
  • Откройте в режиме дизайна (визуального проектирования) ресурс Таблица свойств диалоговой панели Элемент Свойство Значение Диалоговая панель ID IDD_TESTLIB_DIALOG Caption Тест для Lib Button ID IDC_BUTTON_EXIT Caption Выход Group Box Caption Параметры круга Static Text ID IDC_STATIC Caption Радиус: Align Text Right Static Text ID IDC_STATIC Caption Площадь: Align Text Right Button ID IDC_BUTTON_EXECUTE Caption Решить Button ID IDC_BUTTON_DISPLAY Caption Показать Edit Control ID IDC_EDIT_RADIUS Width 50 Edit Control ID IDC_EDIT_AREA Width 50
  • Оформите интерфейс пользователя так, как показано на рисунке
  • Подключение библиотеки к проекту

    В тестовом приложении мы будем использовать класс CCircle и его реализацию. Описание класса хранится в файле Circle.h, а объектный код функций-членов хранится в библиотеке Circle.lib. На этапе компиляции тестового приложения компилятору достаточно информации об описании класса CCircle, поэтому требуется только поместить вначале файла TestLibDlg.cpp директиву #include "path\\Circle.h".

    Здесь path указывает место размещения файла Circle.h в дереве каталогов. Двойной обратный слеш ставится потому, что одинарный слэш в C++ по умолчанию считается экраном и чтобы компилятор правильно его принял, его нужно заэкранировать (экран экранирует экран - мама мыла раму).

    Чтобы не связываться с путем, лучше скопировать файл Circle.h в каталог проекта тестового приложения.

    Компоновщику тестового приложения нужен объектный код реализации класса CCircle, который содержится в файле Circle.lib. Этот файл тоже необходимо включить в тестовое приложение.

  • Скопируйте из предыдущего проекта два файла: Circle.h и из каталога Release - файл Circle.lib
  • Откройте файл TestLibDlg.h и добавьте в начало код
    Подключение описания класса CCircle в тестовое приложение
    // TestLibDlg.h : header file
    //
      
    #pragma once
      
    #include "Circle.h"
      
    // CTestLibDlg dialog
    class CTestLibDlg : public CDialog
    {
    ...............................................
    };
  • Теперь описание класса CCircle будет доступно компилятору при построении проекта.

  • Через меню
  • В открывшемся окне установите фильтр файлов на
  • Теперь объектный код библиотеки стал частью проекта и будет доступен компоновщику при построении проекта, в чем можно убедиться, открыв дерево файлов проекта

    Создание ассоциированных переменных для элементов управления

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

  • Выделите элемент
  • Выделите элемент
  • Для реализации механизма обмена DDX мастер добавит не только описания переменных в класс, но и в функцию DoDataExchange() также добавит код

    Код для реализации DDX-механизма обмена
    void CTestLibDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDialog::DoDataExchange(pDX);
      DDX_Text(pDX, IDC_EDIT_RADIUS, m_iRadius);
      DDX_Text(pDX, IDC_EDIT_AREA, m_fArea);
    }

    Добавление управляющего кода

    Прежде всего нужно создать в классе поддержки диалогового окна приложения CTestLibDlg экземпляр ранее разработанного нами класса CCircle, считая, что он доступен тестовому приложению.

  • В файле TestLibDlg.h добавьте в конец класса CTestLibDlg следующий код
    Включение объекта круга в описание класса диалогового окна
    // TestLibDlg.h : header file
    //
    
    #pragma once
    
    // CTestLibDlg dialog
    class CTestLibDlg : public CDialog
    {
    ..................................................
    private:
      // Переменная для поля радиуса
      int m_iRadius;
      // Переменная для поля площади
      float m_fArea;
      CCircle circle;
    };
  • В метод OnInitDialog() класса CTestLibDlg в самый конец перед оператором return добавьте код инициализации
    Код инициализации в файле TestLibDlg.cpp
    BOOL CTestLibDlg::OnInitDialog()
    {
    .......................................................
      // TODO: Add extra initialization here
      m_iRadius = circle.GetRadius();
      m_fArea = circle.GetArea();
      UpdateData(FALSE);
      
      return TRUE;  // return TRUE  unless you set the focus to a control
    }
  • Постройте проект приложения и убедитесь, что оно работает, но пока не хватает функциональности
  • Дальше мы добавим функциональность к элементам управления, а пока наше тестовое приложение после запуска должно выглядеть так

    Обратите внимание, что начальный радиус (5) сгенерирован конструктором класса CCircle со значением параметра по умолчанию, которое мы задали ранее при разработке класса.

    Связывание кода с кнопкой "Выход"

  • В режиме дизайна двойным щелчком по кнопке Выход создайте обработчик и внесите в него код завершения приложения
    Обработчик кнопки "Выход"
    void CTestLibDlg::OnBnClickedButtonExit()
    {
      // TODO: Add your control notification handler code here
      OnOK();
    }
  • Связывание кода с кнопкой "Решить"

  • В режиме дизайна двойным щелчком по кнопке Решить создайте обработчик и внесите в него код
    Обработчик кнопки "Решить"
    void CTestLibDlg::OnBnClickedButtonExecute()
    {
      // TODO: Add your control notification handler code here
      UpdateData(TRUE);
      circle.SetRadius(m_iRadius);
      m_fArea = circle.GetArea();
      UpdateData(FALSE);
    }
  • Связывание кода с кнопкой "Показать"

  • В режиме дизайна двойным щелчком по кнопке Показать создайте обработчик и внесите в него код
    Обработчик кнопки "Показать"
    void CTestLibDlg::OnBnClickedButtonDisplay()
    {
      // TODO: Add your control notification handler code here
      OnBnClickedButtonExecute();
      circle.DisplayArea();
    }
  • В последнем обработчике мы задействовали код предыдущего обработчика, чтобы показывать в диалоговом окне свежую информацию.

    Запуск теста и оформление About

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