Delphi

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


1. Расширенный стиль окна. Нам он параллелен, поэтому у меня первый параметр равен нулю.

2. Имя класса. Мы зарегистрировали класс 'DX', значит и здесь мы должны указать именно этот класс.

3. Имя окна. При программировании графики имя окна не нужно. Потому что окно будет полноэкранным.

4. Стиль окна. Нас интересует простейшее WS_POPUP окно.

5-8. Следующие четыре параметра - это левая, правая позиции и ширина и высота окна. Если указать все нули, то эти значения будут выбраны по умолчанию.

9. Главное окно по отношению к создаваемому. Наше окно само по себе главное, поэтому я указываю 0.

10. Меню. Для DX меню не будет.

11. Это снова описатель, полученный после вызова GetModuleHandle.

12. Параметры окна. Этот параметр используется при создании многодокументных окон, поэтому я указываю ноль.

И последняя подготовительная функция - UpdateWindow. Это простая прорисовка созданного нами окна.

Событийная модель окошек

Теперь разберемся с циклом обработки сообщений. Функция GetMessage ожидает пользовательского или системного сообщения и, как только оно наступает, возвращает true (истина). Полученное сообщение преобразуется в необходимый вид с помощью translatemessage и отправляется обработчику сообщений с помощью вызова dispatchmessage.

В каждой программе должна быть процедура обработки сообщений. Какая именно? Мы указали ее при создании класса окна в свойстве WindowClass.Lpfnwndproc. Я ее назвал WindowProc - стандартное имя, используемое по умолчанию. Сама же процедура должна выглядеть приблизительно как в листинге 1.

В процедуре-обработчике событий желательно делать вызов функции defwindowproc. Эта функция ищет в системе обработчик полученного сообщения, установленный по умолчанию. Это очень важно, чтобы тебе не пришлось самому писать то, что может сделать за тебя ОС.

После этого я сам начинаю обработку полученного сообщения. Это происходит с помощью сравнивания параметра msg со стандартными событиями. Например, если msg равно wm_destroy, то программа хочет уничтожиться, и я могу по этому событию освободить любую выделенную память.

В моем обработчике есть еще одно сравнение. Если msg равно wm_KeyDown, т.е. нажата какая-то клавиша, то я проверяю, если нажата клавиша ESC (в этом случае wpr = VK_ESCAPE), то завершаю приложение.

Disconnect

На этом можно закончить. Ты, наверно, думаешь, что все описанное мной сложно? А представь, каково любителям языка С, они именно так и программируют. Любители С++ немного более в удачном положении, но не на много.

Я понимаю, что в кодинге на WinAPI очень много глупостей, но не я писал Windows и не мне устанавливать правила. Так что придется нам с этим смириться. Написанный сегодня код - точная копия программы на языке С, только я ее написал с синтаксисом Паскаля. Ну, ничего, зато ты теперь прекрасно понимаешь, как работают внутренности прог. В любом случае тебе это пригодится.

Если ты попытаешься запустить мой пример, то не увидишь никакого окна. Это потому, что я создал его невидимым. Видимость я ему придам в статье по работе с графикой.

Назад на стр. 040-072-1  Содержание  Вперед на стр. 040-072-3