Панель состояния предназначена для вывода на экран необходимой пользователю информации.
Панель состояния представляет собой немодальное окно диалога, которое выводится в нижнюю часть главного (родительского) окна. Размер и местоположение панели устанавливаются с помощью функции SetWindowPos.
Вид панели состояния показан на рис. 3.4.
Рис. 3.4. Вид панели состояния.
В рассматриваемой программе панель состояния используется для отображения краткого описания органов управления панели инструментов при их просмотре пользователем, а при наличии активного дочернего окна – и для отображения количества записей и номера записи, с которой пользователь работает в текущий момент времени. Поля панели состояния, в которых отображается вышеуказанная информация, представляют собой статические дочерние окна управления (предопределенного класса «статическое окно»). Панель состояния содержит также один орган управления общего пользования – т.н. прогресс-индикатор, отображающий динамику длительной операции как процент от выполненной задачи.
Входные параметры панели состояния.
В рассматриваемой программе панель состояния создается функцией CreateDialog:
hPnSost = CreateDialog (hInstance, LOC («PnSost» C), hWnd, LOC(Pnsost)).
Параметры этой функции являются входными параметрами для панели состояния. Первый и третий из них аналогичны соответствующим входным параметрам панели инструментов. Параметр LOC («PnSost» C) идентифицирует шаблон диалогового окна панели состояния. Параметр LOC(Pnsost) содержит адрес процедуры диалога панели состояния.
Функция возвращает дескриптор панели состояния, который хранится в глобальной переменной hPnSost.
Процедура диалогового окна панели состояния определяется следующим образом:
integer function Pnsost (hDlg, message, wParam, lParam).
Ее параметры аналогичны параметрам процедуры диалога панели инструментов.
В рассматриваемой программе процедура диалогового окна панели состояния получает и обрабатывает только сообщение WM _ INITDIALOG. При получении этого сообщения процедура диалога вычисляет высоту панели состояния аналогично тому, как это реализовано в процедуре диалога панели инструментов. Вычисленное значение хранится в глобальной переменной YPnSost.
Отображение информации.
Для вывода информации в дочернее окно управления панели состояния используется функция
SetDlgItemText (hwndDlg, idControl, lpsz).
Параметры этой функции следующие:
hwndDlg – дескриптор диалогового окна (в нашем случае это глобальная переменная hPnSost);
idControl – идентификатор дочернего окна управления;
lpsz – указатель на Си-строку, содержащую текст, который нужно вывести в данное дочернее окно управления.
Для управления прогресс-индикатором ему посылаются сообщения при помощи функции
SendDlgItemMessage (hwndDlg, idControl, Msg, wParam, lParam).
Параметр Msg здесь – переменная, содержащая посылаемое сообщение, а параметры wParam и lParam содержат дополнительную информацию о сообщении.
Панель состояния отображается на поверхности главного окна все время работы программы и уничтожается только по завершении работы.
Строковый редактор
Строковый редактор предназначен для отображения и редактирования текстовых данных.
Строковый редактор является дочерним окном оконного редактора и выводится на его рабочую поверхность. Размер и местоположение строкового редактора устанавливаются с помощью функции SetWindowPos в оконном редакторе. Высота окна строкового редактора определяется высотой используемого шрифта, ширина – длиной редактируемого текста.
Работа со строковым редактором.
Оконный редактор содержит текстовые данные в виде страницы, состоящей из нескольких строк. Каждая строка разбивается на поля. Каждое поле – это определенное число (параметр). Содержимое текущего поля, т.е. поля, доступного для редактирования, помещается в окно строкового редактора (далее – «окно»), которое отмечено двойным бордюром.
Каретка перемещается внутри «окна». Если каретка достигает границы «окна» (левой или правой), то дальнейшее движение в том же направлении приводит к перемещению «окна». Если же «окно» находится на левой или правой границе страницы, то его дальнейшее перемещение в том же направлении приводит к «листанию» страницы вправо / влево.
Перемещения «окна» по странице (страницам) возможны следующие: вверх / вниз на одну строку; влево / вправо на одно поле; в начало / конец строки; на ту же позицию предыдущей / последующей страницы («листание» вверх / вниз); на ту же позицию первой / последней страницы.
Ввод текстовых данных и все коррекции производятся внутри «окна». Если каретка находится на правой границе «окна», то после ввода «окно» перемещается вправо на одно поле (если это возможно).
Внутри «окна» символы можно удалять по одному или группами (слева / справа от позиции каретки, удалить все содержимое «окна»).
Создание окна строкового редактора.
Создание окна строкового редактора происходит при обработке сообщения WM _ CREATE в оконной процедуре оконного редактора. Для этого используется рассмотренная ранее функция CreateWindowEx. Она возвращает дескриптор окна строкового редактора, который хранится в глобальной переменной hWEdit. Следует отметить, что при регистрации класса окна строкового редактора стиль окна задается как комбинация следующих стилей:
à CS_VREDRAW, CS_HREDRAW – разрешают перерисовку рабочей области окна в случае изменения его высоты или ширины;
à CS_OWNDC – создает уникальный контекст устройства для каждого окна, созданного на основе данного класса;
à CS_DBLCLKS – разрешает посылку оконной процедуре сообщения о двойном щелчке мышью над рабочей областью окна.
При создании окна строкового редактора используется «расширенный» стиль WS_EX_DLGMODALFRAME, создающий двойную рамку вокруг окна.
Оконная процедура строкового редактора определяется следующим образом:
integer function Editw (hEdit, mesg, wParam, lParam)
Ее параметры аналогичны параметрам оконной процедуры главного окна: hEdit – дескриптор окна строкового редактора; mesg – переменная, идентифицирующая сообщение; параметры wParam и lParam содержат дополнительную информацию о сообщении.
Вид строкового редактора представлен на рис. 3.5.
Рис. 3.5. Вид строкового редактора
Входные параметры строкового редактора.
Входными параметрами для строкового редактора являются нажатия алфавитно-цифровых и некоторых функциональных клавиш. Он также отслеживает состояние системных клавиш для задействования т.н. «горячих клавиш». Строковый редактор должен реагировать и на нажатия левой или правой кнопок мыши.
Выходные параметры строкового редактора.
Выходными параметрами строкового редактора являются:
à отображение редактируемого текста;
à сообщение WM _ LBUTTONDBLCLK, посылаемое оконной процедуре родительского окна;
à сообщение WM _ COMMAND, посылаемое оконной процедуре родительского окна.
Сообщение WM _ COMMAND посылается в случае, если необходимо переместить окно строкового редактора или нажата «горячая клавиша».
Алгоритм работы строкового редактора.
1. Отображение редактируемого текста.
2. Обработка сообщений, связанных с вводом с клавиатуры.
3. Обработка сообщений, связанных с нажатиями кнопок мыши.
При работе по приведенному алгоритму используются следующие переменные:
à Bufed – символьная строка, содержащая редактируемый текст;
à Leng – длина редактируемого текста (содержимого Bufed) в символах;
à P oz – положение каретки (число символов) от левого края окна;
à C od – главный код нажатой клавиши;
à S ccod – информационный код нажатой клавиши;
à C odv – код возврата (0‑нет коррекций; 1‑есть коррекция).
Все переменные, кроме Bufed, – целочисленные.
Первый пункт алгоритма реализуется следующим образом.
После создания окна строкового редактора, но перед его отображением, оконная процедура получает сообщение WM _ CREATE. При его обработке обнуляются переменные C od, S ccod, C odv. Задаются шрифт и цвет выводимого в окно текста. Окно получает фокус ввода. Вывод редактируемого текста, т.е. содержимого Bufed, происходит при получении сообщения WM _ PAINT и осуществляется функцией TextOut:
bret = TextOut (hdc, nXStart, nYStart, lpString, cbString),
где: bret – логическая переменная, принимающая значение TRUE или FALSE соответственно при успешном или неуспешном завершении функции; hdc – дескриптор контекста устройства, на которое выводится текст; nXStart и nYStart – координаты начальной позиции вывода текста; lp String – указатель на символьную строку, которая содержит текст; cbString – количество символов в этой строке.
Затем каретка устанавливается на позицию, определяемую переменной P oz (если каретка отсутствует, она предварительно создается и отображается).
При получении сообщения WM _ DESTROY обнуляется переменная hWEdit, уничтожается каретка и закрывается окно строкового редактора.
Второй пункт алгоритма.
Для удобства работы в Компоновщике расчетных схем предусмотрена возможность использования т.н. «горячих клавиш». «Горячая клавиша» – это комбинация клавиш, которую пользователь может нажать для вызова к.-л. функции. В рассматриваемой программе используются две группы комбинаций: CTRL + <буква>, ALT + <буква>. Отслеживание к.-л. комбинации из первой группы не вызывает особых затруднений, в то время как использование клавиши ALT имеет свои особенности.
ОС Windows нажатия клавиш делятся на системные и несистемные. Системные нажатия – это нажатия клавиш, используемых для управления приложением и Windows. В IBM PC для этой цели Windows использует клавишу ALT, поэтому можно сказать, что нажатия клавиши ALT являются системными. При нажатии клавиши ALT (или любой другой клавиши, если ALT при этом удерживается нажатой) оконная процедура имеющего фокус ввода окна получает сообщение WM_SYSKEYDOWN. Нажатия всех остальных клавиш считаются несистемными, в этом случае оконная процедура окна с фокусом ввода получает сообщение WM_KEYDOWN.
В оконной процедуре строкового редактора при получении любого из этих сообщений фиксируется информационный код нажатой клавиши (sccod), переменная cod обнуляется. Затем вызывается подпрограмма edit с параметром hEdit.
При получении сообщения WM _ CHAR, генерируемого рассмотренной ранее функцией TranslateMessage, фиксируется главный код нажатой клавиши (cod), переменная sccod обнуляется, а затем также вызывается подпрограмма edit с параметром hEdit.
Предусмотрена перекодировка из Windows‑кодировки в MS DOS‑кодировку. При необходимости этот модуль можно убрать.
В подпрограмме edit производятся следующие операции:
а) если нажата одна из тех «горячих клавиш», которые дублируют органы управления панели инструментов, то параметру wParam присваивается значение идентификатора соответствующего органа управления и в оконную процедуру родительского окна посылается сообщение WM _ COMMAND.
б) если нажата одна из тех «горячих клавиш», которые дублируют операции выделения строк или блоков, операцию снятия маркировки, то параметру wParam присваивается значение идентификатора соответствующего пункта всплывающего меню оконного редактора и в его оконную процедуру посылается сообщение WM _ COMMAND.
в) если нажата клавиша «ESCAPE» или «ENTER», переменной sccod присваивается соответственно 0 или значение, соответствующее информационному коду клавиши «стрелка вправо», а затем оконной процедуре оконного редактора посылается сообщение WM _ COMMAND с параметром wParam, равным -1.
г) если значение переменной cod не равно нулю, т.е. была нажата клавиша в алфавитно-цифровой части клавиатуры, происходит изменение редактируемого текста, переменной sccod присваивается значение, соответствующее информационному коду клавиши «стрелка вправо».
д) если значение переменной cod равно нулю, по информационному коду нажатой клавиши проверяется ее принадлежность к группе функциональных клавиш или клавиш управления курсором, которые выполняют следующие действия:
à клавиша «стрелка влево» (VK _ LEFT) – каретка перемещается на одну позиции влево. Если одновременно с клавишей была нажата клавиша Ctrl или каретка вышла за левую границу окна строкового редактора, оконной процедуре оконного редактора посылается сообщение WM _ COMMAND с параметром wParam, равным -1;
à клавиша «стрелка вправо» (VK _ RIGHT) – каретка перемещается на одну позиции вправо. Если одновременно с клавишей была нажата клавиша Ctrl или каретка вышла за правую границу окна строкового редактора, оконной процедуре оконного редактора посылается сообщение WM _ COMMAND с параметром wParam, равным -1;
à клавиша «Delete» (VK_DELETE) – происходит удаление символа над кареткой, переменной codv присваивается значение 1;
à клавиша «Home» (VK _ HOME) – происходит перемещение каретки в начало окна. Если одновременно с клавишей была нажата клавиша Ctrl, оконной процедуре оконного редактора посылается сообщение WM _ COMMAND с параметром wParam, равным -1;
à клавиша «End» (VK _ END) – происходит перемещение каретки в конец окна. Если одновременно с клавишей была нажата клавиша Ctrl, оконной процедуре оконного редактора посылается сообщение WM _ COMMAND с параметром wParam, равным -1;
à клавиша «F5» (VK _ F 5) – происходит удаление текста слева от каретки;
à клавиша «F6» (VK _ F 6) – происходит удаление текста справа от каретки;
à клавиша «F7» (VK _ F 7) – происходит удаление всего текста.
При изменении редактируемого текста код возврата принимает значение, равное 1, а оконная процедура строкового редактора получает сообщение WM _ PAINT путем вызова функции InvalidateRect.
Третий пункт алгоритма.
При получении оконной процедурой строкового редактора сообщения WM_LBUTTONDOWN определяются координаты курсора мыши и каретка перемещается в позицию (с учетом ширины символов), соответствующую местоположению курсора мыши.
При получении оконной процедурой строкового редактора сообщения WM_RBUTTONDOWN на экран выводится всплывающее меню, вид которого представлен на рис. 3.6.
Рис. 3.6. Всплывающее меню строкового редактора
При щелчке левой кнопкой мыши на к.-л. пункте всплывающего меню оконной процедуре строкового редактора посылается сообщение WM _ COMMAND, содержащее в младшем слове параметра wParam идентификатор выбранного пункта меню. Переменной sccod присваивается значение идентификатора выбранного пункта меню и вызывается подпрограмма edit .
Двойной щелчок левой кнопкой мыши на рабочей области окна строкового редактора порождает сообщение WM _ LBUTTONDBLCLK. При получении этого сообщения оконная процедура строкового редактора «переправляет» его родительскому окну, т.е. оконному редактору, где оно и обрабатывается.
В рассматриваемой программе оконная процедура строкового редактора и подпрограмма edit объединены в одном модуле, что позволяет рассматривать строковый редактор как «черный ящик». «Черный ящик» получает некоторые сообщения и определенным образом на них реагирует (рис. 3.7).
Рис. 3.7. Строковый редактор
Строковый редактор отображается на поверхности оконного редактора все время и уничтожается только по завершении его работы.
Оконный редактор
Оконный редактор предназначен для отображения и редактирования базы данных.
Оконный редактор является дочерним окном главного окна и выводится на его рабочую поверхность. Размер и местоположение оконного редактора устанавливаются с помощью функции SetWindowPos. Ширина окна определяется длиной строки базы данных, а высота – условием неперекрытия диалоговых окон (панели инструментов, панели состояния и, если активен режим ввода названий узлов, окна ввода названий узлов).
Создание оконного редактора.
Для создания окна оконного редактора вызывается функция CreateWch, которая определяется следующим образом:
hWch = CreateWch (hWnd, szClassName, UnschWProc, LengStr),
где: hWnd – дескриптор родительского окна (т.е. главного окна); szClassName – имя класса окна (оно же является и заголовком окна); UnschWProc – имя процедуры обработки сообщений оконного редактора; LengStr – длина строки базы данных.
В процессе выполнения этой функции вычисляется максимальная ширина окна в пикселях, регистрируется класс окна (причем устанавливается предопределенный в Windows стиль курсора «IDC_CROSS», т.е. «перекрестие»). Затем при помощи функции CreateWindowEx создается окно оконного редактора. Стиль окна – дочернее, видимое, имеет строку заголовка с кнопкой закрытия окна, вертикальную и горизонтальную полосы прокрутки.
Функция CreateWch возвращает дескриптор оконного редактора, который хранится в глобальной переменной hWch.
Оконная процедура оконного редактора определяется следующим образом:
integer function UnschWProc (hWch, mesg, wParam, lParam)
Ее параметры аналогичны параметрам оконной процедуры главного окна: hWch – дескриптор оконного редактора; mesg – переменная, идентифицирующая сообщение; параметры wParam и lParam содержат дополнительную информацию о сообщении.
Вид оконного редактора представлен на рис. 3.8 (см. на следующей странице).
Рис. 3.8. Вид оконного редактора
Входные параметры оконного редактора.
Входными параметрами для оконного редактора являются сообщения о нажатии кнопок мыши, перемещении мыши (сообщение WM _ MOUSEMOVE), сообщения от полос прокруток (WM_VSCROLL и WM_ H SCROLL). Как говорилось ранее, оконный редактор может получать сообщение WM _ COMMAND от панели инструментов и строкового редактора, а также сообщение WM _ LBUTTONDBLCLK.
Выходные параметры оконного редактора.
Выходными параметрами оконного редактора являются:
à отображение редактируемой базы данных и строкового редактора;
à реализация дополнительных функций, предоставляемых рассматриваемой программой.
Примечание: вызов дополнительных функций может осуществляться через «горячие клавиши», через панель инструментов или через всплывающее меню оконного редактора.
Алгоритм работы оконного редактора.
1. Отображение редактируемой базы данных и строкового редактора.
2. Обработка сообщений мыши.
3. Обработка сообщений полос прокрутки.
4. Обработка сообщения WM_COMMAND.
5. Реализация дополнительных функций, предоставляемых программой.
Смысл некоторых переменных, использующихся при работе по приведенному алгоритму, поясняется на рис. 3.9.
Рис. 3.9
js , jsMax – номер текущей записи и максимальное число полей в записи базы данных соответственно;
jsLeft , jsRight – границы отображаемого текста базы данных (содержимого оконного редактора) по горизонтали (номера столбцов);
MaxRow , MaxCol – максимальное число символов, отображаемых в оконном редакторе, по вертикали и горизонтали соответственно;
in , iv – границы отображаемого текста базы данных (содержимого оконного редактора) по вертикали (номера записей);
Row – номер записи, на которой находится строковый редактор (принимает значения от 1 до MaxRow);
Kol – количество записей (строк) в базе данных.
Используются также следующие переменные и массивы:
Text – исходный массив (база данных);
Bufv – символьный массив, отображаемый на экране (содержимое оконного редактора);
Par – целочисленный массив, содержащий границы полей базы данных (табуляция);
Ndn , Nup – минимальный и максимальный номера строк массива Bufv, в пределах которых его необходимо заполнить новыми данными из Text;
BVpol , Bhpol – логические переменные, указывающие на наличие полос прокрутки.
Все упомянутые переменные, кроме BVpol и Bhpol – целочисленные. Назначение некоторых других переменных, используемых в программе, будет пояснено далее.
Первый пункт алгоритма реализуется следующим образом.
После создания оконного редактора, но перед его отображением, оконная процедура получает сообщение WM _ CREATE. При его обработке путем вызова функции SetStatePnUpr на панели инструментов активизируются доступные оконному редактору функции. Затем вызывается функция WMCREATE:
Ret = WMCREATE ( hWch , NumbRowTitr , Par ),
где NumbRowTitr – число строк титров (в рассматриваемой программе равно 1).
В процессе выполнения этой функции задаются шрифт и цвет выводимого в окно текста, рассчитываются значения переменных js , jsMax , jsLeft , jsRight , MaxRow , MaxCol . После этого вызывается подпрограмма коррекции данных corUnsch с параметром hWch, в которой данные подготавливаются для вывода на экран (более подробно работа подпрограммы corUnsch будет рассмотрена далее). Затем путем вызова функции CreateEdit с параметром hWch создается строковый редактор.
При получении сообщения WM _ PAINT оконная процедура вызывает функцию WMPAINT:
ret = WMPAINT (hWch, TitrUnsch, NumbRowTitr, Par, Bufv),
где TitrUnsch – символьный массив, содержащий титры.
В процессе выполнения этой функции производится вывод на экран строки (строк) титров и содержимого массива Bufv. Если имеются отмеченные строки или блоки текста, они выводятся инвертированными.
При получении сообщения WM _ SIZE оконная процедура вызывает функцию WMSIZE:
ret = WMSIZE (hWch, K ol, NumbRowTitr, LengStr),
в которой, исходя из нового размера рабочей области оконного редактора, пересчитываются переменные MaxRow , MaxCol , и анализируется, нужно ли отображать полосы прокрутки. Далее в оконной процедуре рассчитывается новое значение переменной jsRight, а затем, в случае необходимости, корректируется положение окна строкового редактора (при уменьшении размеров рабочей области оконного редактора) или содержимое массива Bufv (при увеличении размеров рабочей области оконного редактора).
При получении сообщения WM _ DESTROY обнуляется переменная hWch, уничтожается окно строкового редактора и закрывается окно оконного редактора.
Рассмотрим более подробно подпрограмму corUnsch .
В случае, если код возврата отличен от нуля, сначала в символьный массив Bufv, а затем и в Text, заносятся изменения, произведенные в строковом редакторе. Затем вызывается функция MoveEditWithMouse :
ret = MoveEditWithMouse (Par, K ol),
Если в результате щелчка левой кнопкой мыши или действия полос прокрутки окно строкового редактора необходимо переместить, функция возвращает положительное значение, в зависимости от которого вызывается функция Metka 4 или Metka 5, а затем Metka 6. Если в результате действия полосы прокрутки требуется изменить содержимое оконного редактора, то пересчитываются границы отображаемого текста базы данных in , iv , в соответствии с ними заполняется массив Bufv, а затем вызываются функции Metka 4, Metka 5, Metka 6. Если функция MoveEditWithMouse возвращает 0, т.е. перемещение окна не производилось ни мышью, ни полосами прокрутки, то вызывается подпрограмма управления окном contw, и в случае перемещения строкового редактора с помощью клавиатуры или всплывающего меню (влево / вправо, вверх / вниз, в начало / конец строки, в начало / конец базы данных, листание вверх / вниз) пересчитывается положение строкового и оконного редакторов. В том случае, если перемещение строкового редактора не производилось, проверяется, был ли запрос на поиск по шаблону.
Функция Metka 4 выполняет пересчет переменных jsLeft , jsRight в зависимости от того, в каком столбце (js) находится строковый редактор. Пересчитывается также его горизонтальная координата XEdit .
Функция Metka 5 выполняет пересчет вертикальной координаты строкового редактора YEdit, а в символьную строку Bufed помещается редактируемый текст.
В процессе выполнения функции Metka 6 в соответствующие поля панели состояния выводится количество записей в базе данных и номер текущей записи.
Второй пункт алгоритма реализуется следующим образом.
Оконная процедура оконного редактора обрабатывает пять сообщений мыши: WM_LBUTTONDOWN, WM _ RBUTTONDOWN , WM _ MOUSEMOVE , WM _ LBUTTONDBLCLK и WM_LBUTTONUP.
При получении сообщения WM_LBUTTONDOWN вызывается функция WMLBUTTONDOWN:
ret = WMLBUTTONDOWN (hWch, mesg, lParam, corUnsch).
В процессе выполнении этой функции переменной cod присваивается значение переменной mesg, т.е. идентификатор сообщения WM_LBUTTONDOWN, а переменной sccod – значение переменной lParam, содержащей горизонтальную позицию курсора мыши в младшем слове и вертикальную позицию курсора мыши в старшем слове. Затем вызывается подпрограмма corUnsch, в которой рассчитываются новые координаты окна строкового редактора. Обновляется его содержимое, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos, после чего управление возвращается в оконную процедуру, где выполняются еще несколько операторов, связанных с реализацией дополнительных функций, и о которых более подробно будет рассказано при описании четвертого пункта алгоритма.
При получении оконной процедурой оконного редактора сообщения WM_RBUTTONDOWN на экран выводится всплывающее меню. Перед его созданием для каждого пункта меню задается идентификатор и отображаемый текст. Затем вызывается подпрограмма popupm с параметром hWch, в которой происходит создание и отображение меню. Вид всплывающего меню оконного редактора представлен на рис. 3.10.
Рис. 3.10. Вид всплывающего меню оконного редактора
При щелчке левой кнопкой мыши на к.-л. пункте всплывающего меню оконной процедуре оконного редактора посылается сообщение WM _ COMMAND, содержащее в младшем слове параметра wParam идентификатор выбранного пункта меню.
Обработка оконной процедурой сообщений WM _ MOUSEMOVE , WM _ LBUTTONDBLCLK и WM_LBUTTONUP необходима для реализации дополнительных функций, предоставляемых программой, и подробнее будет рассмотрена при описании четвертого пункта алгоритма.
Третий пункт алгоритма реализуется следующим образом.
При обработке действий пользователя вертикальная и горизонтальная полосы прокрутки посылают родительскому окну (т.е. оконному редактору) сообщения WM _ VSCROLL и WM _ HSCROLL соответственно. При этом переменная wParam в младшем слове содержит одну из величин, идентифицирующих действие пользователя, и определенных в файле msfwinty.f90 (приведены только те, которые обрабатываются в рассматриваемой программе):
à SB_LINEDOWN – прокрутка на строку вниз;
à SB_LINEUP – прокрутка на строку вверх;
à SB_PAGEDOWN – прокрутка на страницу вниз;
à SB_PAGEUP – прокрутка на страницу вверх;
à SB_THUMBTRACK – перетаскивание бегунка. Номер текущей позиции бегунка содержится в старшем слове wParam.
При обработке сообщения WM _ VSCROLL вызывается функция WMVSCROLL:
ret = WMVSCROLL (hWch, mesg, wParam, corUnsch).
При обработке сообщения WM _ HSCROLL вызывается функция WM H SCROLL:
ret = WMHSCROLL (hWch, mesg, wParam, corUnsch).
Алгоритмы работы этих функций схожи. В случае, если младшее слово wParam содержит идентификатор SB_LINEDOWN, SB_LINEUP, SB_PAGEDOWN или SB_PAGEUP, переменная cod обнуляется, а переменной sccod присваивается значение идентификатора соответствующего пункта всплывающего меню. Если младшее слово wParam содержит идентификатор SB_THUMBTRACK, переменной cod присваивается значение переменной mesg, а переменной sccod – значение переменной wParam. (Во всех остальных случаях управление возвращается оконной процедуре.) Затем вызывается подпрограмма corUnsch, в которой рассчитываются новые координаты окна строкового редактора. Обновляется его содержимое, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos, после чего управление возвращается оконной процедуре.
Если указанное сообщение поступило от горизонтальной полосы прокрутки, то соответствующие операции осуществляются влево / вправо.
Четвертый пункт алгоритма.
При получении сообщения WM _ COMMAND вспомогательной переменной ret присваивается значение младшего слова wParam. Дальнейшая работа программы организуется с помощью конструкции Select Case, тест-выражением для которой является переменная ret.
Если ret = -1, т.е. сообщение пришло от оконной процедуры строкового редактора, или ret является идентификатором пункта всплывающего меню оконного редактора (кроме последних пяти), вызывается функция MYCASE:
ret = MYCASE (hWch, ret, corUnsch).
При выполнении функции сначала анализируется значение переменной ret, и если ret является идентификатором пункта всплывающего меню, переменная cod обнуляется, а sccod присваивается значение ret. Затем вызывается подпрограмма corUnsch. Обновляется содержимое строкового редактора, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos и управление возвращается оконной процедуре.
Если ret является идентификатором радиокнопки или одного из органов управления панели инструментов, т.е. была вызвана одна из функций, доступных данному дочернему окну, выполняется соответствующая переменной ret Case‑секция.
Во всех остальных случаях (по оператору Case Default) управление передается функции DefWindowProc.
Пятый пункт алгоритма.
В рассматриваемой программе реализованы следующие дополнительные функции:
1. «Выбор титров».
2. «Вызов Протокола».
3. «Ввод названий узлов».
4. «Отметить строку (строки)».
5. «Отметить блок».
6. «Снять маркировку».
7. «Поиск по шаблону вниз / вверх».
Рассмотрим работу каждой из них подробнее.
1. «Выбор титров».
Назначение – предоставление пользователю возможности задавать порядок отображения параметров в любой комбинации и в любой последовательности.
При вызове этой функции на экран выводится окно модального диалога, в котором предлагается выбрать желаемый порядок следования полей записей базы данных. Вид модального диалога представлен на рис. 3.11 (см. на следующей странице).
Рис. 3.11. Вид модального диалога «Выбор титров»
Оконная процедура диалога и подпрограммы, необходимые для реализации данной функции, объединены в модуле Titr.
При инициализации диалога оконная процедура вызывает подпрограмму TitreInit, в которой инициализируются необходимые переменные и на экран выводится список титров, доступных для выбора.
В процессе работы с данным диалогом пользователь может выполнять следующие действия.
à Нажать кнопку переноса титра вправо. Оконная процедура диалога получает соответствующее сообщение, по которому вызывает подпрограмму Move, где выполняются операции переноса выделенного титра из одного окна списка в другой. Если ни один титр в левом окне списка не выбран или список пуст, кнопка недоступна.
à Нажать кнопку переноса титра влево. Вызывается подпрограмма Move, где выполняются операции переноса выделенного титра из одного окна списка в другой. Если ни один титр в правом окне списка не выбран или список пуст, кнопка недоступна.
à Нажать кнопку «Выбрать все». Все содержимое левого окна списка добавляется в правый, после чего левый список очищается. Если левый список пуст, кнопка недоступна.
à Нажать кнопку «Очистить все». Содержимое обоих окон списков уничтожается, а затем вызывается подпрограмма TitreInit. Данная кнопка недоступна, если левый список пуст.
à Нажать кнопку «Отмена». Восстанавливается прежний порядок следования титров, окно диалога завершает свою работу и управление передается оконной процедуре оконного редактора.
à Нажать кнопку «Ок». В переменную jsMax записывается количество выбранных титров. После этого последовательно вызываются подпрограмма Change_By_Places_Titr, в которой производится коррекция символьного массива TitrUnsch, содержащего титры, и подпрограмма Change_By_Places_Text, в которой производится коррекция символьного массива Bufv и целочисленного массива табуляции Par в соответствии с выбранным порядком отображения параметров. Окно модального диалога уничтожается и управление передается оконной процедуре оконного редактора. Данная кнопка недоступна, пока не будет выбран по крайней мере один титр.
Модуль Titr также содержит подпрограмму Vosvrat_Titr, в которой производится восстановление первоначального порядка следования титров, и подпрограмму Vosvrat_Text, в которой производится восстановление первоначального порядка следования элементов массивов Bufv и Par.
Глобальная логическая переменная TitrFlag по умолчанию устанавливается в FALSE и принимает значение TRUE только в том случае, если порядок отображения параметров был изменен. В процессе работы оконного редактора перед началом обмена данными между массивами Bufv и Text анализируется состояние переменной TitrFlag и, если она установлена в TRUE, вызывается подпрограмма Vosvrat_Text, а при завершении обмена вызывается подпрограмма Change_By_Places_Text.
2. «Вызов Протокола».
Эта функция становится доступной либо после трансляции любого файла основной базы данных, либо после компоновки расчетной схемы. При ее вызове пользователю предоставляется список обнаруженных при трансляции ошибок. Предусмотрена возможность автоматического поиска источника ошибки, принадлежащего к редактируемому типу исходных данных.
При вызове протокола на экран выводится модальное окно диалога. Вид модального диалога представлен на рис. 3.12.
Рис. 3.12. Вид модального диалога «Вызов Протокола»
Оконная процедура диалога и подпрограмма ProtocolInit, которая вызывается при инициализации диалога, объединены в модуле ProtMod.
Каждому сообщению об ошибке соответствует одна строка. Общее количество строк (сообщений) и номер текущей строки указываются в соответствующих полях («Всего записей» и «Запись №»).
Предусмотрены три группы сообщений: «!» – использование данных, как правило, при решении технологических задач приводит к их аварийному завершению; «?» – возможны ошибки при решении ряда технологических задач; «» – предупреждения, не обязательно связанные с ошибками.
Для удаления какого либо сообщения необходимо отметить его с помощью клавиатуры или щелчком левой кнопки мыши, а затем нажать кнопку «Удалить». Удаление является мнимым: все удаленные сообщения легко восстанавливаются – следует закрыть, а затем повторно вызвать протокол.
Автоматический поиск источника ошибки осуществляется следующим образом: сначала необходимо отметить нужное сообщение, а затем нажать кнопку «Перейти». Окно протокола закрывается, в оконный редактор выводится нужная страница данных, а окно строкового редактора устанавливается на записи, содержащей ошибку. Переход к месту ошибки возможен также по двойному щелчку левой кнопкой мыши на сообщении об ошибке.
Выход из окна протокола осуществляется автоматически, если удалены все сообщения об ошибках, или по нажатию кнопки «Выход из Протокола».
При изменении редактируемых данных вызов функции «Протокол» становится недоступен до тех пор, пока измененные данные не будут вновь оттранслированы.
3. «Ввод названий узлов».
Данная функция доступна только при редактировании параметров узлов и дает возможность пользователю редактировать названия узлов.
Ее вызов осуществляется щелчком левой кнопкой мыши на соответствующей радиокнопке панели инструментов. В нижней части экрана непосредственно над панелью состояния выводится немодальное окно диалога, вид которого представлен на рис. 3.13.
Рис. 3.13. Вид немодального диалога «Ввод названий узлов».
Размеры оконного редактора соответствующим образом корректируются. В случае, если при отображении немодального диалога «Ввод названий узлов» оконному редактору останется недостаточно места для отображения хотя бы одной записи, выводится соответствующее сообщение, немодальный диалог не создается, а вызов функции игнорируется.
Оконная процедура диалога содержится в модуле NameUzlMod.
В окно диалога выводится номер узла, соответствующего записи, на которой установлено окно строкового редактора, и название этого узла (не более 50 символов). При перемещении строкового редактора по записям эта информация обновляется.
Для редактирования названия узла необходимо щелкнуть левой кнопкой мыши на окне редактирования немодального диалога и при появлении в нем курсора отредактировать текст окна. Чтобы вернуть курсор строковому редактору, достаточно щелкнуть левой кнопкой мыши над рабочей областью оконного редактора.
Все время, пока активен режим ввода названий узлов, соответствующая радиокнопка на панели инструментов остается отмеченной. При повторном ее нажатии осуществляется выход из этого режима: считывается и запоминается содержимое окна редактирования, окно немодального диалога уничтожается, корректируются размеры оконного редактора, а радиокнопка разотмечается.
4. «Отметить строку (строки)».
Для удобства работы пользователя реализована возможность отметки строки (строк). Маркировать можно отдельную строку или несколько строк. В последнем случае при использовании «горячей клавиши» (ALT+L) или всплывающего меню оконного редактора отмечаются верхняя и нижняя строки в произвольной последовательности, допускается расширение отмеченного блока вверх и вниз.
Реализована возможность маркировки строки (строк) с помощью мыши путем ее перемещения с нажатой левой кнопкой. В момент отпускания кнопки операция выделения прекращается.
Отмеченная строка (строки) выводится на экран инвертированной.
5. «Отметить блок».
Для удобства работы пользователя реализована возможность отметки блока с помощью клавиатуры (используется «горячая клавиша» ALT+B) и с помощью мыши (используется двойной щелчок левой кнопкой или всплывающее меню оконного редактора). Маркировать можно отдельное поле или группу (блок) полей; в последнем случае отмечается левый верхний и правый нижний угол в произвольной последовательности. Допускается расширение отмеченного блока вверх и влево, вниз и вправо.
При отметке начала блока (к.-л. поля) оно инвертируется, а на панель состояния выводится надпись «Отметьте конец блока». При отметке конца блока отмеченная группа полей выводится на экран инвертированной, а надпись в панели состояния стирается.
6. «Снять маркировку».
Снять маркировку уже отмеченного блока или строки (строк) можно с помощью клавиатуры («горячая клавиша» ALT+U) и с помощью мыши (используется щелчок левой кнопкой мыши над рабочей областью оконного редактора или всплывающее меню оконного редактора).
7. «Поиск по шаблону вниз / вверх».
Данная функция облегчает и ускоряет поиск нужного параметра.
Шаблон поиска вводится в окно редактирования на панели инструментов (см. п. 3.4). Затем с помощью соответствующих органов панели инструментов («поиск по шаблону вниз», «поиск по шаблону вверх»), которые продублированы «горячими клавишами» (ALT+P и CTRL+P соответственно) и всплывающим меню оконного редактора, производится поиск.
Поиск ведется по столбцам, начиная с поля, на котором находится окно строкового редактора. «Листание» вверх / вниз производится автоматически, если это необходимо. Если поиск успешный, то окно строкового редактора устанавливается на поле, найденное первым; в противном случае пользователь информируется о том, что поиск неуспешен, а местоположение окна не изменяется.
Введенный последним шаблон сохраняется неизменным до тех пор, пока не будет введен новый.
Дата: 2019-05-29, просмотров: 231.