Файл: Методические рекомендации к выполнению курсового проекта по мдк 01. 02 Прикладное программирование.docx

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 173

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


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

Составляющими данного раздела могут быть следующие элементы:

  • выделение основных компонент программы на основе ранее рассмотренных аналогов

  • разработка бизнес процессов функционирования

  • разработка диаграмм, уточняющих функциональность


1.4 Обоснование и выбор средств разработки решения
Составляющими данного раздела могут быть следующие элементы:

  • анализ возможных технических и программных средств.



1.5Формализация расчетов

Составляющими данного раздела могут быть следующие элементы:

– разработка моделей поведения математических объектов

– проектирование компонент программного решения

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


2Описание программы

Описание программы рекомендовано производить согласно ГОСТ 19.402-78. Пример описание модуля отображения данных профилографа.




2.1ОБЩИЕ СВЕДЕНИЯ


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

Модуль реализован на языке С++ и совместим со стандартом ANSIC++. При разработке данного модуля использовалась библиотека MFC.

Модуль предназначен для функционирования в среде Windows.


2.2 ФУНКЦИОНАЛЬНОЕ НАЗНАЧЕНИЕ


Программная компонента отображения данных профилографа предназначена для решения следующих задач:

  • отображение данных, поступающих от профилографа;

  • предоставление оператору органов управления системой отображения.


    1. ОПИСАНИЕ ЛОГИЧЕСКОЙ СТРУКТУРЫ


Программная компонента отображения данных профилографа состоит из нескольких функциональных компонент:

  • программная компонента системных функций;

  • программная компонента отображения данных;

  • программная компонента конфигурирования.
      1. Программная компонента системных функций


Программная компонента системных функций представляет собой набор классов, реализующих следующие функции:

  • обеспечение обмена сообщениями между неграфическими объектами;

  • обеспечение выбора и автоматической смены текущей палитры отображения информации во всех графических объектах;

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

  • реализация очередей обмена данными;

  • реализация базовой функциональности для графических объектов, используемых в программной компоненте отображения данных;

  • организация таймера.
      1. Обеспечение обмена сообщениями между неграфическими объектами



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

Принцип организации обмена сообщениями такой же, как и принцип обмена сообщениями между окнами Windows.

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



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

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

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

В данном интерфейсе так же имеется один метод – check_event. Он определяет, является ли данное сообщение требуемого типа.

Интерфейс BaseEventHandle является базовым для всех объектов, которые могут обрабатывать сообщения. В нем определен один абстрактный метод – handle_event. Данный метод принимает указатель на класс BaseEvent. Прежде чем преобразовывать указатель от класса BaseEvent к требуемому классу сообщений, необходимо сначала проверить при помощи метода check_event, является ли это сообщение требуемым.

Вся работа с сообщениями организуется при помощи класса EventsQueue. Данный класс должен быть сначала создан, для того, чтобы механизм сообщений стал доступным. Класс EventsQueue имеет метод post_event, который оправляет сообщение заданному объекту. Первым параметром он принимает указатель на объект, который должен обработать сообщение, а вторым параметром – указатель на передаваемое сообщение.

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



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


Данная функциональность состоит из трех основных блоков: палитра, сервер палитр, клиент.

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

В библиотеке системных функций определен базовый интерфейс для всех палитр – Palette. Каждая палитра идентифицируется текстовым дескриптором. В данном классе определены два интерфейса:

  • virtualintget_colors_count() = 0 – данный метод возвращает число цветов в данной цветовой палитре;

  • virtualintget_color(intindex ) = 0 – данный метод возвращает цветовое значение, соответствующее указанному индексу (Максимальное значение индекса get_colors_count() – 1).

Так же в данном классе имеется несколько дополнительных методов:

  • virtualboolcheck_descriptor( constCString&check_descriptor ) – данный метод возвращает true, если переданный текстовый дескриптор совпадает с дескриптором палитры;

  • virtualvoidfill_descriptors_list(CList* list ) – данный метод добавляет свой дескриптор в список дескрипторов палитр.

В данной программной компоненте представлены три палитры: стандартная сине-зелено-красная (NotmalPalette), монохромная зеленая (GreenPalette), коричневая (BrownPalette).

Сервер палитр реализует механизм хранения и выбора палитр.

Сервер палитр реализует класс PalettesContainer.

Он имеет следующие методы:

  • staticvoidadd_pallete( Palette* palette ) – данный метод добавляет на сервер новую палитру;

  • staticPalette* get_current_palette() – данный метод возвращает указатель на текущую палитру;

  • staticPalette* get_palette( constCString&descriptor ) – данный метод возвращает указатель на палитру, по её текстовому дескриптору;

  • staticvoidset_current_palette( constCString&descriptor ) – данный метод устанавливает текущую палитру по ее текстовому дескриптору;

  • staticvoidadd_palettes_owner( BaseEventHandler* object ) – данный метод регистрирует объект, который будет получать уведомление о смене палитры (событие BaseEvent::PaletteChange);

  • staticvoidremove_palettes_owner( BaseEventHandler* object ) – данный метод удаляет объект из списка рассылки уведомлений;

  • staticboolcheck_current_palette( constCString&descriptor ) – данный метод проверяет, является ли запрашиваемая палитра текущей;

  • staticCList* get_palettes_list() – данный метод возвращает список дескрипторов всех доступных палитр. После использования данный список должен быть удален.

При смене палитры класс PalettesContainer посылает всем объектам, зарегистрированным при помощи метода (add_palettes_owner), событие PaletteChangeEvent, в котором содержится установленная палитра. При получении данного сообщения, все классы должны заменить у себя используемую палитру на вновь установленную.


Для упрощения работы с палитрами, в программной компоненте реализован класс (Colors), преобразующий значения из заданного числового диапазона, в значения цвета.

Класс Colors имеет следующие методы:

  • Colors( float range, Palette* palette = 0 ) – конструкторкласса. Принимает на вход значение числового диапазона, для которого будет осуществляться преобразование. Вторым параметром в класс может быть передана конкретная палитра, в этом случае он не будет осуществлять автоматически смену текущей палитры;

  • voidset_range( floatvalue ) – данный метод устанавливает новый диапазон значений;

  • intget_color( floatvalue ) – данный метод возвращает цвет, для переданного значения;

  • voidupdate_palette() – данный метод заставляет класс принудительно сменить текущую палитру.

При создании объект класса Colors, в случае если второй параметр конструктора был равен 0, регистрирует себя на сервере палитр PlattesContainer. После чего, он будет автоматически обрабатывать все уведомления от сервера палитр, и реагировать на изменение текущей палитры.

Если при создании объекта класса Colors, в качестве второго параметра была указана конкретная палитра, то класс не будет реагировать на изменение текущей палитры. Для этого необходимо вызвать метод update_palette, после выбора новой текущей палитры.
      1. Набор функций для упрощенного создания базовых графических объектов



При работе с базовыми графическими объектами (окна и битовые образы) с использованием функций WinAPI, приходится вызывать набор функций и заполнять большие объемы управляющих структур данных, как для создания, так и для удаления данного вида объектов. Чтобы упростить программисту процесс создания и удаления базовых графических объектов, был разработан ряд функций, которые позволяли бы выполнять такие операции как, создание объектов, их удаление, путем вызова всего одного метода.

Такие функции инкапсулированы в классе BaseWindowLibrary. Следует отметить, что для всех методов данного класса введено описание принимаемого параметра. Если параметр является для метода входным, то перед его определением указывается ключевое слово IN, если параметр, передаваемый в метод принимает возвращаемое значение, то перед его определением указывается ключевое слово OUT.

Класс BaseWindowLibrary имеет следующие методы:

  • static void create_bitmap( IN HWND window, OUT HDC *dc_bitmap, OUT HBITMAP *bitmap ). Данный метод создает bitmap для указанного в параметре window окна. Размер создаваемого битового образа будет равен размеру окна. Метод возвращает в переменной dc_bitmap контекст устройства (devicecontext) для создаваемого битового образа. В переменной bitmap возвращается дескриптор созданного битового образа;

  • static void create_bitmap( IN HWND window, IN constCRect&rect, OUT HDC* dc_bitmap, OUT HBITMAP* bitmap ). Данный метод работает, как и предыдущий, за исключением того, что в переменной rect указывается размер создаваемого битового образа;

  • static HPEN add_pen_to_bitmap( IN HDC dc_bitmap, IN int style, IN int width, IN COLORREF color ). Данный метод добавляет к созданному битовому образу объект pen. В параметре dc_bitmap передается контекст устройства битового образа, в параметре style указывается стиль, которым на битовом образе будут отображаться линии, width – указывает толщину рисования линий, color – указывает цвет рисования линий.

  • static void delete_bitmap( IN HDC dc_bitmap, IN HBITMAP bitmap ). Данный метод удаляет ранее созданный битовый образ. Метод принимает в качестве параметра dc_bitmap контекст устройства битового образа, в качестве параметра bitmap метод принимает дескриптор созданного битового образа;

  • static HWND create_window( IN HWND parent_window, IN const char* window_name, IN WNDPROC window_proc ). Данный метод создает дочернее окно. Метод принимает следующие входные параметры: parent_window – дескриптор родительского окна, window_name – имя создаваемого окна (не может быть пустым), window_proc – указатель на метод обработки сообщений от создаваемого окна. В качестве возвращаемого значения метод возвращает дескриптор созданного окна. Созданное окно имеет размер, равный размеру клиентской зоны родительского окна;

  • static HWND create_window( IN HWND parent_window, IN constCRect&rect, IN const char* window_name, IN WNDPROC window_proc, IN int style = WS_CHILD ). Данный метод работает так же, как и предыдущий. Но принимает ряд дополнительных параметров: rect – размеры создаваемого окна, style – стиль создаваемого окна.