Приложения такого типа нужны, когда размер исполняемого файла является критичным. Например, в инсталяторах, деинсталяторах, самораспаковывающихся архивах
и т.п. В крайнем случае, для того чтобы посмотреть какую работу выполняет за нас vcl, и что из себя представляет windows-программа.
На самом деле все очень просто...
Для этого нам необходимо:
1. Зарегистрировать класс окна для окна главной формы.
function initapplication: boolean;
var
wcx: twndclass;
begin
//Заполняем структуру twndclass
// перерисовываем, если размер изменяется
wcx.style := cs_hredraw or cs_vredraw;
// адрес оконной процедуры
wcx.lpfnwndproc := @mainwndproc;
wcx.cbclsextra := 0;
wcx.cbwndextra := 0;
// handle to instance
wcx.hinstance := hinstance;
// загружаем стандандартную иконку
wcx.hicon := loadicon(0, idi_application);
// загружаем стандартный курсор
wcx.hcursor := loadcursor(0, idc_arrow);
// делаем светло-cерый фон
wcx.hbrbackground := color_window;
// пока нет главного меню
wcx.lpszmenuname := nil;
// имя класса окна
wcx.lpszclassname := pchar(winname);
// Регистрируем наш класс окна.
result := registerclass(wcx) <> 0;
end;
2. Написать подпрограмму обработки оконных сообщений.
function mainwndproc(window: hwnd; amessage, wparam,
lparam: longint): longint; stdcall; export;
begin
//подпрограмма обработки сообщений
case amessage of
wm_destroy: begin
postquitmessage(0);
exit;
end;
else
result := defwindowproc(window, amessage, wparam, lparam);
end;
end;
3. Создать главное окно приложения.
function initinstance: hwnd;
begin
// Создаем главное окно.
result := createwindow(
// имя класса окна
pchar(winname),
// заголовок
'small program',
// стандартный стиль окна
ws_overlappedwindow,
// стандартные горизонтальное, вертикальное положение, ширина и высота
integer(cw_usedefault),
integer(cw_usedefault),
integer(cw_usedefault),
integer(cw_usedefault),
0,//нет родительского окна
0,//нет меню
hinstance, // handle to application instance
nil); // no window-creation data
end;
4. Написать тело программы.
var
hwndmain: hwnd;
amessage: msg;
begin
if (not initapplication) then
begin
messagebox(0, 'Ошибка регистрации окна', nil, mb_ok);
exit;
end;
hwndmain := initinstance;
if (hwndmain = 0) then
begin
messagebox(0, 'Ошибка создания окна', nil, mb_ok);
exit;
end
else
begin
// Показываем окно и посылаем сообщение wm_paint оконной процедуре
showwindow(hwndmain, cmdshow);
updatewindow(hwndmain);
end;
while (getmessage(amessage, 0, 0, 0)) do
begin
//Запускаем цикл обработки сообщений
translatemessage(amessage);
dispatchmessage(amessage);
end;
halt(amessage.wparam);
end.
5. Запустить программу на исполнение.;)
Наша программа пока только может немногое - отображать форму, и закрываться после нажатия на кнопку закрытия формы... Но посмотрите на размер исполняемого
файла - он больше чем на порядок меньше созданного с использованием vcl. Кроме того теперь у нас есть скелет приложения, возможности которого мы будем расширять
в следующих выпусках.
Здесь находится полный текст программы.
program smallprg;
uses windows, messages;
const
winname = 'mainwclass';
function mainwndproc(window: hwnd; amessage, wparam,
lparam: longint): longint; stdcall; export;
begin
//подпрограмма обработки сообщений
case amessage of
wm_destroy: begin
postquitmessage(0);
exit;
end;
else
result := defwindowproc(window, amessage, wparam, lparam);
end;
end;
function initapplication: boolean;
var
wcx: twndclass;
begin
//Заполняем структуру twndclass
// перерисовываем, если размер изменяется
wcx.style := cs_hredraw or cs_vredraw;
// адрес оконной процедуры
wcx.lpfnwndproc := @mainwndproc;
wcx.cbclsextra := 0;
wcx.cbwndextra := 0;
// handle to instance
wcx.hinstance := hinstance;
// загружаем стандандартную иконку
wcx.hicon := loadicon(0, idi_application);
// загружаем стандартный курсор
wcx.hcursor := loadcursor(0, idc_arrow);
// делаем светло-cерый фон
wcx.hbrbackground := color_window;
// пока нет главного меню
wcx.lpszmenuname := nil;
// имя класса окна
wcx.lpszclassname := pchar(winname);
// Регистрируем наш класс окна.
result := registerclass(wcx) <> 0;
end;
function initinstance: hwnd;
begin
// Создаем главное окно.
result := createwindow(
// имя класса окна
pchar(winname),
// заголовок
'small program',
// стандартный стиль окна
ws_overlappedwindow,
// стандартные горизонтальное, вертикальное положение, ширина и высота
integer(cw_usedefault),
integer(cw_usedefault),
integer(cw_usedefault),
integer(cw_usedefault),
0,//нет родительского окна
0,//нет меню
hinstance, // handle to application instance
nil); // no window-creation data
end;
var
hwndmain: hwnd;
amessage: msg;
begin
if (not initapplication) then
begin
messagebox(0, 'Ошибка регистрации окна', nil, mb_ok);
exit;
end;
hwndmain := initinstance;
if (hwndmain = 0) then
begin
messagebox(0, 'Ошибка создания окна', nil, mb_ok);
exit;
end
else
begin
// Показываем окно и посылаем сообщение wm_paint оконной процедуре
showwindow(hwndmain, cmdshow);
updatewindow(hwndmain);
end;
while (getmessage(amessage, 0, 0, 0)) do
begin
//Запускаем цикл обработки сообщений
translatemessage(amessage);
dispatchmessage(amessage);
end;
halt(amessage.wparam);
end.