Создание программы моделирования. Выбор интерфейса пользователя. Выбор языка моделирования. Описание алгоритма работы программы моделирования, страница 2

          После выполнения процедуры CreateMenu, процедура AppDlgProc передаёт управление операционной системе, ожидая от неё сообщений.

ОС следит за действиями совершаемыми пользователем и в соответствии с ними передаёт сообщения в процедуру AppDlgProc.

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

 При нажатии кнопок “Линия”, “Тип излучателя”, “Тип оптического волокна” в AppDlgProc приходят сообщения с параметрами umsg=WM_COMMAND; lparam=TRUE; wparam=IDC_BUTTON2,IDC_BUTTON3,IDC_BUTTON3, что приводит к выводу, созданного ранее, меню соответствующего нажатой кнопке, посредством вызова процедуры ОС TrackPopupMenu, с указателем на соответствующее меню (hMenu1, hMenu2, hMenu3).

При выборе пункта меню, ОС посылает сообщение в AppDlgProc с параметрами umsg=WM_COMMAND; lparam=FALSE, и wparam соответствующему выбранному пункту, что приводит к вызову из AppDlgProc процедуры UpdateMenuParams.  Процедура UpdateMenuParams в зависимости от параметра wparam, с помощью системной функции SetDlgItemTextA, устанавливает в полях для редактирования исходных параметров расчёта, заранее заданные значения.

При нажатии кнопки “О программе”, операционная система посылает сообщение AppDlgProc с параметрами umsg=WM_COMMAND; wparam=IDABOUT, что приводит к вызову процедуры AboutMessage расположенной в модуле help.h. Процедура AboutMessage, с помощью системной функции MessageBox, выводит на экран окно с информацией о программе. Это окно имеет две кнопки “OK” и “Справка”. При нажатии кнопки “ОК”, функция MessageBox завершает работу.

При нажатии кнопки “Справка” или клавиши “F1” вызывается AppDlgProc с параметром umsg=WM_HELP, что приводит к выполнению процедуры HelpMessage (рис.5.3.7) расположенной в модуле help.h.

Процедура HelpMessage проверяет флаг активности страницы помощи HelpIsOn для предотвращения создания нескольких окон одновременно, и при его значении равном TRUE, системными функциями ShowWindow и SetActiveWindow активирует, созданное  ранее, окно помощи. Если флаг HelpIsOn имеет значение FALSE, то вызовом функции ОС DialogBox на экране создаётся диалоговое окно IDD_DIALOG3 с указателем на процедуру обработки диалога HelpDlgProc (рис.5.3.8).

После создания диалогового окна страницы помощи, ОС вызывает процедуру HelpDlgProc с параметром umsg=WM_INITDIALOG. Этот приводит к установке флага HelpIsOn и выводу текста помощи в окно. При нажатии кнопки “ОК” в этом окне или кнопки закрытия окна “[x]”, флаг HelpIsOn устанавливается в значение FALSE, и диалоговое окно уничтожается системной функцией EndDialog.

При нажатии кнопки “Параметры модели” в основном окне диалога, ОС вызывает AppDlgProc c параметрами umsg=WM_COMMAND; lparam=TRUE; wparam=IDC_BUTTON5. При обработке этого сообщения AppDlgProc, вызовом функции DialogBox, создаёт диалоговое окно задания параметров уточнённой модели IDD_DIALOG2, с указателем на процедуру обработки сообщений диалога AppDlgProc2 (рис.5.3.9). При создании этого окна, ОС вызывает AppDlgProc2 с параметром umsg=WM_INITDIALOG. Это приводит к копированию значений параметров уточнённой модели в поля редактирования, вызовом функций itoa, sprintf и SetDlgItemTextA. 

При нажатии кнопки закрытия окна “[x]”, посредством вызова функции ОС EndDialog, происходит уничтожение диалогового окна. При нажатии кнопки “OK”, происходит копирование значений параметров уточнённой модели из полей редактирования в глобальные переменные (nserd, omeg0 и d2nomeg), объявленные в модуле model.h.

При нажатии в основном диалоге кнопки “Рассчитать” или клавиши “Enter” на клавиатуре, операционная система посылает сообщение процедуре AppDlgProc с параметрами umsg=WM_COMMAND; lparam=FALSE; wparam=IDOK. При  приёме этого сообщения процедура AppDlgProc, с помощью системной функции IsDlgButtonChecked, проверяет состояние переключателя типа сигнала (IDC_RADIO1, IDC_RADIO_2, IDC_RADIO_3) и устанавливает тип сигнала CurrentSignal в соответствии с выбранным типом.

После установки типа сигнала проверяется состояние клавиши “Уточнённая модель”, и если она нажата, то устанавливается тип модели CurrentModel равный MD_EXACT, иначе устанавливается тип модели MD_SIMPLE. В дальнейшем, функциями GetDlgItemTetx и atof, значения параметров для моделирования копируются из полей редактирования в глобальные переменные (lline, dlambd, tau, alfa, Tinimp, Tfr и sigma), объявленные в модуле model.h.

Для уменьшения погрешностей вычислений по упрощённой модели, производится итеративное относительное нормирование величин Tinimp, Tfr и sigma. После проверки корректности значений параметров моделирования, производится вызов процедуры calculate (рис.5.3.10), расположенной в модуле model.h. Эта процедура проверяет флаг текущей модели CurrentModel, и если он равен MD_EXACT, вызывает процедуру prepareih (рис.5.3.11), подготавливающую массив значений импульсной характеристики уточнённой модели. Процедура prepareih вычисляет значения импульсной характеристики одномодового оптического волокна по уточнённой модели, путем вычисления интеграла. Интегрирование производится по методу Симпсона, что даёт наибольшую точность при невысоких вычислительных затратах.

Далее в цикле производится расчёт значений отсчётов входного и выходного сигналов, и находится максимальное значение выходного сигнала. Вычисление значения отсчёта входного сигнала выполняется функцией signal (рис.5.3.12). Вычисление значения отсчёта выходного сигнала выполняется путём свёртки функцией svert (рис.5.3.13) входного сигнала с импульсной характеристикой оптического волокна, возвращаемой функцией g (рис.5.3.14).  Функция g возвращает значение импульсной характеристики в соответствии с выбранным типом модели. Функция svert вычисляет свёртку с помощью вычисления интеграла по методу Симпсона.

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

После возврата из calculate в AppDlgProc, производится итеративное разнормирование значения Toutimp,  расчёт и вывод значения затухания и времени выходного импульса. Вывод результатов расчётов осуществляется процедурами sprintf, SetDlgItemText и вызовом процедуры вывода графиков DrawGraphProc, посредством вызова системной функции InvalidateRect. При выполнении InvalidateRect, операционная система посылает в процедуру DrawGraphProc сообщение с параметром msg=WM_PAINT. При поступлении этого сообщения, процедура DrawGraphProc очищает область вывода и выводит в эту область графики входного и выходного импульсов.

Завершение работы программы осуществляется нажатием кнопки “[x]” в основном диалоге. Нажатие этой кнопки приводит к тому, что операционная система посылает процедуре AppDlgProc сообщение с параметром umsg=WM_CLOSE. При приёме этого сообщения, AppDlgProc вызывает системную функцию EndDialog, которая даёт указание операционной системе послать во все окна, созданные этим диалогом, сообщения с параметром umsg=WM_DESTROY.  По окончании обработки этого сообщения всеми дочерними окнами, ОС уничтожает их и вызвавшее окно.

Процедура DrawGraphProc, при приёме такого сообщения, завершает своё выполнение, вызывая системную функцию PostQuitMessage, освобождает память, занимаемую процедурой обработки класса “DrawGraph”.

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