Делать ночью нечего, поэтому попробую немного рассказать о программировании приложений на WinAPI (вы не знаете что такое WinAPI? тогда поищите на форуме или в интернете). Вы спросите, почему на WinAPI? Да потому что это самый лучший способ создать безглючное приложение (разве что глюки могут быть по вине криворукости программиста) и которое будет иметь минимальный размер (в десятки раз меньше чем если бы мы писали на VCL). Кстати, предполагается что вы хотя бы знакомы с VCL Delphi хоть на каком-то уровне. Особой целью задаваться не будем, напишем простейшее приложение, которое будет иметь окно и кнопку для закрытия. Запускаем Delphi 7.0 (предпочитаю пользоваться именно этим компилятором), выбираем File > New > Application. Появилась VCL форма, нам она нафиг не нужна, идем в меню View > Project Manager, запустилось окно менеджера проекта. Кликаем на плюсик под Project1.exe, выделяем Unit1 и смело жмем на кнопку Remove, расположенную чуть выше на панели менеджера. Подтверждаем удаление, и закрываем менеджер проекта. Все исчезло? не страшно, идите в меню Project > View Source, покажется окно проекта, самый важный элемент проекта В нем мы видим следующий код: Code program Project1; uses Forms; {$R *.res} begin Application.Initialize; Application.Run; end. Вы видите подключенный модуль VCL - Forms, затем в операторных скобках begin end происходит инициализация приложения и запуск (если скомпилировать и запустить, то приложение почти сразу же закроется, так как никаких функций сейчас оно не выполняет). Если вы попробуете скомпилировать данный проект сейчас (Project > Build Project1), вы получите файл размером чуть менее 400 кб (у меня 358 кб). Много? Очень много, скажу я вам, мы пришли сюда заниматься минимизацией и оптимизацией, а не ламерством страдать Поэтому возвращаемся в окно проекта и удалаяем все пережитки VCL и добавляем модуль, где хранятся функции Windows API и модуль, где хранятся константы сообщений. В итоге у нас должно получиться следующее: Code program Project1; uses Windows,Messages; begin end. Скомпилируйте приложение. Вы получите exe-файл размером 14 кб. И хотя наше приложение ничего не делает, но вы почуствовали разницу между VCL и WinAPI? Если нет, идем дальше. Если да... все равно идем дальше Теперь нам надо создать ресурс, в котором будут окно приложения и элементы, расположенные на нем. Я предпочитаю помещать визуальные элементы в ресурсы, а не создавать их динамически (это я на случай, если посыпятся вопросы профи), так как считаю этот вариант более стабильным (а с динамическим созданием контролов мы как нибудь познокомимся, может быть). В общем, в папке где сохранен проект (а я надеюсь что проект сохранен, если нет, то бегом сохраняйте - кнопочка Save All, сохраняйте каждый свой проект в отдельной папке!!!), создаем файл dialog.rc и открываем его в блокноте. Пишем в него следующее: Code MAIN_WINDOW DIALOG 86, 26, 192, 116 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Пример приложения на WinAPI" LANGUAGE LANG_RUSSIAN, 0x1 FONT 8, "MS SHELL DLG" { CONTROL "Программа демонстрирует простейшие возможности WinAPI", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 10, 12, 172, 32 CONTROL "Закрыть", 100, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 126, 88, 60, 14 } Теперь нам надо преобразовать файл rc в файл ресурса RES. Это делается с помощью консольной утилиты brcc32.exe, входящей в пакет Delphi. Я препочитаю сразу класть в папку с проектом bat-файл для автоматического создания ресурсов. Для этого создайте в папке с проектом файл run.bat и впишите в него следующее: Код:"D:\Program Files\Borland\Delphi7\bin\brcc32" dialog.rc Соответсвенно поставьте тот путь к Delphi, по которому она у вас установлена. Сохраните bat-файл и запустите его. Если вы все сделали правильно, у вас в папке с проектом должен появится файл dialog.RES, если не появился - перечитайте все вышеизложенное и проверьте правильность указания путей и имен файлов. Если все равно не появляется - стучите мне в аську, пишите на форум, постараюсь помочь разобраться с проблемой. Итак, файл ресурса создали, теперь его необходимо поместить в программу. Для этого впишем ресурс в код программы, в итоге у нас должно получиться: Code program Project1; uses Windows,Messages; {$R dialog.RES}//Подключаем ресурс диалогового окна begin end. Компилируем, если компилятор не выдает ошибок, идем дальше (если выдает - перечитайте все вышеизложенное и проверьте правильность своих действий). Теперь необходимо инициализировать и запустить приложение, грубо говоря - написать функцию, которая достает оконные ресурсы из приложения и создает окно, которое может обрабатывать простейшие события операционной системы и действия пользователя Сразу привожу листинг что у нас должно получиться: Code program Project1; uses Windows,Messages; {$R dialog.RES}//Подключаем ресурс диалогового окна //Функция, обрабатывающая все команды от элементов управления окна function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall; begin Result := False; case uMsg of //Здесь мы инициализируем диалоговое окно и можем писать что должно произойти при запуске WM_INITDIALOG:; // ничего не указываем //Обработка получаемых команд от ОС или пользователя WM_COMMAND: begin case LoWord(wp) of //При нажатии на кнопку с идентификатором 100 закрываем программу 100: EndDialog(hWin, 0); end; end; //При нажатии на кнопку "Х" в шапке программы закрываем приложение WM_DESTROY, WM_CLOSE: PostQuitMessage(0); end; end; begin //Открываем диалоговое окно MAIN_WINDOW (достаем окно из ресурсов) DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc); end. В коде программы я написал комментарии, если что-то остается неясным, ищите информацию по WinAPI. Немного пробежимся по тексту программы и я расскажу что программа делает. Программа создает окно и при нажатии на кнопку "Закрыть", которое имеет идентификатор ID=100 (смотрите файл dialog.rc), закрывает диалоговое окно и посылает приложению команду WM_CLOSE, в обработчике которой мы пишем PostQuitMessage(0) - сигнал о завершении работы приложения. На окне диалога помимо кнопки "Закрыть" я разместил еще текст в элементе STATIC (смотрите файл dialog.rc). Компилируем программу и запускаем. Если вы все сделали правильно, то компилятор не должен ругаться и в папке проекта должен появиться файл Project1.exe, при запуске которого вы увидите окно программы: Попробуйте нажать кнопку "Закрыть", приложение закроется (а вы что думали?) Теперь посмотрим размер файла Project1.exe, у меня он весит 14848 байт (15 кб). А теперь сравните с тем файлом программы, который был вначале при использовании VCL (358 кб) - 358/14 ~ 26. Выигрыш в 26 раз! Программа стала весить на 96% меньше! Если файл Project1.exe сжать каким-нибудь упаковщиком, например UPX, то программа и вовсе станет размером в 8 кб (у меня 8704 байт), выигрыш в 45 раз, программа стала весить на 98 % меньше, чем при использовании VCL. Вот такая арифметика. И это еще не предел (вопрос о том как сделать программу еще меньше в этой теме я рассматривать не буду). Вы еще не поняли всех прелестей WinAPI? Тогда мы идем к вам! Исходники прилагаю. Автор: Voyager
|