3.2 Процедура обработки сообщений

Оконная процедура определяется следующим образом:

integer function MainWndProc (hWnd, mesg, wParam, lParam).

Первым параметром является hWnd, дескриптор получающего сообщение окна. Второй параметр – число, которое идентифицирует сообщение. Параметры wParam и lParam содержат дополнительную информацию о сообщении и называются «параметрами сообщения». Конкретное значение этих параметров определяется типом сообщения.

Обработка сообщений

Оконная процедура получает сообщения от Windows. Это могут быть сообщения о вводе, переданные функцией WinMain (например, WM_KEYDOWN, WM_KEYUP, WM_MOUSEMOVE, WM_TIMER), или сообщения системы управления окнами, поступающие непосредственно от Windows в обход очереди прикладной программы или цикла обработки сообщений (например, WM_CREATE, WM_DESTROY, WM_PAINT). Каждое получаемое окном сообщение идентифицируется номером, который содержится в параметре mesg оконной процедуры. В модуле MSFWINTY.F90 Fortran PowerStation 4.0 определены именованные константы, начинающиеся с префикса WМ для каждого типа сообщений.

Обычно используется конструкция select case для определения того, какое сообщение получила оконная процедура и как его обрабатывать. Если оконная процедура обрабатывает сообщение, то ее возвращаемым значением должен быть 0. Все сообщения, не обрабатываемые оконной процедурой, должны передаваться функции Windows, которая называется DefWindowProc. Значение, возвращаемое этой функцией, должно быть возвращаемым значением оконной процедуры.

Первое сообщение, которое получает оконная процедура – это WМ_СRЕАТЕ. Когда Windows обрабатывает функцию СreateWindowEx в WinMain, она вызывает MainWndProc с дескриптором окна в качестве первого параметра и с WМ_СRЕАТЕ в качестве второго. MainWndProc обрабатывает сообщение WМ_СRЕАТЕ и передает управление обратно в Windows, которая, в свою очередь, возвращается обратно в WinMain.

Следующим обрабатывается сообщение WM_SIZE. Определяются размеры рабочей области, панели инструментов и панели состояния. Windows посылает в оконную процедуру сообщение WM_SIZE при любом изменении размеров окна. Переменная lParam, переданная в оконную процедуру, содержит ширину рабочей области в младшем слове и высоту в старшем слове.

Сообщения WM_PARENTNOTIFY и WM_RBUTTONDOWN обрабатывают сообщения, поступающие соответственно от панели инструментов и всплывающего меню.

В программе необходимо обрабатывать символы клавиатуры, поэтому она должна обрабатывать сообщения WM_CHAR. Параметр lParam, передаваемый в оконную процедуру как часть символьного сообщения, является таким же, как параметр lParam аппаратного сообщения клавиатуры, из которого сгенерировано символьное сообщение. Параметр wParam – это код символа ASCII. Особым образом обрабатываются клавиши <Backspace>, <Tab> и <Enter>. Все остальные символы обрабатываются похожим образом.

Сообщение WM_KEYDOWN используется для определения нажатой клавиши или комбинации клавиш.

При щелчке мыши на разрешенном пункте меню генерируется сообщение WM_COMMAND (при выборе недоступного или запрещенного пункта меню данное сообщение не генерируется).

Сообщение WМ_РАINТ сообщает программе, что часть или вся рабочая область окна недействительна, и ее следует перерисовать.

При создании окна недействительна вся рабочая зона, поскольку программа еще ничего в окне не нарисовала. При изменении размера окна рабочая область также становится недействительной и содержимое рабочей области не сохраняется. В графической среде это привело бы к тому, что пришлось бы хранить слишком много данных. Вместо этого Windows делает недействительным все окно. Оконная процедура получает сообщение WМ_РАINТ и восстанавливает содержимое окна.

При перемещении окон так, что они перекрываются, Windows не сохраняет ту часть окна, которая закрывается другим окном. Когда эта часть окна позже открывается, Windows помечает его как недействительное. Оконная процедура получает сообщение WМ_РАINТ для восстановления содержимого окна.

Последним сообщением является сообщение WМ_DESTROY. Это сообщение показывает, что Windows находится в процессе ликвидации окна в ответ на полученную от пользователя команду. Программа стандартно реагирует на это сообщение, вызывая PostQuitMessage (0). Эта функция помещает сообщение WМ_QUIT в очередь сообщений программы. Когда функция GetMessage получает это сообщение, работа цикла обработки сообщений прерывается и программа заканчивает свою работу, выходя в систему.


3.3 Модальный и немодальный диалог

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

Окно диалога обычно имеет вид всплывающего окна с разнообразными дочерними окнами элементов управления внутри. Размер и расположение этих дочерних окон задается в шаблона окна диалога в файле описания ресурсов программы. Windows 95 обеспечивает возможность создания всплывающих окон диалога и дочерних окон элементов управления в нем, а также возможность обработки оконной процедурой сообщений окна диалога. При использовании дочерних окон элементов управления, Windows берет на себя решение многих задач (например, управляет всей логикой переключения фокуса ввода между дочерними окнами элементов управления в окне диалога).

Оконная процедура окна диалога – это функция многократного вызова, которую вызывает Windows, когда она имеет сообщение для окна диалога. Как правило, внутри процедуры диалога не реализуется слишком много функций. Исключение составляют лишь инициализация дочерних окон элементов управления при создании окна диалога, обработка сообщений от дочерних окон элементов управления и завершение работы с окном диалога (т.е. обрабатываются сообщения WM_INITDIALOG, WM_COMMAND, WM_DESTROY). Оконная процедура окна диалога возвращает FALSE (0), если она не обрабатывает сообщение, или TRUE (ненулевое значение), если обрабатывает.

Рассмотрим отдельно модальные и немодальные окна диалога.

Модальное окно диалога.

Модальное окно диалога – это окно, которое индицирует информацию и запрос на ввод от пользователя. Оно называется модальным, поскольку делает родительское окно временно недоступным и заставляет пользователя закончить запрашиваемые действия перед возвратом управления родительскому окну, т.е. нельзя переключаться между окном диалога и другими окнами программы. Но, несмотря на наличие на экране окна диалога, пользователь может переключиться на другие программы. Некоторые окна диалога (называемые системными модальными окнами – system modal) этого делать не позволяют. Системное модальное окно диалога вынуждает пользователя, перед тем как он получит возможность сделать что-либо другое в Windows, завершить работу с ним.

Модальное окно диалога запускает свой собственный цикл обработки сообщений из очереди прикладной программы без возврата в функцию WinMain.

Для создания модального окна диалога программа вызывает функцию DialogBox (могут также использоваться функции DialogBoxIndirect, DialogBoxParam, DialogBoxIndirectParam):

nResult = DialogBox (hInstance, lpTemplate, hWndParent, lpDialogFunc).

nResult – переменная, принимающая значение -1 при неуспешном завершении функции, в обратном случае возвращаемое значение – параметр nResult функции EndDialog, которая завершает работу модального окна диалога;

hInstance – дескриптор экземпляра;

lpTemplate – этот параметр идентифицирует шаблон окна диалога;

hWndParent – дескриптор родительского окна модального окна диалога;

lpDialogFunc – адрес процедуры диалога.

Работа модального окна диалога завершается с помощью функции EndDialog:

bret = EndDialog (hDlg, nResult).

nResult – определяет значение, которое будет возвращено приложению от функции DialogBox, создавшей диалоговое окно;

hDlg – дескриптор диалогового окна.

Логическая переменная bret принимает значение TRUE или FALSE соответственно при успешном или неуспешном завершении.

Windows не возвращает управление родительскому окну до тех пор, пока не вызвана функция EndDialog.

Немодальное окно диалога.

В отличие от модального окна диалога, немодальное окно диалога не делает недоступным родительское окно, позволяя тем самым пользователю переключаться между окном диалога и окном, в котором оно было создано, а также между окном диалога и остальными программами.

Немодальное окно диалога получает информацию через цикл обработки сообщений функции WinMain (см. п. 3.1).

Для создания немодального окна используется функция CreateDialog (могут также использоваться функции CreateDialogIndirect, CreateDialogParam, CreateDialogIndirectParam):

hDlgModeLess = CreateDialog (hInstance, lpTemplate, &

hWndParent, lpDialogFunc).

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

Для закрытия немодального окна диалога используется функция DestroyWindow:

bret = DestroyWindow (hDlg).

hDlg – дескриптор диалогового окна (локальная переменная, используемая в оконной процедуре окна диалога).

Функция возвращает значение bret, равное TRUE или FALSE соответственно при успешном или неуспешном завершении. После вызова функции DestroyWindow глобальная переменная, содержащая дескриптор немодального окна диалога, должна быть установлена в ноль.

К немодальным окнам диалога относятся окна панели состояния и панели инструментов, используемые в КП Компоновщик. Эти два окна всегда находятся на экране.


Информация о работе «Расчет и анализ потерь активной мощности»
Раздел: Информатика, программирование
Количество знаков с пробелами: 139305
Количество таблиц: 0
Количество изображений: 14

Похожие работы

Скачать
179075
32
127

... (от передвижения источников загрязнения) 1180,48 Всего за год: 211845,25 10. Совершенствование системы электроснабжения подземных потребителей шахты Расчет схемы электроснабжения ЦПП до участка и выбор фазокомпенсирующих устройств Основными задачами эксплуатации современных систем электроснабжения горных предприятий являются правильное определение электриче­ ...

Скачать
118979
22
26

... luc – программа используется для разложения матрицы на треугольные сомножители; rluc – программа, которая отвечает за решение системы уравнений. 4. Разработка адаптивной системы управления режимами электропотребления 4.1 Функции автоматизированной системы Сбор, накопление и передача информации, характеризующей режим электропотребления комбината (информация о нагрузках). Сбор, накопление ...

Скачать
138956
15
3

... Еловка ТМН-2500/35 ±6×1,5% Ужурсовхоз ТМН-4000/35 ±6×1,5% 2. Характеристика задачи расчета, анализа и оптимизации режимов РЭС 110-35 кВ по напряжению, реактивной мощности и коэффициентам трансформации Питающие электрические сети напряжением 110 кВ, ...

Скачать
67860
2
2

... линиям относят линии, для которых верхняя граница интервала неопределенности потерь превышает установленную норму (например, 5%). 3. Программы расчета потерь электроэнергии в распределительных электрических сетях 3.1 Необходимость расчета технических потерь электроэнергии В настоящее время во многих энергосистемах России потери в сетях растут даже при уменьшении энергопотребления. При ...

0 комментариев


Наверх