Теперь обратимся к нашему проекту на Delphi. Посмотрим, что записано в файлах Unitl.pas и Projectl. dpr. Текст файла Unitl.pas приводится ниже (листинг 2.1).
...
Листинг 2.1.
Содержимое Unitl.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Обратите внимание на секцию uses. Здесь можно увидеть подключение девяти модулей, объявление собственно класса формы TForml, а также строку, указывающую компилятору на использование файла ресурсов. Все модули, кроме первых двух, – это уже труды компании Borland, облегчающие жизнь простым программистам. Модуль такого же рода используется и в файле Pro j ectl. dpr (листинг 2.2).
...
Листинг
2.2. Содержимое файла Project1.dpr
program Project1;
uses
Forms,
Unit1 in \'Unit1.pas\' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Теперь обратим внимание на модули Windows и Messages. В первом определены константы, структуры данных, необходимые для работы с функциями Windows API, и, конечно же, объявлены импортируемые из системных библиотек API-функции. В модуле Messages можно найти определения констант и структур для работы с Windows-сообщениями (об этом в подразд. «Реакция на события элементов управления» разд. 2.3).
Собственно, этих двух модулей должно хватить для того, чтобы реализовать оконное приложение, правда, использующее только стандартные функции WindowsAPI, стандартные элементы управления. В листинге 2.3 приведен пример элементарного Windows-приложения. Главное, на что сейчас стоит обратить внимание, – это размер приложения: всего 15 Кбайт.
...
Листинг 2.3.
Элементарное приложение
program WinAPI;
uses
Windows, Messages;
{$R *.res}
begin
MessageBox(0, \'This is a test\', \'Little application\', MB_OK);
end.
Зачастую неоправданно полностью отказываться от классов, реализованных Borland. Но для чистоты эксперимента в этой главе рассмотрим радикальные примеры, построенные на использовании только Windows API.
2.2. Создание окна вручную
Раз уж речь зашла о приложениях с оконным интерфейсом, то самое время приступить к его реализации средствами Windows API. Итак, чтобы создать и заставить работать окно приложения, нужно выполнить следующие операции:
1. Зарегистрировать класс окна с использованием функции RegisterClass или RegisterClassEx.
2. Создать экземпляр окна зарегистрированного ранее класса.
3. Организовать обработку сообщений, поступающих в очередь сообщений.
Пример того, как можно организовать регистрацию класса окна, приведен в листинге 2.4.
...
Листинг 2.4.
Регистрация класса окна
function RegisterWindow():Boolean;
var
wcx: WNDCLASSEX;
begin
ZeroMemory(Addr(wcx), SizeOf(wcx));
//Формирование информации о классе окна
wcx.cbSize := SizeOf(wcx);
wcx.hInstance := GetModuleHandle(nil);
wcx.hIcon := LoadIcon(0, IDI_ASTERISK); //Стандартный значок
wcx.hIconSm := wcx.hIcon;
wcx.hCursor := LoadCursor(0, IDC_ARROW); //Стандартный указатель
wcx.hbrBackground := GetStockObject(WHITE_BRUSH); //Серый
//цвет фона
wcx.style := 0;
//..самые важные параметры
wcx.lpszClassName := \'MyWindowClass\ //Название класса
wcx.lpfnWndProc := Addr(WindowFunc); //Адрес функции
//обработки сообщений
//Регистрация класса окна
RegisterWindow := RegisterClassEx(wcx) <> 0;
end;
Здесь существенным моментом является обязательное заполнение структуры WNDCLASSEX информацией о классе окна. Самой необычной вам должна показаться следующая строка:
...
wcx.lpfnWndProc := Addr(WindowFunc); //Адрес функции обработки сообщений
Здесь мы сохранили адрес функции WindowFunc (листинг 2.5) – обработчик оконных сообщений (называемый также оконной процедурой). После вызова функции RegisterClassEx система запомнит этот адрес и будет вызывать нашу функцию-обработчик каждый раз при необходимости обработать сообщение, пришедшее окну. Простейшая реализация функции WindowFunc приводится в листинге 2.5.
...
Листинг 2.5.
Функция обработки сообщений
//Функция обработки сообщений
function WindowFunc(hWnd:HWND; msg:UINT; wParam:WPARAM;
lParam:LPARAM):LRESULT; stdcall;
var
Читать дальше
Конец ознакомительного отрывка
Купить книгу