Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по информатике.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
127.94 Кб
Скачать

18.Создание основного окна приложения, изменение характеристик окна.

Определение нового типа и создание его экземпляра в InitMainWindow - это все, что требуется для определения нового типа основного окна для TMyProgram. Объект приложения вызывает методы для создания интерфейсного элемента окна (Create) и вывода его на экран (Show). Вам почти никогда не потребуется использовать эти методы непосредственно. Обычно они вызываются при вызове метода MakeWindow объекта приложения.

Однако TStepWindow не определяет новых видов поведения, отличных от тех, которые наследуются от TWindow и TWindowObject. Другими словами, программа Step не становится более интересной. Такие виды поведения будут добавлены в следующем разделе.

// Создание основного окна.

hwndMain = CreateWindowEx(

0,// расширения стилей нет

"MainWClass",// имя класса

"Основное окно",// имя окна

WS_OVERLAPPEDWINDOW | // перекрывающее окно

WS_HSCROLL | // горизонтальная линейка прокрутки

WS_VSCROLL,// вертикальная линейка прокрутки

CW_USEDEFAULT,// горизонтальная позиция по умолчанию

CW_USEDEFAULT,// вертикальная позиция по умолчанию

CW_USEDEFAULT,// ширина по умолчанию

CW_USEDEFAULT,// высота по умолчанию

(HWND) NULL,// окно не родительское или

// имеющее в собственности окна

(HMENU) NULL,// используемый класс меню

hinstance,// дескриптор экземпляра

NULL);// нет данных создания окна

if (!hwndMain)

return FALSE;

// Показывает окно, использующее флажок, определенный программой,

// которая запускает прикладную программу и передает в приложение

// сообщение WM_PAINT.

ShowWindow(hwndMain, SW_SHOWDEFAULT);

UpdateWindow(hwndMain);

19.Стандартное окно с сообщением и кнопкой «ок». Функции поддержки окон.

Простейшее диалоговое окно – это окно сообщения. Здесь присутствует только текст сообщения и кнопка «Ок». Нажав кнопку «Ок», Вы даёте понять Windows, что прочитали сообщение. И только после этого окно сообщения закрывается и перестаёт блокировать то окно, с которым мы работали до появления сообщения на экране.

Содержимое окна мы можем перечитать по команде «Insert+B». А для системного курсора здесь есть только один объект. Это кнопка «Ок». И никакие нажатия клавиши табуляции и стрелок не могут сдвинуть курсор с места. Мы можем только нажать «Пробел» или «Enter». Правда, можно ещё нажать «Escape» или «Alt+F4» для закрытия окна. Но это может и не сработать.

20.Обработка сообщений от клавиатуры, часто используемые сообщения.

Существует несколько способов обработки сообщений от клавиатуры, каждый метод пригоден для той или иной ситуации. Рассмотрим самые основные и распространенные методы обработки сообщений клавиатуры.

1. Обработка сообщений клавиатуры, посылаемых вашему приложению.

Применяется когда, нужно обрабатывать сообщения клавиатуры и фокус ввода у вашего приложения. Есть несколько способов, рассмотрим два из них.

Первый способ реализуется довольно просто: у формы устанавливаем свойство keypreview в true и обрабатываем событие onkeypress. К примеру, так:

procedure tform1.formkeypress(sender: tobject; var key: char);

begin

if key = '1' then beep; //если нажата клавиша 1 выдать звук в системный динамик

end;

Примечание: не всегда звук будет выдаваться в системный динамик, иногда он выдается в колонки.

Второй вариант, перехват события onmessage объекта application:

Для начала создадим и пропишем свой обработчик перехватываемых событий:

private

//процедура для перехвата событий onmessage обьекта application

procedure appmessage(var msg: tmsg; var handled: boolean);

procedure tform1.appmessage(var msg: tmsg; var handled: boolean);

begin

end;

При запуске приложения (событие формы oncreate) передаем обработку события onmessage, нашей процедуре:

procedure tform1.formcreate(sender: tobject);

begin

application.onmessage := appmessage;

end;

Теперь при возникновении любого события onmessage, мы сможем его перехватить и обработать в процедуре appmessage:

appmessage(

var msg: tmsg; //посылаемое сообщение

var handled: boolean //определяет будет ли событие доходить до компонента

//если handled = true событие до компонента не дойдет

);

Примечание: под фразами «дойдет/не дайдет до компонента» подразумевается, то, что когда windows посылает сообщение нашей программе, его должен принять тот компонент, у которого в данный момент фокус ввода. Если мы поставим handled = true, то компонент, которому предназначалось это событие, его не получит.

Остается лишь написать обработчик:

procedure tform1.appmessage(var msg: tmsg; var handled: boolean);

begin

if msg.message = wm_keydown //если нажата кнопка (кнопка удерживается), то

then begin

memo1.lines.add(char(msg.wparam)); //добавляем в memo нажатую клавишу

handled := false; //сообщение дальше этого обработчика ПОЙДЕТ

end;

end;

wm_keydown – событие возникает в момент нажатия и удержания кнопки. Так же можно применить:

wm_keyup - событие возникает в момент отпускания кнопки, wm_keyfirst и др.

2. Регистрация в системе «горячих» клавиш (hotkey).

Применяется тогда, когда нужно реагировать на нажатие, какой-либо клавиши (комбинации клавиш), в не зависимости от того у какого приложении

я в данный момент фокус ввода. Этот способ применяют для небольшого кол-ва клавиш, на которые должно реагировать ваше приложение. Для реализации этого метода в системе регистрируется «горячая» клавиша, после чего система будет посылать сообщение приложению, каждый раз, как будет нажата зарегистрированная клавиша. Регистрация клавиши происходит функцией registerhotkey

function registerhotkey(

hwnd: hwnd; // окно, которому посылается сообщение с «горячей» клавишей

id: integer; // идентификатор "горячей" клавиши

fsmodifiers, // флажки модификации клавиш

vk: uint // код виртуальной клавиши

): bool;

fsmodifiers может быть комбинацией следующих значений:

mod_alt - Любая клавиша alt должна удерживаться нажатой.

mod_control - Любая клавиша ctrl должна удерживаться нажатой.

mod_shift - Любая клавиша shift должна удерживаться нажатой

mod_win - Любая клавиша windows удерживалась нажатой.

Примечание: в параметре fsmodifiers, приведенные выше клавиши можно комбинировать обыкновенным сложением либо оператором or. К примеру: mod_alt or mod_control или mod_alt + mod_control.

Освобождение «горячей» клавиши выполняется функцией unregisterhotkey

function unregisterhotkey(

hwnd: hwnd; // окно, которому посылается сообщение с «горячей» клавишей

id: integer // идентификатор "горячей" клавиши

): bool;

посылаемое сообщение программе при нажатии «горячей» клавиши: wm_hotkey

twmhotkey = packed record

msg: cardinal;

hotkey: longint; // код виртуальной клавиши

unused: longint; // в младшем бите содержаться флажки модификаторы клавиш

// (описаны выше: параметр fsmodifiers функции registerhotkey)

//в старшем бите содержится код виртуальной клавиши

result: longint; //возвращает ноль в случае успеха

end;

Рассмотрим это на примере.

Создадим новый проект и поместим на форму memo, после чего надо создать и прописать принимаемое нами сообщение:

private

procedure wmhotkey(var msg: twmhotkey); message wm_hotkey;

procedure tform1.wmhotkey(var msg: twmhotkey);

begin

end;

Создадим «горячую клавишу» объявив ее в глобальных константах:

const

hotkey1 = ord('r');