б) дочерние окна управления панели инструментов посылают процедуре диалогового окна сообщения WM_COMMAND. Параметры этого сообщения содержат идентификатор дочернего окна (младшее слово параметра wParam), код уведомления (старшее слово wParam) и дескриптор дочернего окна управления, пославшего сообщение (lParam). В рассматриваемой программе дочерними окнами управления панели инструментов являются окно ввода шаблона поиска и радиокнопки. Процедура диалога при получении сообщения WM_COMMAND определяет по младшему слову параметра wParam идентификатор дочернего окна, от которого пришло сообщение, и выполняет соответствующие действия.
Выходные параметры панели инструментов.
Выходными параметрами панели инструментов являются сообщения активному на данный момент дочернему окну или панели состояния.
Сообщение активному дочернему окну посылается в случае, если левой кнопкой мыши выбран какой-либо орган управления на панели инструментов. Щелчок правой кнопкой мыши на любом органе управления (исключая окно ввода шаблона поиска) заставляет программу вывести в панель состояния текст, поясняющий предназначение выбранного органа управления.
Алгоритм, реализующий вышесказанное, выглядит следующим образом.
1. Нажата кнопка мыши?
Если нажата правая кнопка:
а) определить выбранный на панели инструментов орган управления;
б) вывести соответствующее выбранному органу управления текстовое пояснение в предназначенное для этого поле панели состояния.
Если дочернее окно активно и нажата левая кнопка:
а) определить выбранный на панели инструментов орган управления;
б) отправить активному дочернему окну сообщение, содержащее идентификатор выбранного органа управления.
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. Вид строкового редактора
Входные параметры строкового редактора.