Delphi. Трюки и эффекты - [13]
Листинг
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
ps: PAINTSTRUCT;
begin
case msg of
WM_CLOSE:
if (hWnd = hMainWnd) then
PostQuitMessage(0); //При закрытии окна – выход
WM_PAINT:
begin
//Перерисовка содержимого окна
BeginPaint(hWnd, ps);
TextOut(ps.hdc, 10, 10, \'Текст в окне\', 12);
EndPaint(hWnd, ps);
end;
else
begin
//Обработка по умолчанию
WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);
Exit;
end;
end;
WindowFunc := S_OK; //Сообщение обработано
end;
В этой функции реализована обработка сообщения WMPAINT – запроса на перерисовку содержимого окна. Обработка сообщения WMCLOSE предусмотрена для того, чтобы при закрытии главного окна происходил выход из приложения. Для всех остальных сообщений выполняется обработка по умолчанию.
Обратите особое внимание на прототип этой функции: типы возвращаемых значений, типы параметров и способ вызова функции должны быть именно такими, как в листинге 2.5. Возвращаемое значение зависит от конкретного сообщения. Чаще всего это SOK (константа, равная 0) в случае успешной обработки сообщения.
Далее в листинге 2.6 приводится часть программы, собственно использующая регистрацию, создание окна, а также организующая обработку сообщений для созданного окна.
Листинг 2.6.
Регистрация и создание окна. Цикл обработки сообщений
program Window;
uses
Windows, Messages;
{$R *.res}
var
hMainWnd: HWND;
mess: MSG;
…
begin
//Создание окна
if not RegisterWindow() then Exit;
hMainWnd := CreateWindow(
\'MyWindowClass\', //Имя класса окна
\'Главное окно\', //Заголовок окна
WS_VISIBLE or WS_OVERLAPPEDWINDOW,//Стиль окна
//(перекрывающееся, видимое)
CW_USEDEFAULT, //Координата X по умолчанию
CW_USEDEFAULT, //Координата Y по умолчанию
CW_USEDEFAULT, //Ширина по умолчанию
CW_USEDEFAULT, //Высота по умолчанию
HWND(nil), //Нет родительского окна
HMENU(nil), //Нет меню
Данная книга предназначена для пользователей Microsoft Excel и содержит описание приемов и методов работы, которые из-за своей специфичности недостаточно представлены (либо вообще не представлены) в пользовательской, справочной и иной соответствующей документации. Изучение приведенных в книге примеров позволит читателю открыть для себя не известные ранее возможности Excel. Предлагаемый материал легко усваивается благодаря тому, что излагается доступным и понятным языком.
В книге кратко и просто описывается язык HTML. Прочитав ее, вы научитесь создавать собственные веб-страницы, причем не только простые, но и содержащие таблицы, видео и звук. Более гибко оформить веб-страницы вам поможет рассмотренная в книге технология CSS. А при желании вы сможете сделать веб-страницы динамичными с помощью сценариев JavaScript: описание этого языка вместе с кратким описанием DOM (объектной модели документа) также приведено в этой книге. В последних главах рассматривается пример создания небольшого сайта с использованием всех рассмотренных в книге технологий, а также освещаются основные вопросы публикации сайта в сети Интернет.Приведенные в книге коды можно найти на сайте www.piter.com.
Данная книга – подробнейшее руководство, посвященное тому, как сделать «свое кино» в программе Pinnacle Studio Plus 11. Это приложение предназначено для домашнего видеомонтажа и отличается простотой в освоении и дружественным интерфейсом. В издании описаны все возможности программы, на примерах рассмотрено, как использовать фильтры и спецэффекты, как захватывать видеоматериал, монтировать видео и звук и как записывать готовый фильм на различные носители, в том числе и на DVD.Книга будет полезна новичкам, осваивающим Pinnacle Studio Plus 11, и опытным пользователям.