Delphi

Xakep, номер #040, стр. 040-072-1

Как работают оконные проги

Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

Начиная с этого месяца, кодинг сильно изменится. Теперь под знаком "Delphi" я буду рассказывать про приколы и сетевой кодинг. Обе эти темы я буду чередовать, потому что журнал не резиновый и надо как-то укладываться в определенные рамки.

Статьи по Kylix исчезнут, потому что кодинг в нем практически ничем не отличается от Delphi. Единственная разница - нельзя использовать WinAPI.

Вместо Kylix появится компьютерная графика, в которой я буду рассказывать про DirectX. Но об этом подробнее читай первую статью по графике в этом номере.

Intro

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

Вперед к победе коммунизма

Итак, давай познакомимся с внутренностями твоих окошек. Для этого мы напишем шаблон, который будет использоваться во всех последующих примерах.

Запусти уже полюбившийся Delphi. Как всегда, сразу нам доступен новый проект. Так как мы будем делать минимальные демки, то нам абсолютно не нужны никакие формы, поэтому их надо удалить. Щелкни View->Project Manager. Перед тобой появится окно менеджера проектов. Выдели форму Unit1 и нажми кнопарь Remove.

Теперь выбираем из меню Project пункт View Source. Если все в норме, то в редакторе кода ты увидишь код твоего проекта. Оставляем только первую строчку "program Project1;", а все остальное удаляем и вместо этого пишем содержимое листинга 1.

А поподробнее...

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

Далее я заполняю структуру WindowClass. Эта структура используется при создании нового класса окна. Для минимального приложения нам понадобится заполнить следующие поля:

style - стиль окна;

Lpfnwndproc - сюда нужно записать указатель на процедуру, которая будет вызываться на все пользовательские или системные события;

Hinstance - описатель; это тот описатель, который мы получили в первой строчке кода;

HbrBackground - цвет фона; в принципе, он необязателен, но я решил окрасить фон системным цветом кнопок;

LpszClassName - имя создаваемого класса;

Hcursor - курсор. Сюда я загружаю стандартный курсор - стрелку.

Все, структура готова, и мы можем зарегистрировать новый класс будущего окна. Для этого я вызываю WinAPI функцию RegisterClass(WindowClass);. После этого в системе есть описание твоего будущего окна. Почему будущего? Да потому что само окно мы еще не создали. Для этого нужно еще вызвать функцию CreateWindowEx. У нее достаточно много параметров, и давай посмотрим на них поподробнее:

Содержание  Вперед на стр. 040-072-2

ttfb: 4.1711330413818 ms