Смекни!
smekni.com

Расчет и анализ потерь активной мощности (стр. 13 из 16)

Создание оконного редактора.

Для создания окна оконного редактора вызывается функция 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_HSCROLL). Как говорилось ранее, оконный редактор может получать сообщение 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, Kol, NumbRowTitr, LengStr),

в которой, исходя из нового размера рабочей области оконного редактора, пересчитываются переменные MaxRow, MaxCol, и анализируется, нужно ли отображать полосы прокрутки. Далее в оконной процедуре рассчитывается новое значение переменной jsRight, а затем, в случае необходимости, корректируется положение окна строкового редактора (при уменьшении размеров рабочей области оконного редактора) или содержимое массива Bufv (при увеличении размеров рабочей области оконного редактора).

При получении сообщения WM_DESTROY обнуляется переменная hWch, уничтожается окно строкового редактора и закрывается окно оконного редактора.

Рассмотрим более подробно подпрограмму corUnsch.

В случае, если код возврата отличен от нуля, сначала в символьный массив Bufv, а затем и в Text, заносятся изменения, произведенные в строковом редакторе. Затем вызывается функция MoveEditWithMouse:

ret = MoveEditWithMouse (Par, Kol),

Если в результате щелчка левой кнопкой мыши или действия полос прокрутки окно строкового редактора необходимо переместить, функция возвращает положительное значение, в зависимости от которого вызывается функция Metka4 или Metka5, а затем Metka6. Если в результате действия полосы прокрутки требуется изменить содержимое оконного редактора, то пересчитываются границы отображаемого текста базы данных in, iv, в соответствии с ними заполняется массив Bufv, а затем вызываются функции Metka4, Metka5, Metka6. Если функция MoveEditWithMouse возвращает 0, т.е. перемещение окна не производилось ни мышью, ни полосами прокрутки, то вызывается подпрограмма управления окном contw, и в случае перемещения строкового редактора с помощью клавиатуры или всплывающего меню (влево / вправо, вверх / вниз, в начало / конец строки, в начало / конец базы данных, листание вверх / вниз) пересчитывается положение строкового и оконного редакторов. В том случае, если перемещение строкового редактора не производилось, проверяется, был ли запрос на поиск по шаблону.

Функция Metka4 выполняет пересчет переменных jsLeft, jsRight в зависимости от того, в каком столбце (js) находится строковый редактор. Пересчитывается также его горизонтальная координата XEdit.

Функция Metka5 выполняет пересчет вертикальной координаты строкового редактора YEdit, а в символьную строку Bufed помещается редактируемый текст.

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

Второй пункт алгоритма реализуется следующим образом.

Оконная процедура оконного редактора обрабатывает пять сообщений мыши: 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.