
- •1. Общая характеристика языка Си в сравнении с другими процедурными языками.
- •2. Основные типы данных, переменные и константы. Препроцессор языка Си.
- •3.Операции языка Си. Преобразование типов данных
- •4.Ввод-вывод чисел, символов и строк на консоль. Переключение ввода-вывода, работа с файлами.
- •5.Оператор ветвления, многовариантный выбор.
- •6.Операции отношения, логические операции.
- •7.Циклы и другие управляющие средства.
- •8.Функции: аргументы функции, возвращение значений, локальные переменные, нахождение адресов, указатели.
- •9.Классы памяти и область действия. Автоматические переменные. Внешние переменные. Статические переменные. Внешние статические переменные. Регистровые переменные.
- •10.Массивы и указатели. Динамические объекты. Операции с указателями.
- •11.Строковые константы, массивы символьных строк и их инициализация. Указатели и строки, ввод-вывод и обработка строк.
- •12.Определение структурных переменных. Доступ к компонентам структуры.
- •13.Объединения и перечисления. Указатели и структуры. Массив структур.
- •14. Стандартные библиотечные функции языка Си, функция генерации случайных чисел.
- •15.Динамические структуры данных (стек, список, дерево, граф).
- •16.Графический интерфейс пользователя (gui). Типы данных Win32.
- •17.События и сообщения, оконная процедура, оконный класс, цикл обработки сообщений.
- •18.Создание основного окна приложения, изменение характеристик окна.
- •19.Стандартное окно с сообщением и кнопкой «ок». Функции поддержки окон.
- •20.Обработка сообщений от клавиатуры, часто используемые сообщения.
- •21.Органы управления: кнопки, флажки, переключатели. Групповая рамка. Статический орган управления для вывода текста.
- •22.Однострочное и многострочное поле для ввода текста.
- •23.Список, раскрывающийся список, комбинированный список. Файловые операции.
- •24.Создание процесса, создание потока, рабочие функции потока, обмен сообщениями между процессами и потоками.
- •25. Передача данных с помощью сообщений и через файлы, синхронизация процессов и потоков. Создание многопоточного приложения.
- •26.Синхронные и асинхронные сообщения, посылка сообщения из приложения Windows.
- •27.Графический интерфейс устройства (cdi). Контекст устройства. Регионы и отсечение.
- •28.Файловый ввод-вывод данных средствами Win32api, файловые операции.
- •29.Режимы многозадачности, многопоточная архитектура, преимущества Windows.
- •30.Двусвязный список, операции с двусвязным списком, циклические списки.
- •31.Базовый алгоритм численного интегрирования методом прямоугольников.
- •32.Программная реализация численного интегрирования методом прямоугольников.
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');