Написание программ на чистом WinAPI.
Написание программ на чистом WinAPI.
Написание программ на чистом WinAPI. Напишем программу, которая не будет пользоваться vcl, а будет использовать вызовы функций windows api. Приложения такого типа нужны, когда размер исполняемого файла является критичным. Например, в инсталяторах, деинсталяторах, самораспаковывающихся архивах и т.п. В крайнем случае, для того чтобы посмотреть какую работу выполняет за нас 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.