Методы оконной функции visual basic
79.Первый способ отображения информации в окне, использующий API-функции ядра (процедура Main: регистрация класса, создание и отображение окна приложения, цикл обработке сообщений, оконная функция). Пример.
Первый способ основан на не посредственном создании отображении главного окна приложения, получении его дескриптора и обработки сообщений, посылаемых окну ядром Windows. Этот способ включает описание класса окна, его регистрацию, отображение, а так же описание оконной функции, обрабатывающей все сообщения, посылаемые ядром Windows программе.
Каждая программа, которая самостоятельно создает главное окно приложения(первый способ), должна состоять из двух обязательных частей:•процедуры Main(«стартующий»объект), являющейся точкой входа в программу, в которой определяются атрибуты класса окна, осуществляется регистрация класса, формируется стиль окна, создается экземпляр окна в памяти, отображается окно, и наконец, запускается цикл обработки сообщений;
•оконной функции, обрабатывающей все сообщения Windows.
80.Второй способ отображения информации в окне, использующий API-функции ядра (форма Visual Basic и оконная функция). Пример.
Второй способ Вам уже знаком и отличается от первого способа лишь тем, что основана использовании стандартного окна(формы), предлагаемого средой VB. Единственное, что необходимо здесь делать, так это получать от ОС дескриптор формы(обычно он уже определен в виде свойства) или его объекта для отображения на нем графической информации, изменять, если это необходимо атрибуты окна и класса окна функциями SetWindowLong, SetClassLong.
81. Методы оконной функции.
Оконная функция Window обрабатывает сообщения, посылаемые окну ядром Windows. Имя оконной функции присваивает пользователь при регистрации класса, а вызывается она непосредственно ядром Windows. Окно всегда создается на основе класса окна, в котором должны быть описаны основные характеристики главного окна. В частности, при определении адреса оконной функции используется скрытая функция AddressOf в качестве аргумента дополнительной функции GetAddress.wc. lpfnwndproc= GetAddress(AddressOfWindow) К атрибутам класса относят: наличие и тип иконки, курсора, шаблон заполнения фона, наличие меню и ряд других параметров. Для того чтобы можно было использовать в дальнейшем созданный класс окна, его необходимо зарегистрировать в Windows вызовом API-функции RegisterClass (ClassAsWNDCLASS) AsLong Значение, отличное от нуля, возвращаемое этой функцией, означает успешное завершение операции регистрации. Константы, определяющие стиль окна, имеют префикс CS. Стили CS_VREDRAW OrCS_HREDRAW используются, если содержимое окна должно быть перерисовано при изменении размеров по вертикали и горизонтали. Чтобы окно получало сообщения о двойном нажатии кнопок мыши(константы сообщений WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK),необходимо еще установить стиль окна CS_DBLCLKS. Поле hInstanse определяет дескриптор на сегмент данных экземпляра программы или дескриптор exe-файла, что позволяет Windows запускать несколько экземпляров одной и той же программы, при использовании одного экземпляра программного кода. Поле hIcon определяет дескриптор иконки для всех окон в минимизированном состоянии, созданных на основе этого класса. Для получения дескриптора стандартной(предопределенной в системе) иконки необходимо воспользоваться функцией LoadIcon с нулевым значением первого параметра. В Windows предопределены 5 типов иконок. Поле hCursor определяет дескриптор курсора, используемого в программе. Для использования стандартного курсора в программе необходимо воспользоваться функцией LoadCursor с нулевым значением первого параметра. В Windows предопределены 12 типов курсоров. Поле hbrBackground определяет дескриптор кисти в качестве шаблона заполнения фона всех окон, созданных на основе этого класса. С помощью API-функции GetStockObject осуществляется выбор стандартного шаблона кисти, например, черного цвета:wc. Hbr Background=GetStockObject(Black_brush) Имеется способ задания цвета фона окна, используя дескриптор кисти одного из объектов Windows(окна,
рамки, заголовка и т. п.), определенный в виде константы с префиксом color_, увеличенной на единицу, например :wc. hbrBackground= COLOR_APPWORKSPACE+1
Оконная функция Wind осуществляет непосредствен-ную обработку сообщений. Первый параметр оконной функции-дескриптор окна, которому принадлежит сообщение, то есть дескриптор, возвращаемый функцией CreateWindowEx. Второй параметр-идентификатор(константа) сообщения, остальные-зависят от типа сообщения.
82.Константы сообщений при работе с мышью и клавиатурой. Программная обработка констант сообщений.
Процедура Translate Message передает структуру типа MSG обратно ядру Windows для преобразования константы сообщения, содержащей виртуальный код клавиши, в константу сообщения, содержащую физический код клавиши. Существует много кодовых таблиц, в которых одинаковым по функциональному назначению клавишам соответствуют различные физические коды. В кодировке Win-1251 символ кириллицы «А» имеет код 192, в кодировке ISO -176, а в кодировке КОИ-8 -225 (табл.18). Поэтому, чтобы не зависеть от конкретной кодовой таблицы, используемой в компьютере, применяют виртуальный код клавиш. Эту процедуру можно опустить, если Вы не работаете с клавиатурой. Например, если Вы нажали или отпустили клавишу на клавиатуре, то ядро сгенерирует сообщение структуры
MSG, в которой поле message будет содержать константу WM_KEYDOWN или WM_KEYUP, а поле wparam-код виртуальной клавиши. Перечислим некоторые коды виртуальных клавиш. VK_CONTROL –нажата клавиша CTRL;
VK_SHIFT –нажата клавиша SHIFT;
VK_MENU –нажата клавиша ALT;
VK_RETURN –нажата клавиша ENTER;
VK_BACK –нажата клавиша BACKSPACE;
VK_F1… VK_F9 –нажата клавиша из диапазона F1… F9; VK_INSERT –нажата клавиша INSERT;
VK_DELETE –нажата клавиша DELETE;
VK_SPACE –нажата клавиша SPACE;
VK_M-нажата клавиша M;
VK 1-нажата клавиша 1.
При помощи функции Translate Message константы сообщений WM_KEYDOWN и WM_KEYUP, содержа-щихся в поле message, преобразуются в константы WM_CHAR и WM_DEADCHAR, а код виртуальной клавиши, содержащийся в поле wparam, будет содержать код ANSI-клавиши. Процедура DispatchMessage выполняет диспетчеризацию сообщения, то есть вновь направляет сообщение в оконную функцию. Оконная функция Wind осуществляет непосредственную обработку сообщений. Первый параметр оконной функции-дескриптор окна, которому принадлежит сообщение, то есть дескриптор, возвращаемый функцией CreateWindowEx. Второй параметр-идентификатор (константа) сообщения, остальные-зависят от типа сообщения. Обычно wparam(3-йпараметр) содержит код сообщения(например, код виртуальной клавиши или код символа ANSI), в старшем слове параметра lparam содержится дескриптор окна, а в младшем слове-целое значение, уникальное для конкретного типа сообщения. Для ряда сообщений lparam содержит пару координат манипулятора мыши. Наша оконная функция обрабатывает всего лишь три сообщения-WM_PAINT, WM_LBUTTONUP, WM_DESTROY. Сообщение WM_PAINT позволяет отображать графическую информацию в окне и перерисовывать содержимое окна после его сворачивания. При нажатии и последующем отпускании и левой кнопки мыши генерируется сообщение WM_LBUTTONUP, которое поступает в цикл обработки сообщений оконной функции. В результате с помощью функции SendMessage генерируется сообщение к ОС Windows-WM_CLOSE, которое означает, что ОС должна закрыть окно (дескриптор ghWnd). Тоже сообщение посылается к Windows и при выборе команды Закрыть из системного меню или после нажатия клавиш ALT+F4. Определив, какому окну принадлежит сообщение, Windows генерирует ответное сообщение WM_DESTROY, которое, попав в оконную функцию, завершает процесс графического отображения информации в окне(функция EndPaint) и с помощью процедуры PostQuitMessage генерирует последнее сообщение — WM_QUIT. Получив это сообщение, функция GetMessege возвращает нулевое значение, и цикл обработки сообщений заканчивается и программа завершается. Ввод информации может происходить не только с клавиатуры, но и с использованием манипулятора мышь. При этом ядро Windows, прежде чем поместить сообщение в очередь, проверяет, не исходит ли предыдущее сообщение также от мыши, так как в большинстве случаев необходимо знать лишь конечную точку перемещения мыши. Таблица45
Константы сообщений Действие над мышью WM_MOUSEMOVE Перемещение WM_LBUTTONDOWN Нажата левая кнопка WM_LBUTTONUP Отпущена левая кнопка WM_MBUTTONDOWN Нажата средняя кнопка WM_MBUTTONUP Отпущена средняя кнопка WM_RBUTTONDOWN Нажата правая кнопка WM_RBUTTONUP Отпущена правая кнопка WM_LBUTTONDBLCLK Двойное нажатие левой кнопки WM_MBUTTONDBLCLK Двойное нажатие средней WM_RBUTTONDBLCLK Двойное нажатие правой кнопки
83.Методы SetWindowLong, SetClassLong, SetWindowPos.
Функция SetWindowLong заменяет атрибут стpуктуpы класса окна новым значением и возвращает предыдущее значение класса окна. Имеет следующие паpаметpы: hWnd-дескриптор окна; nIndex-одна из констант: GWL_EXSTYLE, GWL_STYLE, GWL_WNDPROC или положительное смещение в байтах для доступа к дополнительным четыpех байтным значениям; dwNewLong—значение атрибута замены. Функция SetClassLong (ByValhwndAsLong, ByValnIndexAsLong, ByValdwNewLongAsLong) –устанавливает в нужное поле структуры WndClass соответствующее значение и возвращает старое значение поля или ноль, если ошибка. Она является парной функцией к функции GetClassLong. Имеет следующие параметры: hWnd-дескриптор окна; nIndex-одна из