2. Продолжить выполнение программы.
Приведенный алгоритм требует некоторых пояснений.
Каждый раз при щелчке правой или левой кнопкой мыши над рабочей областью панели инструментов оконной процедуре главного окна посылается сообщение WM_PARENTNOTIFY, содержащее в своих параметрах следующую информацию:
à идентификатор панели инструментов;
à какая именно кнопка мыши нажата;
à координаты курсора в момент нажатия.
Оконная процедура при обработке этого сообщения вызывает последовательно две подпрограммы – HelpPnUpr и (при условии, что дочернее окно активно) GetIdPnUpr, в которых и реализуется первый шаг алгоритма.
Когда дочернему окну посылается сообщение на поиск по шаблону, оно, в свою очередь, посылает сообщение IDOK панели инструментов для насильственного чтения шаблона.
По окончании работы подпрограмм возобновляется выполнение цикла обработки сообщений.
В рассматриваемой программе процедура диалога панели инструментов и указанные подпрограммы объединены в одном модуле, что позволяет рассматривать панель инструментов как «черный ящик» (объект). «Черный ящик» получает некоторые сообщения и определенным образом на них реагирует (рис. 3.3).
Рис. 3.3. Панель инструментов
Панель инструментов отображается на поверхности главного окна все время и уничтожается только по завершении работы.
3.5 Панель состояния (строка состояния)
Панель состояния предназначена для вывода на экран необходимой пользователю информации.
Панель состояния представляет собой немодальное окно диалога, которое выводится в нижнюю часть главного (родительского) окна. Размер и местоположение панели устанавливаются с помощью функции 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 содержат дополнительную информацию о сообщении.
Панель состояния отображается на поверхности главного окна все время работы программы и уничтожается только по завершении работы.
3.6 Строковый редактор
Строковый редактор предназначен для отображения и редактирования текстовых данных.
Строковый редактор является дочерним окном оконного редактора и выводится на его рабочую поверхность. Размер и местоположение строкового редактора устанавливаются с помощью функции 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) в символах;
à Poz – положение каретки (число символов) от левого края окна;
à Cod – главный код нажатой клавиши;
à Sccod – информационный код нажатой клавиши;
à Codv – код возврата (0‑нет коррекций; 1‑есть коррекция).
Все переменные, кроме Bufed, – целочисленные.
Первый пункт алгоритма реализуется следующим образом.
После создания окна строкового редактора, но перед его отображением, оконная процедура получает сообщение WM_CREATE. При его обработке обнуляются переменные Cod, Sccod, Codv. Задаются шрифт и цвет выводимого в окно текста. Окно получает фокус ввода. Вывод редактируемого текста, т.е. содержимого Bufed, происходит при получении сообщения WM_PAINT и осуществляется функцией TextOut:
bret = TextOut (hdc, nXStart, nYStart, lpString, cbString),
где: bret – логическая переменная, принимающая значение TRUE или FALSE соответственно при успешном или неуспешном завершении функции; hdc – дескриптор контекста устройства, на которое выводится текст; nXStart и nYStart – координаты начальной позиции вывода текста; lpString – указатель на символьную строку, которая содержит текст; cbString – количество символов в этой строке.
Затем каретка устанавливается на позицию, определяемую переменной Poz (если каретка отсутствует, она предварительно создается и отображается).
При получении сообщения 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_F5) – происходит удаление текста слева от каретки;
à клавиша «F6» (VK_F6) – происходит удаление текста справа от каретки;
à клавиша «F7» (VK_F7) – происходит удаление всего текста.
При изменении редактируемого текста код возврата принимает значение, равное 1, а оконная процедура строкового редактора получает сообщение WM_PAINT путем вызова функции InvalidateRect.
Третий пункт алгоритма.
При получении оконной процедурой строкового редактора сообщения WM_LBUTTONDOWN определяются координаты курсора мыши и каретка перемещается в позицию (с учетом ширины символов), соответствующую местоположению курсора мыши.
При получении оконной процедурой строкового редактора сообщения WM_RBUTTONDOWN на экран выводится всплывающее меню, вид которого представлен на рис. 3.6.
Рис. 3.6. Всплывающее меню строкового редактора
При щелчке левой кнопкой мыши на к.-л. пункте всплывающего меню оконной процедуре строкового редактора посылается сообщение WM_COMMAND, содержащее в младшем слове параметра wParam идентификатор выбранного пункта меню. Переменной sccod присваивается значение идентификатора выбранного пункта меню и вызывается подпрограмма edit.
Двойной щелчок левой кнопкой мыши на рабочей области окна строкового редактора порождает сообщение WM_LBUTTONDBLCLK. При получении этого сообщения оконная процедура строкового редактора «переправляет» его родительскому окну, т.е. оконному редактору, где оно и обрабатывается.
В рассматриваемой программе оконная процедура строкового редактора и подпрограмма edit объединены в одном модуле, что позволяет рассматривать строковый редактор как «черный ящик». «Черный ящик» получает некоторые сообщения и определенным образом на них реагирует (рис. 3.7).
Рис. 3.7. Строковый редактор
Строковый редактор отображается на поверхности оконного редактора все время и уничтожается только по завершении его работы.
... (от передвижения источников загрязнения) 1180,48 Всего за год: 211845,25 10. Совершенствование системы электроснабжения подземных потребителей шахты Расчет схемы электроснабжения ЦПП до участка и выбор фазокомпенсирующих устройств Основными задачами эксплуатации современных систем электроснабжения горных предприятий являются правильное определение электриче ...
... luc – программа используется для разложения матрицы на треугольные сомножители; rluc – программа, которая отвечает за решение системы уравнений. 4. Разработка адаптивной системы управления режимами электропотребления 4.1 Функции автоматизированной системы Сбор, накопление и передача информации, характеризующей режим электропотребления комбината (информация о нагрузках). Сбор, накопление ...
... Еловка ТМН-2500/35 ±6×1,5% Ужурсовхоз ТМН-4000/35 ±6×1,5% 2. Характеристика задачи расчета, анализа и оптимизации режимов РЭС 110-35 кВ по напряжению, реактивной мощности и коэффициентам трансформации Питающие электрические сети напряжением 110 кВ, ...
... линиям относят линии, для которых верхняя граница интервала неопределенности потерь превышает установленную норму (например, 5%). 3. Программы расчета потерь электроэнергии в распределительных электрических сетях 3.1 Необходимость расчета технических потерь электроэнергии В настоящее время во многих энергосистемах России потери в сетях растут даже при уменьшении энергопотребления. При ...
0 комментариев