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

Выпуски журнала "Xakep"
Журнал Хакер. Содержание номера #001Журнал Хакер. Содержание номера #002Журнал Хакер. Содержание номера #003Журнал Хакер. Содержание номера #004Журнал Хакер. Содержание номера #005Журнал Хакер. Содержание номера #006Журнал Хакер. Содержание номера #007Журнал Хакер. Содержание номера #008Журнал Хакер. Содержание номера #009Журнал Хакер. Содержание номера #010Журнал Хакер. Содержание номера #011Журнал Хакер. Содержание номера #012Журнал Хакер. Содержание номера #013Журнал Хакер. Содержание номера #014Журнал Хакер. Содержание номера #015Журнал Хакер. Содержание номера #016Журнал Хакер. Содержание номера #017Журнал Хакер. Содержание номера #018Журнал Хакер. Содержание номера #019Журнал Хакер. Содержание номера #020Журнал Хакер. Содержание номера #021Журнал Хакер. Содержание номера #022Журнал Хакер. Содержание номера #023Журнал Хакер. Содержание номера #024Журнал Хакер. Содержание номера #025Журнал Хакер. Содержание номера #026Журнал Хакер. Содержание номера #027Журнал Хакер. Содержание номера #028Журнал Хакер. Содержание номера #029Журнал Хакер. Содержание номера #030Журнал Хакер. Содержание номера #031Журнал Хакер. Содержание номера #032Журнал Хакер. Содержание номера #033Журнал Хакер. Содержание номера #034Журнал Хакер. Содержание номера #035Журнал Хакер. Содержание номера #036Журнал Хакер. Содержание номера #037Журнал Хакер. Содержание номера #038Журнал Хакер. Содержание номера #039Журнал Хакер. Содержание номера #040Журнал Хакер. Содержание номера #041Журнал Хакер. Содержание номера #042Журнал Хакер. Содержание номера #043Журнал Хакер. Содержание номера #044Журнал Хакер. Содержание номера #045Журнал Хакер. Содержание номера #046Журнал Хакер. Содержание номера #047Журнал Хакер. Содержание номера #048Журнал Хакер. Содержание номера #049Журнал Хакер. Содержание номера #050Журнал Хакер. Содержание номера #051Журнал Хакер. Содержание номера #052Журнал Хакер. Содержание номера #053Журнал Хакер. Содержание номера #054Журнал Хакер. Содержание номера #055Журнал Хакер. Содержание номера #056Журнал Хакер. Содержание номера #057Журнал Хакер. Содержание номера #058Журнал Хакер. Содержание номера #059Журнал Хакер. Содержание номера #060Журнал Хакер. Содержание номера #061Журнал Хакер. Содержание номера #062Журнал Хакер. Содержание номера #063Журнал Хакер. Содержание номера #064Журнал Хакер. Содержание номера #065Журнал Хакер. Содержание номера #066Журнал Хакер. Содержание номера #067Журнал Хакер. Содержание номера #068Журнал Хакер. Содержание номера #069Журнал Хакер. Содержание номера #070Журнал Хакер. Содержание номера #071Журнал Хакер. Содержание номера #072Журнал Хакер. Содержание номера #073Журнал Хакер. Содержание номера #074Журнал Хакер. Содержание номера #075Журнал Хакер. Содержание номера #076Журнал Хакер. Содержание номера #077Журнал Хакер. Содержание номера #078Журнал Хакер. Содержание номера #079Журнал Хакер. Содержание номера #080Журнал Хакер. Содержание номера #081Журнал Хакер. Содержание номера #082Журнал Хакер. Содержание номера #083Журнал Хакер. Содержание номера #084Журнал Хакер. Содержание номера #085Журнал Хакер. Содержание номера #086Журнал Хакер. Содержание номера #087Журнал Хакер. Содержание номера #088Журнал Хакер. Содержание номера #089Журнал Хакер. Содержание номера #090Журнал Хакер. Содержание номера #091Журнал Хакер. Содержание номера #092Журнал Хакер. Содержание номера #093Журнал Хакер. Содержание номера #094Журнал Хакер. Содержание номера #095Журнал Хакер. Содержание номера #096Журнал Хакер. Содержание номера #097Журнал Хакер. Содержание номера #098Журнал Хакер. Содержание номера #099Журнал Хакер. Содержание номера #100Журнал Хакер. Содержание номера #101Журнал Хакер. Содержание номера #102Журнал Хакер. Содержание номера #103Журнал Хакер. Содержание номера #104Журнал Хакер. Содержание номера #105Журнал Хакер. Содержание номера #106Журнал Хакер. Содержание номера #107Журнал Хакер. Содержание номера #108Журнал Хакер. Содержание номера #109Журнал Хакер. Содержание номера #110Журнал Хакер. Содержание номера #111Журнал Хакер. Содержание номера #112Журнал Хакер. Содержание номера #113Журнал Хакер. Содержание номера #114